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