<section><title>Changes in 1.17.4 (released 04/30/2007)</title>
<ulist>
<item>The threshold for string length for procedure and function arguments has
been reduced to 4000.</item>
</ulist>
</section>


<section><title>Changes in 1.17.3 (released 03/08/2007)</title>
<ulist>
<item><lit>BLOB</lit> arguments for procedures and functions are always
passed as variables now.</item>
</ulist>
</section>


<section><title>Changes in 1.17.2 (released 03/07/2007)</title>
<ulist>
<item>Arguments for procedures and functions that are longer that 32000 characters
are passed as variables now (the threshold was 32768 before and didn't work).</item>
</ulist>
</section>


<section><title>Changes in 1.17.1 (released 03/02/2007)</title>
<ulist>
<item>Fix an inverted logic bug in <method>Record.fromdata</method> that surfaced
in unicode mode: <lit>BLOB</lit>s were treated as string and <lit>CLOB</lit>s
as binary data.</item>
</ulist>
</section>


<section><title>Changes in 1.17 (released 02/23/2007)</title>
<ulist>
<item>The <lit>readlobs</lit> and <lit>unicode</lit> parameters are now honored
when calling procedures and functions via <class>Procedure</class> and
<class>Function</class> objects.</item>
</ulist>
</section>


<section><title>Changes in 1.16 (released 02/21/2007)</title>
<ulist>
<item>A parameter <arg>unicode</arg> has been added to various constructors
and methods. This parameter can be used to get strings (i.e. <lit>VARCHAR2</lit>
and <lit>CLOB</lit>s) as <class>unicode</class> object instead of
<class>str</class> objects.</item>
</ulist>
</section>


<section><title>Changes in 1.15 (released 02/17/2007)</title>
<ulist>
<item>Fixed an output bug in <filename>oradiff.py</filename> when running
in full output mode.</item>
<item>A parameter <arg>readlobs</arg> has been added to various constructors
and methods that can be used to get small (or all) <class>LOB</class>s as
strings in cursor fetch calls.</item>
</ulist>
</section>


<section><title>Changes in 1.14 (released 02/01/2007)</title>
<ulist>
<item>A new method <method>iterprivileges</method> has been added to
<class>Connection</class>.</item>
<item>A script <filename>oragrant.py</filename> has been added for copying
privileges.</item>
</ulist>
</section>


<section><title>Changes in 1.13 (released 11/06/2006)</title>
<ulist>
<item>Two new methods (<method>itertables</method> and <method>iterfks</method>)
have been added to <class>Connection</class>. They yield all table definitions
or all foreign keys respectively.</item>
<item>A new method <method>isenabled</method> has been added to
<class>ForeignKey</class>.</item>
<item>A <method>__str__</method> method has been added to <class>Object</class>.</item>
<item>A bug in <filename>oramerge.py</filename> has been fixed: In certain
situations <filename>oramerge.py</filename> used merging actions that were
meant to be used for the preceeding object.</item>
</ulist>
</section>


<section><title>Changes in 1.12.2 (released 10/18/2006)</title>
<ulist>
<item>Fixed a bug that showed up when an index and a foreign key
of the same name existed.</item>
</ulist>
</section>


<section><title>Changes in 1.12.1 (released 09/19/2006)</title>
<ulist>
<item>Fixed a bug in <method>Index.__xattrs__</method>.</item>
</ulist>
</section>


<section><title>Changes in 1.12 (released 09/06/2006)</title>
<ulist>
<item><class>Function</class> objects are now callable too. They return
the return value and a <class>Record</class> containing the modified
input parameters.</item>
</ulist>
</section>


<section><title>Changes in 1.11.1 (released 08/29/2006)</title>
<ulist>
<item>Fixed a bug in <method>Column.modifyddl</method>.</item>
</ulist>
</section>


<section><title>Changes in 1.11 (released 08/22/2006)</title>
<ulist>
<item>The class <class>Column</class> has gained a few new methods:
<method>datatype</method>, <method>default</method>, <method>nullable</method>
and <method>comment</method>.</item>

<item>Calling a procedure will now raise a <class>SQLObjectNotFoundError</class>
error, if the procedure doesn't exist.</item>
</ulist>
</section>


<section><title>Changes in 1.10 (released 08/11/2006)</title>
<ulist>
<item>The classes <class>Proc</class> and <class>LLProc</class> have
been removed. The functionality of <class>Proc</class> has been merged
into <class>ProcedureDefinition</class> (with has been renamed to
<class>Procedure</class>). Information about the procedure arguments
is provided by the <method>iteraguments</method> method.</item>

<item>All other subclasses of <class>Definition</class> have been renamed
to remove the <z>Definition</z> for the name to reduce typing. (Methods
have been renamed accordingly too.</item>

<item><function>oramerge.main</function> and <function>oradiff.main</function>
now accept option arrays as arguments.</item>

<item><filename>oradiff.py</filename> has finally been fixed.</item>
</ulist>
</section>


<section><title>Changes in 1.9.4 (released 08/09/2006)</title>
<ulist>
<item>Fixed a bug in <filename>oradiff.py</filename>.</item>
</ulist>
</section>


<section><title>Changes in 1.9.3 (released 08/08/2006)</title>
<ulist>
<item>Fixed a bug in <filename>oramerge.py</filename>.</item>
</ulist>
</section>


<section><title>Changes in 1.9.2 (released 08/04/2006)</title>
<ulist>
<item>Fixed a bug in <method>TableDefinition.iterdefinitions</method>.</item>
</ulist>
</section>


<section><title>Changes in 1.9.1 (released 08/02/2006)</title>
<ulist>
<item>Fixed a bug in <filename>oracreate.py</filename>.</item>
</ulist>
</section>


<section><title>Changes in 1.9 (released 07/24/2006)</title>
<ulist>
<item>Dependencies involving <class>MaterializedViewDefinition</class>s and
<class>IndexDefinition</class>s generated by constraints work properly now,
so that iterating all definitions in create order really results in a
working &sql; script.</item>

<item>A method <method>table</method> has been added to <class>PKDefinition</class>,
<class>FKDefinition</class>, <class>UniqueDefinition</class> and
<class>IndexDefinition</class>. This method returns the <class>TableDefinition</class>
to object belongs to.</item>

<item>A method <method>pk</method> has been added to <class>FKDefinition</class>.
It returns the primary key that this foreign key references.</item>

<item>Indexes and constraints belonging to skipped tables are now skipped too
in <filename>oracreate.py</filename>.</item>

<item>Arguments other than <lit>sys.argv[1:]</lit> can now be passed to the
<filename>oracreate.py</filename> and <filename>oradrop.py</filename>
<function>main</function> functions.</item>

</ulist>
</section>


<section><title>Changes in 1.8.1 (released 07/17/2006)</title>
<ulist>
<item><module>ll.orasql</module> can now handle objects name that
are not in uppercase.</item>
</ulist>
</section>


<section><title>Changes in 1.8 (released 07/14/2006)</title>
<ulist>
<item><method>Connection.iterobjects</method> has been renamed to
<method>iterdefinitions</method>.</item>

<item>Each <class>Definition</class> subclass has a new classmethod
<method>iterdefinitions</method> that iterates through all definitions
of this type in a schema (or all schemas).</item>

<item>Each <class>Definition</class> subclass has new methods
<method>iterreferences</method> and <method>iterreferencedby</method> that
iterate through related definitions. The methods <method>iterreferencesall</method>
and <method>iterreferencedbyall</method> do this recursively. The method
<method>iterdependent</method> is gone now.</item>

<item>The method <method>iterschema</method> of <class>Connection</class>
now has an additional parameter <arg>schema</arg>. Passing <lit>"all"</lit>
for <arg>schema</arg> will give you statistics for the complete database
not just one schema.</item>

<item>A new definition class <class>MaterializedViewDefinition</class> has
been added that handles materialized views. Handling of create options is
rudimentary though. Patches are welcome.</item>

<item><class>TableDefinition</class> has a three new methods:
<method>ismview</method> returns whether the table is a materialized view;
<method>itercomments</method> iterates through comments and
<method>iterconstraints</method> iterates through primary keys, foreign keys
and unique constraints.</item>

<item>The method <method>getcursor</method> will now raise a <class>TypeError</class>
if it can't get a cursor.</item>
</ulist>
</section>


<section><title>Changes in 1.7.2 (released 07/05/2006)</title>
<ulist>
<item><lit>RAW</lit> fields in tables are now output properly in
<method>TableDefinition.createddl</method>.</item>

<item>A class <class>PackageBodyDefinition</class> has been added.
<filename>oracreate.py</filename> will output package body definitions
and <filename>oradrop.py</filename> will drop them.</item>
</ulist>
</section>


<section><title>Changes in 1.7.1 (released 07/04/2006)</title>
<ulist>
<item>Duplicate code in the scripts has been removed.</item>
<item>Fixed a bug in <filename>oramerge.py</filename>: If the source
to be diffed was long enough the call to <filename>diff3</filename> deadlocked.</item>
</ulist>
</section>


<section><title>Changes in 1.7 (released 06/29/2006)</title>
<ulist>
<item>The method <method>iterobjects</method> has been moved from
<class>Cursor</class> to <class>Connection</class>.</item>
<item>The method <method>itercolumns</method> has been moved from
<class>Cursor</class> to <class>TableDefinition</class>.</item>
<item><class>LLProc</class> now recognizes the <lit>c_out</lit>
parameter used by <module>ll.toxic</module> 0.8.</item>
<item>Support for positional arguments has been added for <class>Proc</class>
and <class>LLProc</class>. Error messages for calling procedures
have been enhanced.</item>
<item><class>SequenceDefinition</class> now has a new method
<method>createddlcopy</method> that returns code that copies the
sequence value. <filename>oracreate.py</filename> has a new
option <option>-s</option>/<option>--seqcopy</option> that
uses this feature.</item>
<item><module>setuptools</module> is now supported for installation.</item>
</ulist>
</section>


<section><title>Changes in 1.6 (released 04/26/2006)</title>
<ulist>
<item>Added a <class>SessionPool</class> (a subclass of <module>cx_Oracle</module>s
<class>SessionPool</class>) whose <method>acquire</method> method
returns <module>ll.orasql.Connection</module> objects.</item>
</ulist>
</section>


<section><title>Changes in 1.5 (released 04/05/2006)</title>
<ulist>
<item>Added a class <class>IndexDefinition</class> for indexes.
<filename>oracreate.py</filename> will now issue create statements
for indexes.</item>
</ulist>
</section>


<section><title>Changes in 1.4.3 (released 12/07/2005)</title>
<ulist>
<item>Fixed a bug with empty lines in procedure sources.</item>
<item>Remove spurious spaces at the start of procedure and function
definitions.</item>
</ulist>
</section>


<section><title>Changes in 1.4.2 (released 12/07/2005)</title>
<ulist>
<item>Fixed a bug that the DDL output of Java source.</item>
<item>Trailing whitespace in each line of procedures, functions etc.
is now stripped.</item>
</ulist>
</section>


<section><title>Changes in 1.4.1 (released 12/06/2005)</title>
<ulist>
<item>Fixed a bug that resulted in omitted field lengths.</item>
</ulist>
</section>


<section><title>Changes in 1.4 (released 12/05/2005)</title>
<ulist>
<item>The option <option>-m</option>/<option>--mode</option> has been dropped
from the script <filename>oramerge.py</filename>.</item>
<item>A new class <class>ColumnDefinition</class> has been added to
<module>ll.orasql</module>. The <class>Cursor</class> class has a new method
<method>itercolumns</method> that iterates the <class>ColumnDefinition</class>s
of a table.</item>
<item><filename>oramerge.py</filename> now doesn't output a merged
<lit>create table</lit> statement, but the appropriate <lit>alter table</lit>
statements.</item>
</ulist>
</section>


<section><title>Changes in 1.3 (released 11/24/2005)</title>
<ulist>
<item>Added an option <option>-i</option> to <filename>oracreate.py</filename>
and <filename>oradrop.py</filename> to ignore errors.</item>
<item>The argument <arg>all</arg> of the cursor method <method>iterobjects</method>
is now named <arg>schema</arg> and may have three values: <lit>"own"</lit>,
<lit>"dep"</lit> and <lit>"all"</lit>.</item>
<item>Added an script <filename>oramerge.py</filename> that does a three
way merge of three database schemas and outputs the resulting script.</item>
<item>DB links are now copied over in <class>SynonymDefinition</class>s.</item>
</ulist>
</section>


<section><title>Changes in 1.2 (released 10/24/2005)</title>
<ulist>
<item>Added a argument to <method>createddl</method> and <method>dropddl</method>
to specify if terminated or unterminated DDL is wanted (i.e. add <lit>;</lit> or
<lit>/</lit> or not).</item>

<item><class>CommentsDefinition</class> has been renamed to <class>CommentDefinition</class>
and holds the comment for one field only.</item>

<item><class>JavaSourceDefinition</class> has been added.</item>

<item>The scripts <filename>oracreate.py</filename>, <filename>oradrop.py</filename>
and <filename>oradiff.py</filename> now skip objects with <lit>"$"</lit> in their
name by default. This can be changed with the <option>-k</option> option (but
this will lead to unexecutable scripts).</item>

<item><filename>oradiff.py</filename> has a new options <option>-b</option>:
This allows you to specify how whitespace should be treated.</item>

<item>Added an option <option>-x</option> to <filename>oracreate.py</filename> to
make it possible to directly execute the DDL in another database.</item>

<item>Fixed a bug in <class>SequenceDefinition</class> when the <lit>CACHE</lit>
field was <lit>0</lit>.</item>
</ulist>

</section>


<section><title>Changes in 1.1 (released 10/20/2005)</title>
<ulist>
<item>A script <filename>oradiff.py</filename> has been added which can be
used for diffing Oracle schemas.</item>

<item>Definition classes now have two new methods <method>cdate</method> and
<method>udate</method> that give the creation and modification time of the
schema object (if available).</item>

<item>A <lit>"flat"</lit> iteration mode has been added to
<method>Cursor.iterobjects</method> that returns objects unordered.</item>

<item><class>Connection</class> has a new method <method>connectstring</method>.</item>

<item>A class <class>LibraryDefinition</class> has been added.</item>

<item><method>CommentsDefinition.createddl</method> returns <lit>""</lit>
instead of <lit>"\n"</lit> now if there are no comments.</item>

<item><class>SQLObjectNotfoundError</class> has been renamed to
<class>SQLObjectNotFoundError</class>.</item>
</ulist>
</section>


<section><title>Changes in 1.0 (released 10/13/2005)</title>
<ulist>
<item><module>ll.orasql</module> requires version 1.0 of the core package now.</item>

<item>A new generator method <function>iterobjects</function> has been added
to the <class>Cursor</class> class. This generator returns <z>definition objects</z>
for all the objects in a schema in topological order (i.e. if the name of an
object (e.g. a table) is generated it will only depend on objects whose name has
been yielded before). &sql; for recreating and deleting these &sql; objects 
can be generated from the definition objects.</item>

<item>Two scripts (<filename>oracreate.py</filename> and
<filename>oradrop.py</filename>) have been added, that create &sql; scripts
for recreating or deleting the content of an Oracle schema.</item>
</ulist>
</section>


<section><title>Changes in 0.7 (released 08/09/2005)</title>
<ulist>
<item>The commands generated by <function>iterdrop</function> no longer have
a terminating <lit>;</lit>, as this seems to confuse Oracle/cx_Oracle.</item>
</ulist>
</section>


<section><title>Changes in 0.6 (released 06/20/2005)</title>
<ulist>
<item>Two new functions have been added: <function>iterdrop</function> is
a generator that yields information about how to clear the schema (i.e. drop
all table, sequences, etc.). <function>itercreate</function> yields information
about how to recreate a schema.</item>
</ulist>
</section>


<section><title>Changes in 0.5 (released 06/07/2005)</title>
<ulist>
<item>Date values are now supported as <lit>OUT</lit> parameters.</item>
</ulist>
</section>


<section><title>Changes in 0.4.1 (released 03/22/2005)</title>
<ulist>
<item>Added a note about the package init file to the installation
documentation.</item>
</ulist>
</section>


<section><title>Changes in 0.4 (released 01/03/2005)</title>
<ulist>
<item><module>ll.orasql</module> now requires <app>ll-core</app>.</item>
<item>Procedures can now be called with string arguments longer that 32768
characters. In this case the argument will be converted to a variable before
the call. The procedure argument must be a <lit>CLOB</lit> in this case.</item>
<item>Creating <class>Record</class> instances from database data is now done
by the class method <method>Record.fromdata</method>. This means it's now
possible to use any other class as long as it provides this method.</item>
</ulist>
</section>


<section><title>Changes in 0.3 (released 12/09/2004)</title>
<ulist>
<item><module>ll.orasql</module> requires <app>cx_Oracle 4.1</app> now.</item>
</ulist>
</section>


<section><title>Changes in 0.2.1 (released 09/09/2004)</title>
<ulist>
<item>Fixed a regression bug in <method>Proc._calcrealargs</method> as
cursors will now always return <class>Record</class> objects.</item>
</ulist>
</section>


<section><title>Changes in 0.2 (released 09/08/2004)</title>
<ulist>
<item>Now generating <class>Record</class> object is done automatically
in a subclass of <class>cx_Oracle.Cursor</class>. So now it's possible
to use <module>ll.orasql</module> as an extended <module>cx_Oracle</module>.</item>
</ulist>
</section>


<section><title>Changes in 0.1 (released 07/15/2004)</title>
<ulist>
<item>Initial release.</item>
</ulist>
</section>
