File contents
CHANGELOG:
0.1 August 02, 2000 First tarball released
Alpha 1 Jan 2001
February 05, 2001 Added SQLT_AFC handler
February 11, 2001 -- SPARC fixes (describe still does not
get schema or object name, though)
Alpha 2 Bug fixes (tweaks only)
Alpha 3 March 05, 2001 (mostly tweaks)
Change ZOracleDA to not use method calls to connect()
Stored functions are marginally testable, stored procs
are still not working
Alpha 4 March 14, 2001
Stored procedures! IN and OUT have been tested, and
IN OUT should work as well, although my test procedure
doesnt do anything interesting. Still untested is
returning REF CURSOR.
Also changed is DCOracle's executemany() to use the
BindingArray. While this works -- it is flakey with
more than 8-10 elements. This seems to be in Oracle,
as the problem shifts and I cannot see it in the
trace log or by pausing with gdb and examining the inputs
directly -- however, Oracle will pickup NULL inputs for
random values. An 8 element array bind will be about
three times faster than 8 single inserts by my testing.
Still not properly working -- number precision does not
seem to be reported over SQL*NET -- always comes back 0.
Is this a bug with SQL*NET? Local db has precision.
Alpha 5 March 21, 2001
Stored procedure fixes
Debugging enhancements via DCO2TRACELOG, DCO2TRACEDUMP,
DCO2TRACESIZE, DCO2TRACEFLAGS environment variables.
Added SQLT_LNG and SQLT_BIN handlers.
Andreas Jung is also assisting with the testing.
Alpha 6 April 6, 2001
o Moved the Cursor describe function out of _execute
so it can be called by type conversion for result cursors.
o Changed execute() to NoticeOCIError on OCI_SUCCESS_WITH_INFO
but continue as if OCI_SUCCESS.
o Nested tables work e.g. SELECT ENAME, CURSOR(SELECT ENAME
FROM EMP WHERE MGR=7908) FROM EMP WHERE EMPNO=7908), each
CURSOR returned is a new DCOracle2 cursor from the existing
service context.
o None is represented to Oracle as a NULL SQLT_STR variable.
o Added standard error hierarchy for API2 to dco2 and DCOracle2
o Added type objects for type comparison
o Added date & time coersion objects
o Added trim() function to LobLocators
April 10, 2001
o Wrap LOB objects in ZOracleDA so permissions work properly in
Zope 2.2+
May 13, 2001
o Fix messages on fetch after execute with no result set to
be more meaningful (Oracle error does not suggest
proper action). Also, describe after execute w/o results will
be None rather than [].
o dco2 prepare and execute will return the statement type code,
e.g. 1 for select, 4 for insert, etc. DCOracle2 will return the
type code after execute() and excutemany(). [Docs not yet
updated]
Beta 1 June 4, 2001
o Single element stored procedure input works
o Cleaned up cycle in stored procedures
o Change cursor.fetchone() to return None on end of results
rather than raise IndexError
o Changed python-level type coercion to use TypeCoercion()
o Various bugfixes
o Added __doc__ strings to stored procedure objects
o Took out OCI_ERROR messages to stdout on context creation
o Added setStatic to BindingArray objects, set as default for
cursor.executemany()
o Batch results in cursor.executemany()
o Added backward compat mode to execute()
o Added backward compat dbiRaw (no backward compat dbiDate)
Beta 2 June 7, 2001
o Fix ZOracleDA to not retrieve results on non-select
o Add Cursor.close() to dco2 and fix DCOracle2 to call to
break resultset/cursor cycle on cursor close. Implicit
cursor close still has refcount loop.
o Change dco2 Cursor_fetch to deallocate results at end of
fetch rather than at beginning of next fetch, helping to
prevent result/cursor cycle requiring explicit Cursor.close()
o Defer connection implicit cursor creation to avoid causing
connection/cursor cycle (and thus requiring explicit
connection.close())
o Make 'procedure' object allocation lazy to defer
cursor/procedure cycle (thus requiring explicit close() to
break the cycle)
o cursor.fetchmany() and cursor.fetchall() will return None
instead of [] if no results remain.
o SPARC byteorder & size fixes for stored procedure (dco2 schema
describe tables)
Beta 3 June 11, 2001
o Fixed IN OUT bind widths (reset to max width for OUT)
o Added ORACLE8i define to NT build for SP support
o Added Z Oracle Stored Procedures to ZOracleDA
o Added In/Out bind conversion hooks in DCOracle2
o Added In/out bind conversion for SQLT_NUM (converts to
string on input, converts to float, long, or int on output)
o Set __allow_access_to_unprotected_subobjects__ on Cursor
object in DCOracle2 to allow Zope to manipulate returned
curors. (Will wrap in cursors in ZOracleDA in the future).
o IN / OUT cursor binds will create a new cursor if the input
isn't an instance type (assist for ZOracleDA)
Beta 4 June xx, 2001 (released source only)
o SPARC precision detection change
o Backwards compatible DCOracle prepare()
o Number conversion correction
o Defer creation of connction cursor, remove class default of
None for the connection cursor (getObjects now will succeed
if no internal cursor exists)
o Bind Long integer inputs as strings vs ints, works
properly for both Python 1.5.2 and 2.1 with conditional
compilation
o Included modified DCOracleStorage
Beta 5 August 7, 2001
o Added TM/transaction awareness to SP.py re: Monty Taylor
o Changed numeric conversion for stored procedures -- SP's
will now properly submit numeric fields as SQLT_STR, and
convert back to python int/float/long upon return.
o Merged in a LONG correction off-by-one and initializer bug
re: J. Cone
o Reordered deallocation of LOB constructs to release LOB
locator before forgetting the service context.
o Changed packaging to be solitary package with pre-built
binaries for different platforms in the "binaries" directory.
Release 1 October 25, 2001
o Added name-awareness to ZOracleDA so it will work as either
ZOracleDA or DCO2 for co-existence with DCOracle
o Set prefetch for all statements, default 200 rows & 1MB storage
o Change default fetch size from 1 row to 200 rows (internal
communication between DCOracle2 and dco2)
o rowcount attribute is set after execute() and fetch(), although
for fetch operations, it means rows RETRIEVED by the C layer,
not total available rows.
o Fix non-package procedure definitions (where procedure or
function name is doubled up).
o Fix a STUPID duplicate object allocation in ResultSet_alloc
which causes a memory leak
o Change default tracing to disable tracing, which substantially
speeds up the code. Tracing is enabled if any trace environment
variable is set.
o Perform explicit cursor/connection destruction in db.py for
ZOracleDA
o Added isOpen() methods to DCOracle2 Connection and Cursor
objects (which check internal state only, not the actual
database availablility)
o Changed ZOracleDA to promote OracleDate objects to DateTime
objects in Zope (based on string representation).
o Fixed some NULL handling bugs reported by Chistopher Jenkins
which showed up with date ops -- a subsequent BIND (rexecuting
a previously prepared statement) with a None/NULL would have
been bound to a string type (dty 5) now will preserve prior dty.
Also, DCOracle2 executemany() scans for NULL columns and forces
reprepares when a column contains all NULLs to flush out cached
bind types (and sets the statement for a reprepare NEXT time
through as well since the NULLs will snap to dty 5 on prepare,
which is wrong when the real type comes around). Also skips
None for type determination.
o Fixed a bug in DCOracleStorage reported by Rob Foster due
to a conversion artifact from the DCOracle to DCOracle2
conversion. UndoLog was not being called properly, and
was raising a __getitem__ attribute error.
o Added skip= parameters to cursor fetchone, fetchmany, and
fetchall. The skip parameter determines how many rows to
be discarded before returning results. This is significantly
faster than converting unwanted records into python object for
later discarding.
o Added Version() information on DCOracle2 connection objects
to return a dictionary of version strings.
o Extended ZOracleDA debug panel on connection to include
connection Version() identification and not raise an error
if debug tracing is not active.
o Corrected case where cursor execute() did not release the
Python interpreter lock.
o Added buildDefs to dco2 module dictionary to see the defines
detected by the testora script. Detection of Oracle9i
also implies Oracle8i.
o Added LOB length to wrapped ZOracleDA LOB objects (whoops!)
Thanks to Peter Brandstrom for pointing that out. Peter
also pointed out that the ZOracleDA lob documentation is
nonexistant.
Release 1.1
o Return None on ALL result fetches if they are 0 length,
regardless of the type (may be bad). Uwe Hoffmann found
a definate problem with DATEs, and INTs seem to be suffering
as well.
o Added thread logging
o Added per-cursor and per-LOB error handles, so routines
don't get the wrong error message because they used the
connection's error handle
o Tweaked binary installer to only care about minor level
of python 2.1
o Fixed tracing bug where a trace entry could dereference a
NULL pointer.
o Initialize connection in Object mode
o Made TABLE OF support work with stored procs, input and
output
o Made SYNONYMs work with stored procedures for Mike Hewiett
o Made isdst flag for creation of OracleDates default to
unknown, rather than no DST
o Gave OracleDates a __cmp__ method so they can be compared
Release 1.2
o Fix named binds to be reprepared on every statement so
you can slip NULLS in on non-string columns (Uwe Hoffman)
Collector # 46
o Make LobLocator.read() of a zero length lob return a zero
length string without actually calling OCILobRead
(Peter Brandstrom) Collector # 45
o Better handling of default arguments to stored procedures.
Default args passed in positionally as None (or omitted if
at end of argument list) will be skipped, and parameter
construction will shift to named parameter style (parm => value)
syntax rather than positional for procedure invocation for
all subsequent parameters. NOTE: This change introduces
an ambiguity for None/NULL for stored procedure invocation.
If the stored proc argument has a default, None means the
default in this case rather than NULL. Passing in the
None argument by name rather than positionally to the stored
procedure will use NULL always e.g. proc(None) vs
proc(name=None) where name has a default. Collector # 48
o Change Z Oracle Stored Procedures so that arguments to
stored procedures can be acquired automatically from
REQUEST, or REQUEST and the context. The acquiring argument
mode is manageable via the Edit tab on the procedure. The
default mode is "Never" which is the old behavior, and requires
arguments to be explicitly passed. Collector # 47
o Add code to support CLOB and BLOB OUT variables from stored
procedures. Collector # 40
o Make Z Oracle Stored Procedure results go thru the same LOB/Date
conversion for ZSQL methods in ZOracleDA
o Don't recreate DatabaseError or ProgrammingError objects in
C code, so that when Zope reloads the module they don't get
recreated (causes problems with error handling, because the
IDs of the error classes change)
o Add a user-level procedure browser to stored procedure
edit screen.
o Change ROWID support -- ROWIDs much better supported now.
ROWID comparison test is broken though (all ROWIDs compare
equal). The following will now work: selecting a ROWID from
a table, and then selecting all values where the ROWID is
the rowid returned from the first select.
o Make stored procedures returning a REF_CURSOR perform a
describe() on the cursor
o Added Transaction ID support [preliminary, don't use!]
o Added public synonym enablement for the Describe call
thanks to Uwe Hoffman (Collector #58)
o Change CONVERTOUTF(SQLT_DAT) to use unsigned char for
data manipulation (Collector #59)
o Cast LONGs to string for executemany() (Collector #64)
so they do not overflow the BindingArray buffer.
Post 1.2 CVS
o Add Uwe Hoffman's long fetch status code patch
o Fix LOB copy routine to set the indicator to 0, because
it was allocated as -1 (NULL) and that turns lobs into
temporary LOBs (Collector #72)
o Fix Date creation routine to take all arguments, rather
than just timestamps; only simple error checking is done
on date ranges, negative dates are not allowed, month and
day must be 1-12 and 1-31 if year is > 0 etc. Computation
of "valid" dates (ie leap year, end of month computation)
is not done. (Collector #74)
o Add __iter__ and next() support on cursors, from Gene Cash.
Raises a IndexError on pythons under 2.2 when next() is called
and no more results are in the result set.
o Fix coerce function in OracleDates to Py_INCREF arg 2 when
successful coercion occurs, arg 2 is otherwise untouched.
o Date conversion to int will use time only for dates with
a year of zero (presumed to be just times)
o Pad binding arrays with an extra record, just to be safe
o Change SP.py to use its own version of TM instead of
Shared.DC.ZRDB.TM, because the other version stores volatile
attributes in nonvolatile names.
o Change numeric conversion to use OCINumber calls vs strings
The define NATIVE_NUMERIC controls use of the OCI numeric
calls.
o Change scaling for cases when scale and precision are 0
or scale = 0 and precision = 38. In these two cases, the
result is presumed to be an INT. The STRICT_SCALE define
controls this behavior (if STRICT_SCALE is 1, then the
old behavior of scale=0 precision=0 will use floats, and
scale=0 precision=38 will use longs).
o Add BFILE and CFILE support to LOBs, with getFileName and
setFileName functions to associate external lobs, and
fileExists() to determine if the LOB external file exists.
o Make the Date output conversion appropriately bias for local
time for doing its integer computation. Note that the
function DateFromTicks() presumes that ticks is in GMT; as
such, the date generated will NOT match local time (well
except in the UK, half the year).
o Add NativeNumeric detection for LOB parameter binding of
type SQLT_NUM on OUT parameters; make it use SQLT_VNU for
new native numeric support if its available.
Desired Features Not Yet Implemented:
o Named parameters to executemany()
o General cleanup of the python-level code
o Run time trace control? (Easy enough to implement)
o Convert to new-style product initialization