===============================================================================
01/25/2005 - jTDS 1.0 released
===============================================================================

Changes from jTDS 0.9.1
=======================

01/25/2005 - Alin Sinpalean
 o Updated the HTML content and incremented the version number in both the docs
   and the code.

01/24/2005 - Alin Sinpalean
 o Minor clean-up in tests and code.

01/24/2005 - Mike Hutchinson
 o Fixed bug [1107105] Sybase updateable cursor error (a null pointer exception
   is thrown in CachedResultSet during an update).
 o Amended the logic for downgrading the preparesql property values in
   ConnectionJDBC2 as it was possible to select invalid options for Sybase and
   SQL 6.5.
 o Prevent JtdsPreparedStatement.setUnicodeStream from throwing an array index
   exception when the length of the supplied stream exceeded the declared
   length.
 o When using preparesql=0, the driver would send zero length byte arrays as
   null. This is wrong as the column should have a zero length non null value;
   however, Sybase/SQL 6.5 do not permit zero length binary columns so the
   driver has to output a single byte value instead. Amended
   Support.embedData() to fix this problem.
 o Related to the point above, TdsData.writeParam and writeTds5Param do the
   wrong thing and output a zero length byte value as a null. Amended TdsData
   to fix this problem.
 o It is possible for Support.embedData to output a decimal literal that
   exceeds the precision of the server. Amended embedData to truncate value
   string.
 o In TdsCore.executeSQL the inbatch flag is reset prematurely causing batched
   prepared statements to fail to substitute parameters correctly. Amended
   executeSQL to ensure that flag is reset after last packet sent.

01/21/2005 - Alin Sinpalean
 o Changed the home page title to "jTDS JDBC Driver".

01/17/2005 - Alin Sinpalean
 o Updated typemap.html to reflect the mapping of IMAGE to BLOB and TEXT/NTEXT
   to CLOB.
 o Added BLOB and CLOB information to JtdsDatabaseMetaData.supportsConvert().

01/14/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1101251] SSL Connection Problem.
 o Added README.SSL to the build, updated FAQ and feature matrix.
 o Added "ssl" property to the DataSource.

01/13/2005 - Alin Sinpalean
 o Added readme for SSL.
 o Added logging to MSSqlServerInfo if an exception occurs.

01/10/2005 - Alin Sinpalean
 o Optimization in Support.substituteParamMarkers(): a StringBuffer is used for
   converting parameter numbers to strings, in order to avoid unnecessary
   object creation.
 o Corrected a problem in TdsCore where the inBatch flag was set incorrectly
   causing sp_executesql to be used for all parameterized queries.
 o Added a specific error message for the case when an output parameter value
   is accessed without registerOutParameter() being called first.

01/05/2005 - Alin Sinpalean
 o Applied patch [1096296] DatabaseMetaData.getTypeInfo() ordering, submitted
   by David Eaves.
 o Applied Mike's fix to bug [1096086] Zero length streams generate null
   values.

01/04/2005 - Alin Sinpalean
 o Applied patch [1089891] Adding SSL, from Rob Worsnop. Wasn't able to test
   whether SSL really works (because I was not able to configure SQL Server to
   handle it) but with a few minor changes at least the old functionality is
   not affected.
 o Applied patch [1095057] Positioned updates and improved Sybase cursors.
 o Applied Mike's fix to bug [1094621] Decimal conversion error.
 o Some performance improvements.

12/21/2004 - Alin Sinpalean
 o Included the SSO patch in the build.

12/20/2004 - Alin Sinpalean
 o Fixed bug [1086477] RETURN_GENERATED_KEYS on select returns 1 row.
 o Applied patch [1088293] Simplified multi threaded execution with a few minor
   corrections and modifications (including optimized, single request, batch
   updating).
 o DDL statements no longer return update counts. This should make jTDS more
   compatible with other drivers and the spec.

12/19/2004 - Alin Sinpalean
 o Fixed bug [1082986] prepareSQL=3 Does Not Function (caused by the separation
   of input and output values).
 o Applied Mike's fix for bug [1086494] DatabaseMetaData.getProcedureColumns
   broken on Sybase.
 o Fixed bug [1087057] Connection is closed during XA Transaction. Also added
   check for error severity: if greater than or equal to 20 the Connection is
   closed (because the server will close the connection after the error).

12/17/2004 - Alin Sinpalean
 o Applied, with some minor changes and corrections, patch [1086173] Windows
   Local Named Pipe Support. Thanks go to Stardog33.
 o Fixed failure of JtdsDataSourceUnitTest.testNoUser() with a runtime error
   caused by inability to load the ntlmauth DLL.
 o Added one more test for SharedSocket synchronization, only with RPC
   requests. Still not able to reproduce the locking read.

12/16/2004 - Alin Sinpalean
 o Possible fix for bug [1086156] Hang in driver socketRead under load. Could
   not actually reproduce the exact behavior but found other errors caused by
   incomplete synchronization on SharedSocket.
 o Fixed a bug that was causing setSavepoint() to fail when no statements to
   actually start a transaction were executed before.

12/14/2004 - Alin Sinpalean
 o Implemented fetching of row blocks with cursor ResultSets, controllable
   through setFetchSize(). As part of this, also implemented support for
   sending more than one request in one packet.
 o Applied Mike's update to patch [1037237] Windows Single Sign On in jTDS.

12/13/2004 - Alin Sinpalean
 o Applied patch [1037237] Windows Single Sign On in jTDS. Thanks go to
   Magendran Sathaiah and Mike Hutchinson for the original patch and Java code
   rewrite, respectively.

12/09/2004 - Alin Sinpalean
 o Added some tests to verify the behavior of sp_cursorfetch with fetch sizes
   greater than 1.
 o Added code to ensure scroll sensitive ResultSet rows are reloaded after
   updated (delete just marks the row as deleted, while insert adds a row at
   the end of the ResultSet).
 o Fixed some cursor ResultSet issues caused by invalid suppositions considered
   when optimizing (i.e. that updating a row will always delete the current row
   and create a new one at the end of the ResultSet). This will affect update
   performance (by making an additional request) but it is necessary to ensure
   correctness.
 o Updated DatabaseMetaData boolean getters related to the capabilities of
   detecting updates/inserts/deletes (only deletes can in fact be detected on
   SQL Server).

12/08/2004 - Alin Sinpalean
 o Combined connection properties setup in the ConnectionJDBC2 constructor with
   the SELECT @@MAX_PRECISION query into a single request, reducing login
   overhead to only a single request/response.

===============================================================================
12/08/2004 - jTDS 0.9.1 released
===============================================================================

Changes from jTDS 0.9
=====================

12/08/2004 - Alin Sinpalean
 o Updated the index.html with support information and added a description for
   the xaEmulation parameter in the FAQ.
 o Updated version number to 0.9.1 in code and documentation.

12/07/2004 - Alin Sinpalean
 o Updated the build files to create a binary distribution package containing
   the readme, license, html documentation, XA DLL and SQL as well as the jar,
   instead of the plain jar as it was before.
 o Updated README and README.XA.
 o Corrected bug [1080659] ParamInfo throws NullPointerException.
 o Corrected loading of Charsets.properties under a J2EE environment.

12/06/2004 - Alin Sinpalean
 o Minor code cleanup using FindBugs.

12/05/2004 - Alin Sinpalean
 o Applied Mike's fix for bug [1078927] Callable statement fails (callable
   statements with both literal parameters and parameter markers failed to
   execute).

12/03/2004 - Alin Sinpalean
 o Corrected bug [1078325] Multithreaded prepared statement errors (or at least
   I sure do hope so). The problem seems to have been the fact that preparing
   a statement and executing it was not a single, atomic operation and a
   rollback() could occur between the two basically "unpreparing" the
   statement. Also synchronized some methods in ConnectionJDBC2 that looked
   like they needed some sync.
 o Corrected some exception error messages that contained incorrect hexadecimal
   values.
 o Corrected an issue in SQLParser that prevented CallableStatements from
   working properly with procedures containing semicolons in their name (e.g.
   "test;1").
 o Modified BlobImpl.getBytes() and ClobImpl.getString() to return as much data
   as available instead of throwing an SQLException if the length parameter is
   too big (this is my understanding of the API documentation).
 o Removed ColData from CVS (forgot to do it when applying the patch).
 o Applied Mike's patch [1077886] XA Emulation mode.

12/02/2004 - Alin Sinpalean
 o Added a unit test (and made a couple of minor fixes) for column collation
   support. Seems to work fine now.
 o Fixed TimestampTest.testWriteDate() to actually test whether dates are
   written correctly (i.e. w/o their time component) into the DB.

12/01/2004 - Alin Sinpalean
 o Applied patch [1076337] Elimination of ColData class. Thanks a lot, Mike for
   all the effort!
 o Applied patch [1076383] ResultSetMetaData for more complex statements for
   SQL Server.

11/30/2004 - Alin Sinpalean
 o Corrected bug [1075977] setObject() causes SQLException.

11/29/2004 - Alin Sinpalean
 o Fixed some NPEs caused by the new per column collation support.
 o Applied Mike's fix for [1074356] TDS 4/5 Login fails with latest CVS code.
 o Applied Mike's fix for [1074096] Incorrect data type determine on dataset
   meta data.
 o Implemented support for reading character data using per column collations
   for SQL Server 2000.

11/26/2004 - Alin Sinpalean
 o Corrected a bug which was causing Statement.setMaxRows() to not work with
   cursor-based ResultSets.

11/24/2004 - Alin Sinpalean
 o Extracted getConnection(callerReference) out of BlobImpl and ClobImpl and
   moved it to Support.
 o Created the CharsetInfo class to hold both information about a character set
   (non-static fields) and provide support for loading and retrieving character
   sets (static fields and methods; the logic was moved from Support).
 o Added comments to highlight possible problem areas with multi-byte character
   sets.
 o Started adding support for SQL Server 2000 per column collations.
 o Other minor cleanups.

11/23/2004 - Alin Sinpalean
 o Corrected bug [1071397] Error in prepared statement (parameters in outer
   join escapes are not recognized).

11/19/2004 - Alin Sinpalean
 o Replaced the ColData copy constructor with clone().
 o Added tests to ensure Blob.getBytes(0, length) and Clob.getSubString(0,
   length) fail.

11/18/2004 - Alin Sinpalean
 o More performance improvements: instead of creating new ParamInfo instances
   for each sp_XXX call, the same objects are reused both for fixed parameters
   (optype, fetchtype etc.) and updated column values; also, for addBatch() the
   ParamInfo copy constructor was replaced with clone().
 o Tweaked initial StringBuffer sizes to prevent reallocation as much as
   possible.
 o Corrected a bug that was causing Date values to be inserted just like
   Timestamps (i.e. including the time component).

11/17/2004 - Alin Sinpalean
 o Tiny performance tweaks.
 o Added jta.jar to lib folder to ensure compilation works under Java 1.3.
 o Corrected a problem in ReaderOutputStream that was causing read(byte[]) to
   always return the size of the byte array even if less data was read.
 o Fixed a problem with absolute(-1) (the row position was incorrectly
   updated).
 o Improved performance of MSCursorResultSet, by replacing sp_cursor FETCH_INFO
   calls with simple operations mimicking the behavior of SQL Server
   (incrementing the row count on INSERT and UPDATE).
 o Implemented support for ResultSet.insertRow() when no column is updated
   (i.e. inserting default values) in MSCursorResultSet.
 o Added charsets GB2312 and GBK as aliases for MS936.
 o Corrected bug [1067224] getPrimaryKeys does not return PK_NAME column.

11/15/2004 - Mike Hutchinson
 o Refactored XA support so that the driver will run under JRE 1.3 without
   requiring jta.jar to be available.
 o Revised JTdsXA.DLL to make it more compatible with older versions of MSDTC.
 o Changed XA support so that exception is thrown if not used with SQL 2000.
 o Use of XA connection forces prepareSQL=2 to prevent problems with temporary
   stored procedures.
 o Fixed 'bug' 1062671 SQL Parser unable to parse {ts ?}.
 o Fixed bug 1047330 prep statement with > 2100 params fails!
 o Modified callable statement parameters so that IN and OUT values are separated
   which makes jTDS more compatible with other drivers.
 o Added additional constructors for ParamInfo to streamline use of parameters in
   the driver.
 o Replaced the DummyResultSet class with CachedResultSet.
 o Additional tests in CallableStatementTest, GenKeyTest, PreparedStatementTest.
 o Added additional html page to describe jTDS data type mapping.

11/15/2004 - Alin Sinpalean
 o Remapped TEXT/NTEXT to BLOB and IMAGE to CLOB in TdsData.types.
 o Partially applied patch [1065036] Problems with connection pooling and jTDS.
 o Cleaned up default value assignment to URL parameters, moving everything to
   DefaultProperties and replaced all property key literals with constants.
 o Corrected bug [1062395] Empty (but not null) blobs should return byte[0].
 o Applied Mike's fix for bug [1062549] Build fails under java 1.3.
 o Corrected bug [1062198] SecurityException not caught in class
   ConnectionJDBC2 (fix by Andreas Mross - amross).

11/10/2004 - David Kilzer
 o Fixed case of 'props.tcpnodelay' in JtdsDataSource.getConnection() (two
   unit tests were failing).
 o Added test for 'tcpNoDelay' property to DefaultPropertiesTestLibrary.

11/08/2004 - Brian Heineman
 o Added tcpNoDelay driver property; default is true.

11/05/2004 - Alin Sinpalean
 o Applied Mike's fix for bug [1060466] SQL Executed twice.
 o Applied Mike's fix for bug [1059916] Whitespace needed in preparedStatement.
 o Tiny fix in XaTest to avoid deadlocks in case an SQLException is thrown.

11/03/2004 - Alin Sinpalean
 o Updated JtdsDatabaseMetaData.getProcedures() to only cut off the ";" at the
   end of the procedure name for the first procedure (i.e. if it's ";1").

11/01/2004 - Alin Sinpalean
 o Corrected bug [1057237] Protocol Exception processing TDS_COLINFO packets.

10/27/2004 - Alin Sinpalean
 o Ran the FindBugs tool (http://findbugs.sourceforge.net) on the jTDS code
   base with no major results. Most signalled problems were either in the test
   suite or minor suggestions on the driver itself. Applied all suggestions
   that made sense.
 o Applied Mike's patch [1054878] Improved meta data. In addition to metadata
   improvements, the patch fixes a number of bugs, including [1049645]
   DatabaseMetaData getProcedures names have semicolon, [1019707]
   metaData.getProcedures has missing 8th column on Sybase and [1043569]
   Handling of unicode data when inserting into a TEXT field (not totally sure
   about the last one, though).

10/26/2004 - Alin Sinpalean
 o Reviewed and cleaned up Brian's latest statement cache update.

10/25/2004 - Brian Heineman
 o Created FastStatementCache for users with a limited number of unique
   prepared statements who want the fastest performance possible.
 o Added maxStatements property to control how many simultaneous statements the
   connection keeps open.
 o Corrected bug when dropping procedures; the logic for DROP PROC and
   sp_unprepare was reversed.
 o Reduced overhead associated with latching.  The connection now establishes a
   NonCachingStatementCache (yes, it is an oxymoron) when maxStatements is 0 and
   a FastStatementCache when maxStatements is Integer.MAX_VALUE.  This prevents
   the need for the latching methods to check the statement size each time.
 o These changes address RFE [920825] and bug [1019694].

10/25/2004 - Alin Sinpalean
 o Applied Mike's fix for bug [1052942] Error processing JDBC call escape.

10/21/2004 - Alin Sinpalean
 o Altered the interface of Brian's StatementCache interface to correctly
   handle both usage counts (searching by SQL string) and searching by key.
   Still need to do the implementation, though.
 o One more minor change for bug [1051747] Array out of bounds Exception in
   ResultSetMetaData (outputting the actual column index in the exception text
   rather than the column count).
 o JtdsDataSourceUnitTest.Test_JtdsDataSource_getConnection.testNormal() now
   uses the new properties in connection.properties to check if connecting
   through a DataSource actually works (also tests bug [1051595] jtdsDataSource
   connects only to localhost - could not reproduce).

10/21/2004 - Brian Heineman
 o Initial work to support controlled statement caching.  A latching mechanism
   is available to ensure two separate statements with the same SQL do not cause
   a cached statement to be removed prematurely.
 o Corrected bug [1051747] Array out of bounds Exception in ResultSetMetaData;
   (thanks to Mike Hutchinson for the patch).

10/20/2004 - Alin Sinpalean
 o Corrected a bug that was causing Charsets.properties not to be loaded under
   Db-Visualizer (and in any case when the file could not be loaded via the
   thread context classloader).
 o Made some minor modifications to ConnectionJDNC2.setCollation() to correctly
   translate bytes to ints.
 o Updated XaTest to drop the test tables on test end. Also prepended "jTDS_"
   to all non-temporary table names (in all tests) to ensure no conflicts with
   real tables occur.
 o Cleaned up Javadoc comments to get rid of build warnings.
 o Corrected a bug that was preventing the ConnectionPoolDataSource
   implementation from working correctly with JNDI, by having JtdsDataSource
   implement this interface, too.
 o Corrected bug [1050660] PreparedStatement.getMetaData() clears resultset.
   JtdsPreparedStatement.getMetaData() always submitted a request to obtain the
   meta data, even if the ResultSet was already available, effectively dumping
   the ResultSet. Now it tests for a current ResultSet. An even better approach
   would be to use a different TdsCore instance altogether, in any case, but I
   think it's unnecessary overhead.

10/15/2004 - Alin Sinpalean
 o Applied Mike's fix for bug [1047094] Problem with the store procedure's
   return.

10/13/2004 - Alin Sinpalean
 o Fixed a couple of errors in Support.convert(), calls to Blob.getBytes() and
   Clob.getString() with a position of 0.
 o Fixed a bug that was causing ResultSet retrieval by name to return the last
   matching column rather than the first.

10/12/2004 - Alin Sinpalean
 o Applied Mike's fix for bug [1042272] jTDS doesn't allow null value into
   Boolean. Also fixed the broken test for this bug.

10/10/2004 - Alin Sinpalean
 o Applied patch [1038937] Support for XA connections. Mike strikes again! :o)
 o Added a test for bug [1042272] jTDS doesn't allow null value into Boolean.
   Haven't had the time to look into it, but it's good to have the failing test
   as a reminder.

10/08/2004 - Alin Sinpalean
 o Added checkClosed() calls to JtdsPreparedStatement.setObjectBase(),
   getParameterMetaData() and getMetaData(), which were all using the
   connection object and could cause NPEs if the statement was closed.

10/07/2004 - Alin Sinpalean
 o Applied patch [1040214] "Changes to allow use of default charset", with a
   number of minor modifications, including always throwing an SQLException if
   the charset cannot be determined or loaded.
 o Implemented support for SQL Server 2000 collations. The default charset is
   now determined from the collation in the ENVCHANGE packets sent by the
   server. Still need to extend this support for collations preceding column
   and output parameter descriptions.
 o Cleaned up and fixed some of the unit tests.

10/05/2004 - Alin Sinpalean
 o Corrected bug [1040475] Possible bug when converting to and from datetime.
   SQL Server seems to accept datetime values outside the 1753-9999 range as
   long as they are submitted as SYBDATETIME values and not as Strings and they
   are read back just fine. Weird.

10/04/2004 - Alin Sinpalean
 o Corrected a bug in TdsCore causing "java.sql.SQLException: Output parameters
   have not yet been processed. Call getMoreResults()." to be thrown with
   Sybase.
 o Added a lot of LCID and sort order information to Charsets.properties (I
   hope all of it) in preparation for collation support for TDS 8.0.
 o Corrected bug [1039876] MS SQL JtdsResultSet.isAfterLast() always returns
   false.

10/03/2004 - Alin Sinpalean
 o Corrected yet another charset issue. Charsets should work now.

10/02/2004 - Alin Sinpalean
 o Corrected a number of charset related issues, the most important of which
   was causing iso_1 to be mapped to ISO-8859-1 instead of Cp1252, which is the
   actual charset used (at least by MS SQL Server).
 o Also cleaned up Charsets.properties and added mappings from Java character
   set names back to themselves so that they can be used in the URL or
   Properties with their Java name.

09/30/2004 - Alin Sinpalean
 o Added some more information (from the FreeTDS mailing list) on
   sp_cursoroption parameters.

09/29/2004 - Alin Sinpalean
 o Conversion to LONGVARCHAR from most types was broken. Fixed.

===============================================================================
09/29/2004 - jTDS 0.9 released
===============================================================================

Changes from jTDS 0.9-rc2
=========================

09/28/2004 - Alin Sinpalean
 o Updated the FAQ, feature matrix and some of the other HTML files.
 o Updated driver version as returned by Driver and DatabaseMetaData to "0.9".
 o Minor javadoc cleanup.
 o Corrected bug [1036059] getTimestamp with Calendar applies tzone offset
   wrong way. The getTimestamp(), getTime() and getDate() methods with Calendar
   parameters were applying the time zone difference the same way as the set
   methods (hope it's not the set methods that were wrong, the JDBC spec is
   VERY vague about how the Calendar should be used).
 o Corrected bug [1036058] DataSource implementation broken. Thanks, Mike for
   finding this before the new release.

09/27/2004 - Alin Sinpalean
 o Update counts are read and cached completely (either until the end of the
   response or until a ResultSet is encountered) and exceptions are thrown when
   an output parameter is read before being set. This means that stored
   procedures that return only update counts are processed completely when
   executed and output parameter values are available right away.
 o Implemented some more support for spcursorprepare (still not complete, so
   not used yet).
 o Updated the documentation of sp_cursorprepare in apiCursors.html and some
   minor things in TDS.html.
 o prepareSql=3 (sp_prepare) is supported by TDS 7.0, small update to use it in
   jTDS (until now it was downgraded to sp_executesql -- prepareSql=2).

09/24/2004 - Alin Sinpalean
 o Updated JtdsDatabaseMetaData.getDriverVersion() to also include misc
   version information.

09/23/2004 - Alin Sinpalean
 o Applied Mike's patch [1030475] Scrollable/Updateable result sets for Sybase.

09/23/2004 - Alin Sinpalean
 o Changed the default TDS version to 8.0 when connecting to SQL Server.
 o Corrected bug [1032278] metadata.getColumnClassName not match
   resultset.getObject. Also improved handling of LOB columns in updateable
   ResultSets: until now, updateObject with a LOB value caused the whole
   content to be cached into memory.
 o getObject() (both in JtdsResultSet and JtdsCallableStatement) returned
   UniqueIdentifier objects for UNIQUEIDENTIFIER columns. Fixed.
 o Modified some TdsCore.executeSQL() calls to send -1 for maxRows (in order to
   avoid unnecessary SET ROWCOUNT queries).
 o JtdsDataSource uses the default values from DefaultProperties instead of
   duplicating the initialization. Also, for easier handling, all values are
   kept internally as Strings.

09/16/2004 - Alin Sinpalean
 o Applied Mike's patch [1028856] Sybase 12 support. Added a Tds5Test class.
 o Cleaned up some minor things in tests.
 o Added a test for bug [1028881] statement.execute() causes wrong ResultSet
   type. Seems like it works, after all.
 o Corrected a bug that was causing no exception to be thrown when an invalid
   call escape syntax ("{call ?=...") was used.
 o Cleaned up some warnings signalled by my IDE again.

09/13/2004 - Alin Sinpalean
 o Corrected bug [1027304] DatabaseMetaData.getSchemas() returns 1 column (need
   2); for JDBC 3.0 getSchemas() now also returns a NULL TABLE_CATALOG column.
 o Added a simple test case for bug [1010660] 0.9-rc1 setMaxRows causes
   unlimited temp stored procedures, but was unable to reproduce the behavior.
   The test is PreparedStatementTest.testMaxRows().

09/12/2004 - Alin Sinpalean
 o Implemented automatic TDS protocol version fallback, according to feature
   request [991689] jTDS should automatically detect TDS protocol. Should work
   fine with falling back from TDS 8.0 to 7.0 and could work (but I had no way
   of testing this) with falling back from 5.0 to 4.2 (although I'm not sure
   what will happen with the capabilities token).

09/10/2004 - Alin Sinpalean
 o Corrected bug [1023984] Protocol error processing table meta data. Turns out
   the TABNAME packet is only different for TDS versions 0x71000001 and up
   (i.e. SQL Server versions 2000 SP1 and newer). Added an internalTdsVersion
   field to SharedSocket, that should probably replace tdsVersion altogether.

09/07/2004 - Brian Heineman
 o Corrected bug [1022968] Long SQL expression error; (thanks to Mike Hutchinson
   for the patch).
 o Corrected bug [1023984] Protocol error processing table meta data; (thanks to
   Mike Hutchinson for the bug report and patch).

09/05/2004 - Alin Sinpalean
 o Fixed some minor issues with LOBs and InputStreams/Readers that don't fill
   the read buffer.
 o Fixed BigDecimal handling in Support.embedData() (used when prepareSQL=0).
   BigDecimal values had their precision changed to 10 for some reason.
 o Corrected a bug which was causing strings to always be sent as non-unicode
   (i.e. not preceded by N') by prepared statements with prepareSQL=0,
   regardless of TDS version and settings.
 o Corrected bug [1022445] Cursor downgrade warning not raised; thanks Mike for
   the find and fix.
 o Corrected bug [1022448] NPE Cursor result set errors with prepareSQL != 1;
   thanks Mike for the find and fix.
 o Added a misc component to the driver version, to include release candidate
   information or any other version information besides major and minor version
   (e.g. the "-rc2" in 0.9-rc2).

09/02/2004 - Alin Sinpalean
 o Corrected bug [1020733] Sysbase test failures; (thanks to Mike Hutchinson
   for the bug report and patch).
 o Replaced global temporary tables and procedures ("##"-prefixed) with local
   temporary tables and procedures ("#"-prefixed) in all tests, after a failure
   in the test suite caused by a CREATE TABLE statement.

09/01/2004 - Alin Sinpalean
 o Fixed bug #1020324 - "Driver.parseURL method: missing host check". Thanks
   duccio for the find and fix.
 o Two simple but very important (in terms of performance) tweaks in Messages
   (caching the message ResourceBundle and no longer creating and using a
   MessageFormat instance when the message has no parameters). Before these two
   changes, over 100k+ allocations were made unnecessarily during a single run
   of the test suite.
 o RequestStream.writeStreamBytes() and writeReaderChars() no longer read/write
   one byte/char at a time, but rather use a buffer. This should considerably
   improve performance.
 o Added a simple check and a read loop instead of a single read to BlobImpl
   and ClobImpl.
 o Small changes in LargeLOBTest.testLargeBlob1() and
   TestBase.compareInputStreams()/compareReaders() to improve performance. All
   three now use buffers instead of reading/writing one byte at a time.
   LargeLOBTest runs now in just over a minute.
 o Added a test for bug #1008816 - '"More data in stream ..." error when
   inserting an image' to LOBTest (testBlobSet8). This seems to have been fixed
   starting with 0.9-rc1.

08/31/2004 - Alin Sinpalean
 o Improved BlobImpl internal OutputStream write(byte[], int, int)
   implementation. No longer uses write(byte). Also cleaned up somewhat
   ClobImpl.
 o TestBase.compareInputStreams() and compareReaders() were not checking for
   EOF on the first input stream/readed. Fixed.
 o LargeLOBTest now only runs if the 'jTDS.runLargeLOBTest' system property is
   defined. Should do this with 1.4-only test methods too.
 o Updated build.sh to work on my development machine (should work better on
   any *NIX now).
 o Cleaned up some Javadoc comments that were causing warnings when generating
   the documentation.
 o Cleaned up some IntelliJ IDEA warnings, including a possible bug that could
   cause NPEs in TdsCode.executeSQL70().

===============================================================================
08/28/2004 - jTDS 0.9-rc2 released
===============================================================================

Changes from jTDS 0.9-rc1
=========================

08/28/2004 - Brian Heineman
 o Corrected bug [1017957] 9.1 rc1 and resin 3.0.8 incompatibilities?;
   JtdsDataSource no longer inherits accessors and mutators from another class.
 o Corrected bug [1017896] Fn convert parameters wrong way round; (thanks to
   Mike Hutchinson for the bug report and patch).
 o Corrected bug [1017164] executeQuery fails with > 2 resultsets; (thanks to
   Mike Hutchinson for the patch).
 o Applied patch attached to bug [1017616] 0.9-RC1 Threading problem; (thanks to
   Mike Hutchinson for the patch).
 o Added test for bug [1008882] Some queries with parameters cannot be executed
   with 0.9-rc1
 o Numerous javadoc corrections for release.

08/24/2004 - Brian Heineman
 o Corrected JDBC compliance test files per Mike Hutchinson's recommendations:
   http://sourceforge.net/forum/message.php?msg_id=2724244
 o Corrected bug [1009233] ResultSet getColumnName, getColumnLabel return wrong
   values; (thanks to Mike Hutchinson for the fix).
 o Added test for bug [1009233] ResultSet getColumnName, getColumnLabel return
   wrong values.
 o Corrected bug [1015543] ResultSetMetaData.isNullable always returns
   columnNoNulls; (thanks to Mike Hutchinson for the bug report and patch).
 o Miscellaneous test clean up.

08/22/2004 - Brian Heineman
 o Corrected bug [1013749] Driver does not support params inside escapes;
   (thanks to Mike Hutchinson for the bug report and patch).
 o Corrected bug [1013819] Cursor downgraded bug;
   (thanks to Mike Hutchinson for the bug report and patch).

08/21/2004 - Brian Heineman
 o Applied patch [1013432] Patches for SUN JDBC Compatibility test; (many thanks
   again to Hutchinson for the patch.  The driver now passes the SUN JDBC
   compatibility test suite 1.3.1).  The following issues were also addressed in
   this patch:
     [1012307] PreparedStatement.setObject (java.util.Date) not working;
     (Server not reporting that java.util.Date is not a supported object type)
     [1012301] 0.9-rc1: Prepared statement execution error;
     (Leading spaces cause the parameter marker offsets to be incorrect)
     [1011650] 0.9-rc1: comments get parsed; (Added Joel Fouse's patch plus
     modifications to ensure that driver can cope with comments before the first
     SQL statement).
     [1002971] TimestampTest failures under JDK 1.3 (Possible class cast
     exception in TdsData).
     [1008126] Metadata getTimeDateFunctions() wrong
 o Corrected bug [1012318] 0.9-rc1 throw NullPointerException if user/password
   passed; if a null user or password was passed the driver would throw a
   NullPointerException.
 o Corrected stored prcedure cursor parameter definitions.

08/17/2004 - Brian Heineman
 o Additional corrections for bug [966274] Trusted Connections no longer work;
   (thanks to David Kilzer and Joel Fouse).
 o Corrected bug [1009234] sp_prepare and sp_prepexec should be limited to TDS
   8.0
 o Added initial support for sp_cursorprepare, sp_cursorprepexec and
   sp_cursorexecute; statement handles are not currently cached for reuse. This
   corrects bug [1008097] 0.9-rc1 prepareSQL=3 - read only cursor.

08/16/2004 - David Kilzer
 o New JtdsObjectFactoryUnitTest class used to test JtdsObjectFactory class.
 o Pulled ucFirst() method out of JtdsDataSourceUnitTest class into
   DefaultPropertiesTestLibrary class.

08/16/2004 - Brian Heineman
 o Corrected bug [966274] Trusted Connections no longer work; (thanks to Mike
   Hutchinson for the patch and all the users who helped to find the problem).

08/14/2004 - Brian Heineman
 o Corrected bug [1006449] 0.9rc1: Driver version broken; (thanks to Mike
   Hutchinson for the patch).

08/13/2004 - Brian Heineman
 o Added test for bug [1008208] 0.9-rc1 updateNull doesn't work
 o Added initial support for prepareSql=4; sp_prepexec used in conjunction with
   sp_execute.  Currently the statement handle is not retrieved and cached so
   sp_prepexec is being called each time. Update the FAQ to indicate that
   sp_prepexec functionality is experimental.
 o Corrected bug [1008208] 0.9-rc1 updateNull doesn't work; updated test to
   ensure functionality continues to work in the future.

08/13/2004 - David Kilzer
 o Applied patch to check if connection is null before calling
   connection.isClosed() in JtdsStatement.  Patch posted to
   [1007962] 0.9-rc1 NullPointerException; was created while debugging an
   issue with named pipes.

08/12/2004 - Brian Heineman
 o Added result set tests for min and max values.
 o Added result set tests for BIGINT.
 o Corrected conversion errors with Long values that were sent as BigDecimal;
   the value sent to the database was not the value specified.

08/11/2004 - Brian Heineman
 o Applied patch in bug [1006845] Stored procedure with 18 parameters; (thanks
   to Mike Hutchinson for the patch).
 o Added test for bug [1006845] Stored procedure with 18 parameters

08/10/2004 - Brian Heineman
 o Applied patch in bug [1006218] getObject returns incorrect Java class;
   (thanks to Mike Hutchinson for the patch).

===============================================================================
08/09/2004 - jTDS 0.9-rc1 released
===============================================================================

Changes from jTDS 0.8.1
=======================

08/09/2004 - Brian Heineman
 o Corrected bug [1005881] Typo in Exception message "Uknown server host name
   abc"
 o Corrected bug [1005644] Small bug in ant build file; (thanks to Mike
   Hutchinson for the fix).
 o Applied patch [1005550] Documentation on sp_cursorprepare etc.; (thanks to
   Mike Hutchinson for the patch).

08/07/2004 - David Kilzer
 o Changed AbstractDataSource.getTdsVersion() and setTdsVersion() back to
   getTds() and setTds() to preserve external interface.  Left private data
   member named tdsVersion to provide consistency with private field in
   ConnectionJDBC2 and to make testing easier.

08/07/2004 - Brian Heineman
 o Applied patch [1005207] Modified microsoftPrepare method; (thanks to Mike
   Hutchinson for the patch).

08/06/2004 - David Kilzer
 o De-uglified the Driver.getPropertyInfo() method.  The code reads much
   cleaner now.
 o Revised insert/update/delete-new-property mini-howto in DefaultProperties.
 o Created overloaded DefaultProperties.getServerType() methods to convert
   server type from String to Integer and Integer to String.  Implemented in
   Driver and JtdsDataSource classes.
 o Created JtdsDataSourceUnitTest class.  Cleaned up AbstractDataSource to
   use DefaultProperties defaults, added missing appName and progName
   properties, fixed type of prepareSql from boolean to int, and renamed
   isLastUpdateCount() to getLastUpdateCount().  Fixed parsing of new type
   of prepareSql property in JtdsObjectFactory.getObjectInstance().
 o Updated DefaultPropertiesTestLibrary to contain flags for only testing a
   default setup of SQL Server and/or TDS 7.0.
 o Updated DriverPropertyInfo choices for prepareSql property.
 o Cleaned up DefaultPropertiesTestLibrary so it is easier to extend.
 o Created ConnectionJDBC2UnitTest.
 o Created DefaultProperties.getTdsVersion() method to convert Tds version
   string to an integer.  Created unit tests in DefaultPropertiesUnitTest.
 o Created UnitTestBase.invokeGetInstanceField() method for
   ConnectionJDBC2UnitTest.
 o On ConnectionJDBC2 class: renamed private field serverPort to portNumber,
   added private default constructor for testing, and implemented use of
   DefaultProperties.getTdsVersion().
 o INCOMPATIBLE INTERFACE CHANGE:  Renamed AbstractDataSource.getTds(),
   setTds() and private tds field to getTdsVersion(), setTdsVersion() and
   tdsVersion to match private field in ConnectionJDBC2.  This also affects
   JtdsDataSource.  [Reverted: see 08/07/2004]
 o ConnectionJDBC2.unpackProperties():  Removed code that set default
   property values since this is now handled in Driver.parseURL() before
   the method is called.  Refactored common code into parseIntegerProperty()
   and parseLongProperty() methods.
 o New unit test in ConnectionJDBC2UnitTest for testing that
   unpackProperties() throws an SQLException when parsing an invalid integer
   or long property.

08/06/2004 - Brian Heineman
 o Update the usage of the prepareSql parameter.  This parameter is now used to
   determine how prepared statements are sent to the server.  Options include:
     0 - SQL is sent to the server each time without any preparation
     1 - Temporary stored procedures are created for each unique SQL statement
         and parameter combination
     2 - sp_executesql is used
     3 - sp_prepare is used in conjunction with sp_execute
     4 (not implemented) - sp_prepexec is used in conjunction with sp_execute
   Update the FAQ to include this new information.
 o Corrected bug with sp_prepare/sp_execute logic where statements without
   parameters were being sent as raw SQL even though the SQL was prepared with
   sp_prepare.
 o Corrected bug introduced with early work where the temporary stored procedure
   name may not have been unique for the connection.

08/05/2004 - David Kilzer
 o Added missing javadoc to DriverUnitTest methods.
 o Renamed Messages.defaultResource to Messages.DEFAULT_RESOURCE to reflect its
   use.
 o Refactored Driver.getPropertyInfo() so that properties are not hard-coded.
   Added Messages.loadDriverProperties() method.  Wrote additional unit tests
   for Driver.getPropertyInfo() in DriverUnitTest.  Added more utility methods
   to UnitTestBase.

08/05/2004 - Brian Heineman
 o Applied Mike Hutchinson's patch for [996631] Refactoring and some performance
   optimization.
 o Removed extraneous import statements.
 o Added check in data conversion for LOB values with a length greater than
   2,147,483,647.
 o Added "and Sybase" to JtdsDatabaseMetaData.getDriverName().

08/04/2004 - Brian Heineman
 o Applied patch in bug [1003507] Cursor result set close error;
   (thanks to Mike Hutchinson for report and the fix).
 o Removed assertEquals(double,double) to avoid Eclipse execution failures.

08/04/2004 - David Kilzer
 o Renamed Settings class to DefaultProperties to match its use.  Removed
   redundant "DEFAULT_" prefix from its public static constants.
 o Refactored DefaultProperties to remove duplicate code.
 o Created DefaultPropertiesUnitTest to test new methods in DefaultProperties.
 o Moved methods related to Messages.propertes from Support class to new
   Messages class.  Support.getMessage() is now Messages.get().
 o Wrote unit test for Driver.getPropertyInfo() in preparation for future
   refactoring.

08/03/2004 - Brian Heineman
 o Applied patch in bug [1002811] Poor performance of cursor result sets;
   (thanks to Mike Hutchinson for the fix).
 o Applied patch in bug  [1001956] updateBytes() converted to hex string in
   varchar; (thanks to Mike Hutchinson for the fix).

08/03/2004 - David Kilzer
 o Swapped descriptions of appName and progName in FAQ.
 o Renamed internal libName variable to progName to match external property.
 o Cleaned up Messages.properties to remove prop.libname (prop.progname already
   existed) and to add prop.desc.appname and prop.desc.progname properties.
 o Clean up comments to reference Driver.SQLSERVER and Driver.SYBASE instead of
   TdsCore or old Tds classes.
 o Add code to check for inherited methods, not just locally declared methods,
   in UnitTestBase static methods.
 o Fixed Driver.getPropertyInfo() to parse url when null properties are used.
 o Created new Settings class to hold default settings values and related
   utility methods.
 o Moved port and LOB buffer constants from TdsCore to Settings.
 o Modified Driver.parseURL() to set default properties using
   Settings.addDefaultProperties().
 o Created DefaultPropertiesTestLibrary class for testing Driver.parseURL().
 o Implemented Settings.TDS_VERSION_XX constants in various classes.
 o Added test suite to DriverUnitTest to test Driver.getPropertyInfo().
 o Added missing 'appname' and 'progname' properties to, and removed default
   setting code (now handled in parseURL()) from, Driver.getPropertyInfo().

08/01/2004 - Brian Heineman
 o Partial application of patch [997595] SQL 6.5 Test suite.; general test clean
   up.
 o Updated tests so that they compile with the 1.3 JDK.
 o Updated BlobImpl and ClobImpl so that they compile with the 1.3 JDK.
 o Corrected bug in Blob and Clob file writes where a NullPointerException was
   thrown if close() was called twice on a stream.
 o Corrected bug in JtdsPreparedStatement.getParameter() where the error check
   would incorrectly allow a 0 value (thanks to Mike Hutchinson for the report
   and fix).
 o Corrected bug in TdsData.getVariant() where the SYBUNIQUE case would return
   an incorrect UID string (thanks to Mike Hutchinson for the report and fix).

07/30/2004 - Brian Heineman
 o Updated build process to correct bug [999702] LICENSE file not included in
   source distribution

07/29/2004 - David Kilzer
 o Changed default Sybase port from 4000 to 7100 in faq.html to match value
   of TdsCore.DEFAULT_SYBASE_PORT.
 o Created TdsCore.DEFAULT_LOB_BUFFER_SIZE constant.  Replaced use of "magic"
   values in other classes.
 o Replaced more "magic" values with TdsCore.MIN_PKT_SIZE and
   TdsCore.MAX_PKT_SIZE in various classes.
 o Made TestBase and DatabaseTestCase abstract so that IntelliJ IDEA would
   not try to instantiate them and run them.
 o Created new abstract UnitTestBase class to hold reflection methods used
   by other test classes.
 o Changed NamedPipeUnitTest to extend UnitTestBase.
 o Changed CSUnitTest to use UnitTestBase methods.

07/28/2004 - David Kilzer
 o Moved TdsCore.TDS42, TDS50, TDS70, TDS80, SQLSERVER and SYBASE constants
   to Driver class per suggestion by Mike Hutchinson.
 o Made TdsCore.DEFAULT_SQLSERVER_PORT and DEFAULT_SYBASE_PORT public.
   Removed use of "magic" values in other classes.
 o Applied patch [997211] Refactor Tds8Test to skip tests if not using TDS 8.0.
   Removed unused TestBase.connectODBC() and TestBase.getConnectionODBC()
   methods.  Now use loadProperties(ODBC_CONNECTION_PROPERTIES) to switch
   the connection to use ODBC.
 o Created new DatabaseTestCase.dropProcedure() method that takes an
   additional Statement argument.  Updated AsTest.testProc1() and testProc2()
   to use the new dropProcedure() method.

07/27/2004 - David Kilzer
 o Renamed SharedNamedPipeTest to NamedPipeUnitTest to better reflect its
   usage.
 o Added protected getters and setters to SharedSocket so that the in, out,
   tdsVersion and serverType fields could be made private again.  Implemented
   use of getters and setters in SharedSocket and SharedNamedPipe.
 o Refactored SharedNamedPipe constructor into an instance() static factory
   method.  Allowed calculateBufferSize() method to be made non-static,
   and will allow for easier unit testing in the future.
 o Cleaned up javadoc: fixed spelling and removed unused @throws.
 o Fixed CallableStatementTest.testCallableRegisterOutParameter1() which was
   using the '==' operator on String objects.  Changed to use assertEquals()
   instead.  Cleaned up two other uses of '==' inside assert*() methods.

07/27/2004 - Brian Heineman
 o Added test for bug [998765] Exception with Sybase and metaData.getTables()

07/26/2004 - David Kilzer
 o Made SharedNamedPipe constructor package-private to match SharedSocket
   constructor.
 o Made TdsCore.SQLSERVER and TdsCore.SYBASE public.  Removed use of
   "magic" values.
 o Fixed default value of lobBuffer in AbstractDataSource.getReference().
   It was using "portNumber" instead of "lobBuffer" for its default.
 o Made TdsCore.TDS42, TDS50, TDS70, TDS80 constants public for use with
   testing.
 o Made TdsCore.MIN_PKT_SIZE public, and created TdsCore.MAX_PKT_SIZE and
   TdsCore.DEFAULT_MIN_PKT_SIZE_TDS70.  Removed used of "magic" values.
 o Wrote new SharedNamedPipeTest class for testing new
   SharedNamedPipe.calculateBufferSize() method.
 o Fixed bug in SharedNamedPipe that caused it to create a zero-length
   BufferedInputStream internally when packetSize == 0 (which is common
   for TDS 7.0 and TDS 8.0 to allow the server to set the packet size).

07/26/2004 - Brian Heineman
 o Removed extraneous methods from SharedSocket and SharedNamedPipe.

07/25/2004 - David Kilzer
 o Fixed bug when using instances with named pipes.  ConnectJDBC2 constructor
   was trying to determine the correct serverPort by creating a MSSqlServerInfo
   object, which is not necessary for named pipes.
 o Fixed bad message key in ConnectJDBC2.unpackProperties().  Changed
   "prop.portservertype" to "prop.servertype".

07/25/2004 - Brian Heineman
 o Applied patch [991684] Implement named pipe IPC for SQL Server 6.5; (Thanks
   to David Kilzer <ddkilzer@users.sourceforge.net> for the patch)

07/23/2004 - Brian Heineman
 o Improved ConnectionPoolDataSource exception processing and closed connection
   handling.
 o Applied patch [989791] Workaround for null values in properties; (Thanks to
   Art Gramlich for the original patch)
 o Corrected documentation for the lastUpdateCount connection property.

07/22/2004 - Brian Heineman
 o Added lobBuffer parameter to control the memory used by LOB's.
 o Updated FAQ documentation with new parameter information and TDS protocol
   support.
 o Corrected bug in Blob and Clob truncate() methods that caused a
   NullPointerException to be thrown for disk based LOBs.
 o Corrected bug in TestBase where InputStreams and Readers were not being
   closed.
 o Added test for bug [945462] getResultSet() return null if you use
   scrollable/updatable

07/21/2004 - Brian Heineman
 o Added test for bug [994988] Network error when null is returned via int
   output parm
 o Corrected bug [994916] datetime decoding in TdsData.java; Added tests to
   ensure this functionality continues to work in the future.
 o Added test for bug [983432] Prepared call doesn't work with jTDS 0.8
 o Added test for bug [981958] PreparedStatement doesn't work correctly

07/20/2004 - Brian Heineman
 o Added test for bug [974284] retval on callable statement isn't handled
   correctly
 o Added test for bug [994888] Callable statement and Float output parameter

07/19/2004 - Brian Heineman
 o Applied patch in bug [992971] Decimal testcase fails with sql7 (Thanks to
   Mike Hutchinson for the patch)
 o Corrected bug introduced in Clob optimization.
 o Added test for bug [992715] wasnull() always returns false
 o Added test for bug [991640] java.sql.Date error and RAISERROR problem

07/17/2004 - Brian Heineman
 o Applied patch in bug [992971], which corrects bug [992976] Zero length
   string error on Sybase and MSQL 6.5 (Thanks to Mike Hutchinson for the
   patch); made a minor change to reduce memory allocation.

07/15/2004 - Brian Heineman
 o Refactored JtdsDataSource implementation into AbstractDataSource,
   JtdsDataSource and JtdsConnectionPoolDataSource.
 o Updated FAQ documentation to reflect current driver and data source class
   names.
 o Added test for bug [930305] getGeneratedKeys() does not work with triggers
 o Added test for bug [974801] stored procedure error in Northwind

07/14/2004 - Brian Heineman
 o Updated ResultSetMetaData.getColumnType(int) always return Types.BIT for BIT
   columns. Updated tests to ensure this functionality continues to work in the
   future.
   http://sourceforge.net/forum/forum.php?thread_id=1108433&forum_id=129584
 o Corrected bug [991033] Data type 0x32 is unknown error with SQL Server 2005;
   SYBBITN values are now properly formed and are no longer sent as SYBBIT
   when they are not null.
 o Corrected bug [991088] Data type 0x3E is unknown error with SQL Server 2005;
   SYBFLTN values are now properly formed and are no longer sent as SYBFLT8
   when they are not null.
 o Updated documentation to reflect SQL Server 2005 compliance.

07/13/2004 - Brian Heineman
 o Corrected bug [989963] BigInt becomes Numeric;
   ResultSetMetaData.getColumnType(int) now returns Types.BIGINT. Added tests
   to ensure this functionality continues to work in the future.
 o Added test for bug [989399] bug? blob.getBytes() from 0
 o Updated ResultSetMetaData.getColumnType(int) to return Types.BOOLEAN for BIT
   columns when using a 1.4+ JRE; returns Types.BIT otherwise.  Added tests
   to ensure this functionality continues to work in the future.

07/12/2004 - Brian Heineman
 o Removed JNetDirect performance results to comply with their licensing.

07/08/2004 - Brian Heineman
 o Added test for bug [983561] getDatetimeValue truncates fractional
   milliseconds.

07/07/2004 - Brian Heineman
 o Added test for bug [974036] Bug in 0.8rc1 DatabaseMetaData method
   getTableTypes()
 o Corrected bug [985956] Cannot setObject(null) on image; Added test to ensure
   this functionality continues to work in the future.
 o Added test for feature request [956800] setNull(): Not implemented
 o Corrected bug [919477] Large LOB data causes OutOfMemoryError; Blob/Clob
   data is now buffered to disk for reads as well as writes if the data
   exceeds 32KB.
 o Reduced amount of time Blob/Clob objects are locked due to synchronization.
 o READTEXT support has been temporarily disabled.  This feature will be
   enabled again once code is in place to control the in-memory buffering via
   a connection property and WRITETEXT support is added.
 o Added test for bug [939206] TdsException: can't sent this BigDecimal
 o Added test for bug [946171] null boolean in CallableStatement bug
 o Added test for bug [963799] float values change when written to the database
 o Added test for bug [961594] ResultSet.
 o Added test for bug [985754] row count is always 0

07/01/2004 - Brian Heineman
 o Improved Blob and Clob support.  Writes done through a Blob or Clob are now
   buffered in memory if the data size is less than 32KB.  If the data size is
   greater than 32KB, the Blob/Clob will attempt to cache the data to disk.
   A failed attempt at disk caching due to a SecurityException will be logged
   and the Blob/Clob data will remain in memory.  Also, the READTEXT mechanism
   will only convert to an in-memory or disk based Blob/Clob if a write attempt
   is made.
 o Improved Blob and Clob conversions to/from other data types.

06/29/2004 - Brian Heineman
 o Corrected bug with cached statements and savepoints.  If a statement was
   cached after a savepoint was set, that statement would not be removed
   from the cache if the savepoint was rolledback.  Added test to ensure
   this functionality continues to work in the future.

06/23/2004 - Brian Heineman
 o Applied patch [950028] Jtds enhancement - TDS 5.0 (thanks to code provided
   by Mike Hutchinson this patch corrects a number of bugs and adds initial
   support for TDS 8.0 as well). See NEWCODE.TXT for additional information.
 o Corrected bug with Savepoint id assignment.
 o Improved performance of data conversions by reducing memory allocations.

===============================================================================
07/08/2004 - jTDS 0.8.1 released
===============================================================================

Changes from jTDS 0.8
=====================

07/08/2004 - Brian Heineman
 o Corrected bug [983561] getDatetimeValue truncates fractional milliseconds.

07/07/2004 - Brian Heineman
 o Corrections to compile with the 1.3 JDK; updated Types.BOOLEAN references
   to Tds.BOOLEAN.

06/27/2004 - Brian Heineman
 o Corrected bug [974036] Bug in 0.8rc1 DatabaseMetaData method getTableTypes()

===============================================================================
06/22/2004 - jTDS 0.8 released
===============================================================================

Changes from jTDS 0.8-rc1
=========================

06/08/2004 - Brian Heineman
 o Corrected bug [965018] translateDate is not recognized function name.

05/30/2004 - Brian Heineman
 o Corrected bug where "Cp" or "MS" was being appended to strings that already
   started with a different case of the same sequence of characters.
 o Corrected bug in date time handling (thanks to code provided by Mike
   Hutchinson).

05/06/2004 - Brian Heineman
 o Corrected bug [946642] No support for 1.4 java.sql.Types.BOOLEAN.

05/03/2004 - Brian Heineman
 o Corrected TdsSocket to compile under 1.3.
 o Added initial (limited) ParameterMetaData support.
 o Updated DatabaseMetaData.supportsStatementPooling() to return true.

05/02/2004 - Brian Heineman
 o Updated SQLException handling to set the initCause() method with the
   initiating exception if the JVM supports it (1.4+).  Otherwise, the
   inital cause of the exception is ignored (JVM's prior to 1.4).

05/01/2004 - Brian Heineman
 o Consolidated logic for returning data from result sets and callable
   statements.
 o Added support for additional data conversions.
 o Implemented CallableStatement.getBlob(int)
 o Implemented CallableStatement.getClob(int)
 o Implemented CallableStatement.getBigDecimal(int)
 o Implemented CallableStatement.getBigDecimal(int,int)
 o Implemented CallableStatement.getDate(int)
 o Implemented CallableStatement.getDate(int,Calendar)
 o Implemented CallableStatement.getTime(int)
 o Implemented CallableStatement.getTime(int,Calendar)
 o Implemented CallableStatement.getTimestamp(int)
 o Implemented CallableStatement.getTimestamp(int,Calendar)

04/30/2004 - Brian Heineman
 o Added test for bug [945507] closing statement after selecting a large
   IMAGE - Exception
 o Applied second update to patch [934396] better IO error handling; thanks to
   Fedor Karpelevitch.

04/21/2004 - Brian Heineman
 o Corrected bug [938632] String index out of bounds error in 0.8rc1;
   added test to ensure functionality continues to work in the future.
 o Corrected bug [938494] setObject(i, o, NUMERIC/DECIMAL) cuts off decimal
   places; added test to ensure functionality continues to work in the future.

04/20/2004 - Brian Heineman
 o Updated DatabaseMetaData.supportsNamedParameters() to return true.

04/19/2004 - Brian Heineman
 o Implemented CallableStatement.getMetaData() and
   PreparedStatement.getMetaData(); both implementations are currently
   sub-optimal due to the fact they are executing the query to obtain the
   ResultSetMetaData.
 o Corrected PreparedStatement caching bug related to changing catalogs.

04/16/2004 - Brian Heineman
 o Corrected bug [934273] setNull does not set IMAGE type to null; added tests
   to ensure functionality continues to work in the future.
 o Corrected NullPointerExceptions thrown from ResultSet.updateBinaryStream(),
   ResultSet.updateBlob(), ResultSet.updateAsciiStream(),
   ResultSet.updateCharacterStream() and ResultSet.updateClob() if a null value
   was passed in.
 o Improved LOBTest performance; runs in ~1 second now instead of 60+.
 o Minor optimizations for sending character data.
 o Improved exception handling throughout the driver to provide the complete
   stack trace of any nested exception.
 o Applied part of patch [934396] better IO error handling; thanks to Fedor
   Karpelevitch.

04/14/2004 - Alin Sinpalean
 o Applied and improved patch #930076 - Passing parameters to stored procedure
   by name. Thanks Tommy Sandstrom for the original patch.

04/12/2004 - Brian Heineman
 o Corrected bug preventing connections to databases with spaces in the name.
 o Added check to commit() and rollback() to determine if connection is closed
   to fix bug [931090] ArrayIndexOutOfBoundsException in rollback()
 o Added test for bug [931090] ArrayIndexOutOfBoundsException in rollback()

04/05/2004 - Brian Heineman
 o Code clean up - removed unused import statements.

04/04/2004 - Alin Sinpalean
 o Cleaned up TEXT and IMAGE sending. Now there's only one method for each of
   them. Also simplified CHAR/VARCHAR and BINARY/VARBINARY sending code.
 o Added an appendChars method to TdsComm that accepts a char array and a length
   as parameters.
 o Moved output logging before the call to TdsSocket.sendNetPacket() to avoid
   logging zeros (if the method returned a new buffer and buffered the old one).
 o Created the Tds.handleEndToken() static method to have a unified handling of
   end token status flags. It's now called for all the end tokens processed.
 o Modified row count handling in Tds. Now the "valid row count" flag and the
   operation code flag are checked and only valid update counts not from SELECTs
   are kept; row counts for DDL statements are always set to 0. Also, update
   counts are returned for CallableStatements too, as Mike suggested. This seems
   to be more or less the behavior of the other SQL Server drivers.
 o CursorResultSet now consumes update counts returned by the sp_cursor stored
   procedures rather than throwing exceptions.
 o Updated the TDS documentation with some new information on end token status
   flags and operation codes.
 o Updated the unit tests that were failing because of the new way update counts
   are managed.

04/03/2004 - Brian Heineman
 o Updated binary data support so that data set via a stream or Blob is not
   cached entirely in memory before being sent to the server.  No more than
   1KB of data read from the stream or Blob is buffered in memory at any time.
 o Updated text data support so that data set via a stream or Clob is not
   cached entirely in memory before being sent to the server.  No more than
   1KB of data read from the stream or Clob is buffered in memory at any time.

04/02/2004 - Brian Heineman
 o Updated Tds.cvtJdbcTypeToNativeType to treat java.sql.Clob as SYBTEXT
   instead of SYBCHAR.
 o Added support to TdsUtil for Blob and Clob data types to improve exception
   reporting.
 o Cleaned up EncodingHelper in preperation for Clob stream support; removed
   initialization logic for Microsofts VM (which jTDS is no longer compatible
   with as it uses Java 2 classes).

04/01/2004 - Alin Sinpalean
 o Fixed an issue in TdsSocket that was causing queued output not to be flushed
   when sendNetPacket() was called (i.e. a packet from the middle of the request
   was sent out first causing SQL Server to close the connection).
 o Initialized the charset field of TdsDataSource to the empty String (bug
   #927764).

04/01/2004 - Brian Heineman
 o Updated ResultSet.updateObject() to work properly with Blob and Clob values.
 o Corrected ClasCastException when Blob or Clob values were used with cursor
   result sets.
 o Updated savepoint SQL to use SAVE TRAN/ROLLBACK TRAN instead of
   SAVE TRANSACTION/ROLLBACK TRANSACTION.

03/31/2004 - Alin Sinpalean
 o Added a test for bug #926620 (Too long value for VARCHAR field) and fixed it
   by adding a test in Tds.executeProcedureInternal().
 o Added code to set the maximum length of BINARY/VARBINARY fields in
   ParameterUtils.createParameterMapping(), because the test added to Tds was
   causing binary parameters throw exceptions every time.
 o Reduced the size of the TimestampTest.testNestedStatements0022() and
   TimestampTest.testNestedStatements0026(), because they were running
   incredibly slow on my development machine and did not help at all.

03/30/2004 - Alin Sinpalean
 o Silently updated the JUnit and Ant jars in the 0.8-rc1 source packet.
 o Moved the Savepoint-related methods from TdsConnection into a new class,
   TdsConnectionJDBC3. Now new Connections are dynamically created from one of
   the two classes depending on the Java specification version of the JVM.
 o Added some more old date tests, still haven't been able to reproduce anything
   on my machine.
 o Added patch #926168 (add some meta-info to jar manifest) submitted by Fedor
   Karpelevitch.
 o Updated the connection.properties template to include the user property.

03/28/2004 - Brian Heineman
 o Implemented Savepoint support.
 o Updated DatabaseMetaData.supportsSavepoints() to return true.
 o Implemented DatabaseMetaData.supportsMultipleOpenResults(); returns true.
 o Implemented DatabaseMetaData.supportsNamedParameters(); currently returns
   false.
 o Implemented DatabaseMetaData.supportsStatementPooling(); currently returns
   false.

03/27/2004 - Brian Heineman
 o Added test to demonstrate bug [924030] EscapeProcesser problem with "{}"
   brackets

===============================================================================
03/30/2004 - jTDS 0.8-rc1 released
===============================================================================

Changes from jTDS 0.7.1
=======================

03/29/2004 - Alin Sinpalean
 o jTDS is now licensed under the LGPL. This means that noone will be able to
   sell jTDS or any derivatives and that any modifications to it must be made
   public. This decision has been discussed and approved in the jTDS developer
   forum.
 o Updated the documentation and README to reflect the license change.
 o Changed the "Project Home" link to "Project Info" to avoid confusion and
   reordered the links, placing the local ones first.

03/28/2004 - Alin Sinpalean
 o Compiled (a lot of) new documentation.
 o Modified property names in TdsDefinitions and TdsDataSource to match the
   documentation.

03/27/2004 - Brian Heineman
 o Corrected parsing bug in EscapeProcessor that occured when "{" or "}" were
   found in a quoted string.

03/26/2004 - Alin Sinpalean
 o Fixed the fix for bug #922802. ;o) There was a NPE thrown if the batch was
   empty at its first execution.
 o Added a test for bug #582464 (which, although closed, was signalled again
   with a different date - 06/15/1940 0:00:00). Turns out I couldn't reproduce
   it.

03/26/2004 - Brian Heineman
 o Added ResultSet.getObject() support for IMAGE, TEXT and NTEXT fields to
   return Blob and Clob objects. Added tests for new functionality.
 o Added Blob and Clob support to ResultSetMetaData.getColumnClassName().
 o Corrected bug [887508] getObject returns Integer-Object on Types.Smallint;
   added test to ensure functionality continues to work in the future.

03/25/2004 - Alin Sinpalean
 o Fixed bug #922802 (TdsStatement.executeBatch() throws exception if no
   statements added). Indeed other drivers work just fine with empty batches and
   the spec doesn't mention anything about throwing an exception if no batch was
   added.

03/24/2004 - Alin Sinpalean
 o Applied Mike's "Streamlined stored proc processing" patch (#916084). Seems
   like all I'm doing lately is answering forum questions and applying Mike's
   great patches. ;o)

03/21/2004 - Alin Sinpalean
 o Applied Mike's SqlMessage patch to generate SQL state values based on native
   error codes, changed the implementation (from sorted array to HashMap) and
   added a lot of new mappings.

03/20/2004 - Brian Heineman
 o Corrected bug [919594] Clob support; added setObject support for both
   java.sql.Blob and java.sql.Clob.  Added initial Blob and Clob functional
   tests.
 o Corrected SQLException in getBytes() due to invalid length calculation.

03/14/2004 - Alin Sinpalean
 o Applied Mike's version 4 of the single connection patch fixing a number of
   issues (see patch #912364 for the exact description).
 o Updated the home page with a lot of new stuff and added it to the CVS
   repository.

03/13/2004 - Alin Sinpalean
 o Applied a patch by jarek_woloszyn fixing the behavior of lastUpdateCount
   when set.
 o Fixed yet another bug (#914069) which prevented cursor-based ResultSets from
   working with PreparedStatements (an update count was returned, which caused
   an exception to be thrown). Updated SAfeTest to test this.
 o Fixed and simplified current row and total row count handling in
   CursorResultSet.

03/08/2004 - Alin Sinpalean
 o Split up table name from TDS_TABNAME packet into catalog, schema and table,
   if fully qualified.
 o Hidden columns (those for which the hidden flag is set in the TDS_COLINFO
   packet) modify the fake column count; they are (hopefully always) the last
   ones in the ResultSet.
 o Updated the details of the TDS_TABNAME and TDS_COLINFO packets in the TDS
   documentation.

03/07/2004 - Alin Sinpalean
 o The main Tds instance is now always created even if no cursor ResultSets are
   used, as it simplifies the internals of TdsConnection and doesn't create an
   additional physical connection anymore.
 o Moved connection initialization from Tds to TdsConnection.
 o Moved the EncodingHelper instance from Tds to TdsConnection.
 o Removed the 'host' URL parameter as it was only duplicating 'serverName'.
 o Replaced direct access to Tds instance 0 with synchronized access to the
   main Tds instance (which now always exists) for database change, commit,
   rollback or settings change. In the previous implementation access was not
   synchronized and could interfere with (or completely consume the output of)
   some Statement.
 o Moved handling of current database and charset to TdsConnection and handling
   of buffer size to TdsSocket (via TdsComm) from Tds.

03/06/2004 - Alin Sinpalean
 o Applied Mike's single connection patch. It's the first time I see jTDS
   passing ALL the tests. Thanks a million, Mike! :o)
 o Fixed an issue that rendered the 'macAddress' parameter unusable.
 o Reformatted TdsComm and cleaned up a bit the javadoc.

03/04/2004 - Brian Heineman
 o Corrected Blob and Clob methods to be 1 based not 0 based per the JDBC
   specification.
 o Numerous minor performance enhancements that reduce memory allocations,
   assignments and cost of control logic.

03/03/2004 - Brian Heineman
 o Corrected bug [909169] jTDS 0.7: introduced another bug (Stored Procedure);
   added test to ensure functionality continues to work in the future.
 o Updated CallableStatements to parse SQL according to ANSI specifications.

===============================================================================
03/03/2004 - jTDS 0.7.1 released
===============================================================================

Changes from jTDS 0.7
=====================

03/03/2004 - Alin Sinpalean
 o Added the 'macAddress' URL parameter allowing the user to specify the MAC
   address of the network interface card. There's no way to determine this from
   Java code and it can cause problems with licensing limitations.
 o Fixed an issue affecting SQL Server 6.5 related to binary data. Binary
   values were defined as 'binary(8000)' while the maximum length for 6.5 is
   255. (thank you, Mike)
 o Fixed bug [907431] (Statement does not return auto-generated keys). In fact,
   the actual issue was that if a execute was not called with
   RETURN_GENERATED_KEYS specified and then getGeneratedKeys() was called, an
   uninitialized ResultSet was returned instead of throwing an exception.
 o Finally added the API server cursor (sp_cursor procedures) documentation and
   the test results (excluding JSQLConnect, whose license prohibits this).

02/27/2004 - Alin Sinpalean
 o Fixed the implementation of cursor-based ResultSets obtained from prepared
   and callable statements with parameters. Initially I wrote no tests and I
   just supposed it will work. Well, I was wrong.
 o Wrote a test for the newly implemented functionality and it finally seems to
   work.

===============================================================================
02/26/2004 - jTDS 0.7 released
===============================================================================

Changes from jTDS 0.6
=====================

02/26/2004 - Alin Sinpalean
 o Applied part of a patch from Christian Ullenboom, with various small
   optimizations.

02/24/2004 - Alin Sinpalean
 o Applied Mike's changes as a result of testing the cursor-based ResultSets
   with SQL Server 6.5.
 o Introduced a serverVer field into TdsConnection to be able to check the DB
   version when using certain features (in particular SCOPE_IDENTITY as opposed
   to @@IDENTITY - the first is only available in SQL Server 2000).
 o Modified PerformanceTest to create (and drop) its own test table.
 o Added handling for BINARY data in ParameterUtils (for some reason, it wasn't
   treated the same way as VARBINARY and an exception was thrown).
 o Fixed PreparedStatement_base.setByte (it was setting the parameter type to
   SMALLINT instead of TINYINT, which lead to problems with negative values).
 o Added to the CVS tree a build file customized for JDK 1.3.

02/22/2004 - Brian Heineman
 o Removed usage of NEWID() for Sybase which does not exist in the 11.x
   versions; logic was replaced with VM generated unique id.  This
   implementation should perform much faster since no remote calls are
   required.

02/20/2004 - Brian Heineman
 o Implemented ResultSet.getDate(int,Calendar)
 o Implemented ResultSet.getTime(int,Calendar)
 o Implemented ResultSet.getTimestamp(int,Calendar)
 o Implemented CallableStatement.setDate(int,Date,Calendar)
 o Implemented CallableStatement.setTime(int,Time,Calendar)
 o Implemented CallableStatement.setTimestamp(int,Timestamp,Calendar)
 o Implemented PreparedStatement.setDate(int,Date,Calendar)
 o Implemented PreparedStatement.setTime(int,Time,Calendar)
 o Implemented PreparedStatement.setTimestamp(int,Timestamp,Calendar)

02/19/2004 - Alin Sinpalean
 o Implemented support for scrollable/updateable ResultSets from prepared/
   callable statements.
 o Implemented a fallback to FORWARD_ONLY ResultSets if cursor creation fails.
 o Fixed handling of TDS_COLINFO packets (these can contain the actual column
   name if the SELECT statement contained aliases; the alias/label is returned
   in the TDS_COLMETADATA packet).
 o Updated AbstractResultSet to handle requests for columns both by label and
   name (until now they were the same).
 o Improved the implementation of generated keys retrieval.
 o TdsStatement.getMoreResults() no longer returns update counts from end of
   ResultSets and end of process tokens.
 o Added a list of cursors-based ResultSets to TdsStatement and the code needed
   to maintain this list and close them when the Statement closes. This is not
   really enough, they should be closed on the next execute or close, but we'll
   see to that some other time.
 o Made ParameterUtils.verifyThatParametersAreSet() private and had it called
   from createParameterMapping, as they always appeared together in this order.

02/18/2004 - Alin Sinpalean
 o Made PacketRowResult.setElementAt much more flexible. It now converts the
   provided Objects into an acceptable internal type, to support the
   ResultSet.updateXXX methods (i.e. if the updated object is different than
   the one used internally by jTDS to represent that particular type, it is
   first converted into an acceptable type). getElementAt was also partially
   rewritten to support all these types, not only the fixed ones coming from
   the Tds.
 o Fixed a bug in CursorResultSet, which would cause an exception when updating
   ResultSets with read-only columns.
 o Improved handling of BINARY/VARBINARY data.
 o Added a test for out-of-order closes (particularly closing the Connection
   before the Statement, which caused an ArrayIndexOutOfBoundsException).

02/18/2004 - Brian Heineman
 o Corrected CallableStatement parsing of stored procedure names containing
   spaces.

02/17/2004 - Alin Sinpalean
 o Seems like yesterday I didn't commit part of the files. So here they are.
 o Fixed the ArrayIndexOutOfBoundsException thrown by TdsConnection.freeTds
   bug.
 o Updated the README and added a features.html file containing the feature
   matrix of jTDS.

02/17/2004 - Brian Heineman
 o Reduced memory allocated for Callable and Prepared statements by removing
   unused instance variable created for each SQL parameter.

02/16/2004 - Alin Sinpalean
 o Implemented updateRow and insertRow in CursorResultSet. Updateable
   ResultSets are now fully supported.
 o Updated DatabaseMetaData to reflect the newly added functionality.
 o Optimized the methods wrapping the sp_cursor calls.
 o Fixed an issue in TdsStatement where exceptions would get lost when the next
   result was a ResultSet or there were no more results (the warning chain was
   only checked in getMoreResults if the next result was an update count).
 o Small optimization in AbstractResultSet.
 o Added a simple test for inserting a row in a ResultSet.

02/15/2004 - Brian Heineman
 o Corrected bug in CallableStatement parsing where [ and " would cause the
   procedure name to be parsed incorrectly.

02/13/2004 - Brian Heineman
 o Minor cleanup of CallableStatement and refactoring of PreparedStatement
   procedure logic.
 o Removed extraneous UniqueId class, the logic is now handled in Procedure.
 o Improved performance of CallableStatement and PreparedStatement ~14% by
   reducing the number of times SQL is parsed.  Degraded performance of
   plain statements using escape processing and the Connection.nativeSQL call
   by ~6%; for now, the consolidation of parsing logic outweighs the minor
   degradation.

02/12/2004 - Alin Sinpalean
 o Fixed a nasty regression introduced by the new DECIMAL/NUMERIC code (null
   BigDecimals would cause an invalid packet, with scale -1).
 o Moved the driver class to the connection.properties file, instead of having
   it hardcoded in TestBase.
 o Updated a number of tests and added a test for updating a ResultSet (of
   course, it doesn't pass yet).
 o Added all the constants defined in the 1.4 Statement to TdsStatement, to make
   it compile with 1.3.

02/11/2004 - Alin Sinpalean
 o Implemented CursorResultSet.deleteRow() and wrote a unit test for it.
 o Added processing for TDS_TABNAME and TDS_COLINFO packets. Table names are now
   correctly set for SELECTs when the FOR BROWSE clause is specified and for the
   sp_cursoropen stored procedure.
 o Found a bug in CallableStatement_base (executeUpdate and executeQuery were in
   fact executed by PreparedStatement_base and return values/output parameters
   did not function). Fixed it and extended unit tests to include executeQuery
   (they only tested execute, before).
 o Fixed a bug pointed out by Mike Hutchinson in the developer forum
   (@@MAX_PRECISION does not exist on Sybase).
 o Corrected some uses of TdsComm.getByte() and getString() in Tds.
 o Detailed cursor-based ResultSet tests and fixed a number of bugs that were
   detected while running these tests.
 o Cursor creation method now sets the cursor type and concurrency options to
   match the values returned by sp_cursoropen in addition to adding a warning
   to the chain.
 o Wrote a test for bug [815348] - CallableStatement truncates varchar to 255.
   Test ran ok, bug closed.
 o Added a finally clause to PreparedStatement_base execute, executeQuery and
   executeUpdate that calls releaseTds. This is useful if an exception occurs
   while running the methods, but also if the execution only returns an update
   count (in which case, the result is completely processed and the Tds can be
   released).

02/11/2004 - Brian Heineman
 o Updated DatabaseMetaData.supportsBatchUpdates() to return true.

02/10/2004 - Alin Sinpalean
 o Applied Mike Hutchinson's patch to Tds and TdsComm, replacing
   CancelController with a boolean flag and fixing some other issues (see
   developer forum).
 o Removed unused local variables, made some local variables and class members
   final in Tds, cleaned up code.
 o Fixed a subtle bug in TdsConnection.allocateTds() (thanks Mike Hutchinson
   for pointing it out.
 o CursorResultSet.relative() now works according to the spec (i.e. same as
   next/previous), even if the cursor is positioned before the first row or
   after the last one.

02/10/2004 - Brian Heineman
 o Corrected bug in Statement.executeBatch() where batch values were not being
   cleared after execution.
 o Numerous (minor) optimizations to underlying Tds communication logic:
   reduced memory allocations and assignments; reduced cost of control logic.

02/09/2004 - Alin Sinpalean
 o Implemented CursorResultSet.isLast() and added a check to currentRow() to
   see if there is actually a current row (otherwise a NPE was thrown).
 o Updated SanityTest and UpdateTest to test the new features implemented in
   CursorResultSet.

02/09/2004 - Brian Heineman
 o Implemented ResultSet.updateAsciiStream().
 o Implemented ResultSet.updateBinaryStream().
 o Implemented ResultSet.updateBlob().
 o Implemented ResultSet.updateCharacterStream().
 o Implemented ResultSet.updateClob().
 o Implemented initial batch support PreparedStatement.addBatch(),
   Statement.addBatch(String), Statement.clearBatch() and
   Statement.executeBatch(); the current implementation provides the proper
   behavior but does not actually send batches of statements to the server
   (yet).
 o Corrected RETURN_GENERATED_KEYS usage to compile under 1.3.

02/08/2004 - Brian Heineman
 o Improved parsing of callable statements to be case-insensitive, allow
   whitespace between '?=' and support calls of stored procedures when no
   "exec" is specified.
 o Updated DatabaseMetaData.supportsGetGeneratedKeys() to return true.
 o Implemented DatabaseMetaData.supportsSavepoints().

02/07/2004 - Brian Heineman
 o Moved TdsStatement.releaseTds() calls into try {} finally {} statements to
   ensure connections are released back into internal pool even if an exception
   is thrown.

02/06/2004 - Brian Heineman
 o Applied patch [884180] Implement getGeneratedKeys() (thanks to Mike
   Hutchinson for the patch)
 o Corrected Blob and Clob threading issues that could have occured when
   streams were flushed.

02/05/2004 - Alin Sinpalean
 o Added the "lastUpdateCount" parameter to the URL and DataSource properties.
   If set to true, only the last update count is returned by executeUpdate(),
   as to avoid update counts returned by triggers being mistaken for the actual
   update count for PreparedStatements.
 o Reformatted code in Tds.java, CallableStatement_base.java.
 o Fixed an issue with update count handling when lastUpdateCount was false.
 o Fixed bug [729370], caused by BigDecimals with the scale greater than their
   precision (which is technically possible, but not supported by SQL Server).
 o Fixed some issues with Long and BigDecimal precision and scale handling,
   including using the correct precision for DECIMAL/NUMERIC fields, as
   supported by the server (either 28 or 38 decimals).
 o Added the "charset" parameter to the DataSource (it worked before, but only
   with the Driver, in the URL or Properties).
 o Removed redundant call to ParameterUtils.createParameterMapping() in
   Procedure.
 o Fixed a possible string length limitation issue for cursor result sets
   creation.
 o Fixed an issue that caused CallableStatement_base.registerOutParameter() to
   reset any value previously set for the parameter.
 o CallableStatement.execute now calls ParameterUtils.createParameterMapping()
   to correctly map parameters to native types. This fixes bug [815348 -
   CallableStatement truncates varchar to 255] caused by the parameter being
   sent as a "short" VARCHAR (length up to 255) instead of long (length up to
   8000 for VARCHAR and 4000 for NVARCHAR).

02/02/2004 - Brian Heineman
 o Synchronized Blob and Clob methods for thread safety.
 o Changed IllegalArgumentExceptions that were being thrown in BlobImpl and
   ClobImpl to SQLExceptions per JDBC specification recommendations.
 o Removed extranous DriverVersion class which was only being used to hold two
   variables.
 o Added Driver.toString() method that returns the current version per
   enhancement request [887120] DriverVersion.getDriverVersion().
 o TdsDataSource now implements ConnectionPoolDataSource.

01/31/2004 - Brian Heineman
 o Implemented Driver.getPropertyInfo().

01/30/2004 - Alin Sinpalean
 o Completely reimplemented CursorResultSet, to use the sp_cursor stored
   procedures instead of standard SQL cursors. This should fix a number of
   issues regarding scrollable result sets.
 o Cleaned up a lot packet processing. Tds does now all the low-level packet
   handling, with TdsResultSet no longer directly using packets.

01/30/2004 - Brian Heineman
 o Improved performance of Driver URL parsing by ~40%. URL's are now
   case-insensitive and provide better validation of the expected format.
 o Reduced Driver memory footprint.
 o Corrected bug in {fn concat()} translation; Sun javadoc shows double quotes
   but single quotes are expected.
 o Updated Sybase stored procedure name generation to "jTDS" + last 26
   characters of NEWID() [without the dashes].  This should solve the problem
   referred to in bug [822544] Issue connecting using alias on Sybase 11.9.2,
   jTDS 0.5.1.
 o Minor optimization for SQL Server stored procedure name generation.
 o Removed obsolete Sybase stored procedure generation code that was replaced
   with another solution.
 o Slight performance improvement when setting intial database state; reduced
   memory allocations.
 o "SET QUOTED_IDENTIFIER ON" and "SET TEXTSIZE 2147483647" is now explicitly
   sent to SQL Server per Microsofts recommendations:
   http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbcsql/od_6_015_0tf7.asp

01/29/2004 - Brian Heineman
 o Corrected bug where {fn concat(column1, column2)} would throw a SQLException.
 o Minor correction to translateTimestamp() where prefix assumed to be "d "
   instead of "ts ".
 o Improved escape sequence translation performance ~11% by reducing memory
   allocations and comparisions.
 o Removed translation and validation of {escape ''}; no need for the processor
   to do this as the database must check it anyhow.
 o Significant optimization to SQL parsing; new implementation is more than 10x
   faster.
 o Applied patch [851982] Client name not set in send70Login(). (thanks to
   mhilpert for the fix) This also fixed the following issues:
     [708727] hostname not set
     [886897] jTDS 0.6: Hostname still not set
 o Added missing "exec" per bug [822544] Issue connecting using alias on Sybase
   11.9.2, jTDS 0.5.1
 o Set instance variables to empty strings per bug [886449] TdsDataSource
   default null values cause issues.

01/28/2004 - Brian Heineman
 o Implemented mutator methods for BlobImpl and ClobImpl. Changes to LOBs will
   not be reflected in the database until the LOB reference is passed as a
   parameter to setBlob() or setClob().
 o Implemented getDatabaseMajorVersion().
 o Implemented getDatabaseMinorVersion().
 o Updated getJDBCMinorVersion() to return 1 instead of 0.

01/27/2004 - Brian Heineman
 o Added CONCAT to list of return values from
   DatabaseMetaData.getStringFunctions().
 o Implemented DatabaseMetaData.getJDBCMajorVersion().
 o Implemented DatabaseMetaData.getJDBCMinorVersion().
 o Implemented DatabaseMetaData.locatorsUpdateCopy().
 o Implemented DatabaseMetaData.supportsGetGeneratedKeys().
 o Corrected bug where {escape '''} was causing parameters to be calulcated
   incorrectly (this specific escape value is now invalid and an exception is
   thrown).
 o Improved parsing of {? = call} in EscapeProcessor to support whitespace
   around the '=' and to be case-insensitive.
 o Implemented {fn CONCAT()}
 o Improved SQL parsing performance when translating JDBC escape sequences.
 o Improved escape sequence error messages.

===============================================================================
01/25/2004 - jTDS 0.6 released
===============================================================================

Changes from jTDS 0.6-rc1
=========================

01/22/2004 - Alin Sinpalean
 o Modified again the DatabaseMetaData. Instead of just applying the patch
   provided by Mike I chose to do it my way, which was REALLY bad, so it
   finally ended up as it was initially.

01/21/2004 - Alin Sinpalean
 o Applied patch #880905 (EscapeProcessor does not handle {escape 'x'}
   properly) submitted by Brian Heineman, with some minor modifications.

01/20/2004 - Alin Sinpalean
 o Added the "sendStringParametersAsUnicode" parameter, to control whether
   NVARCHAR/NCHAR should be used when possible. If false, VARCHAR/CHAR are
   always used to prevent performance degradation under SQL Server 2000.
   (thanks to Wellington Mariusso for the original patch)
 o Implemented basic Blob/Clob support. (thanks to Brian Heineman for the
   patch)
 o Implemented PreparedStatement.SetAsciiStream and SetUnicodeStream. (again
   thanks to Brian Heineman for the patch)
 o Fixed two bugs with DatabaseMetaData on Sybase and SQL Server < 7.0 (thanks
   Mike Hutchinson for the patch)
 o Added a method to the Driver implementation to "uppercase" the Properties
   keys before passing them to inner classes for use.

01/16/2003 - Alin Sinpalean
 o Applied some patches and fixed some minor bugs.

===============================================================================
12/21/2003 - jTDS 0.6-rc1 released
===============================================================================

Changes from jTDS 0.5.2
=======================

12/21/2003 - Alin Sinpalean
 o Updated version to 0.6-rc1.
 o Even more code cleanup: moved result set context handling from TdsResultSet
   to Tds, which allowed the removal of the statements list (allStatements) in
   TdsConnection; also replaced all calls to Statement.skipToEnd with calls to
   Tds.skipToEnd, which is much more effective; database changes, transaction
   isolation level changes, auto commit mode changes, commits and rollbacks are
   now run directly on the Tds instance (and on all Tds instances) and
   TdsResultSet and TdsStatement now always check Tds.moreResults() before any
   processing to make sure the state was not changed from the outside (i.e.
   the output was not consumed by TdsConnection executing something).
 o Included a patch by Mike Hutchinson that completely fixes all issues
   regarding prepared Statements and fixed parameter types (i.e. executing a
   PreparedStatement initially with a shorter parameter submits a temporary
   stored procedure with a short type - e.g. VARCHAR - and a subsequent
   execution is limited by this type, cutting the parameter's length to its
   maximum value. The fix only matches temporary procedures by both the SQL
   string and the parameter types that can best accomodate the actual values.
 o Included a few small patches, regarding ResultSet.getString on BIT columns
   (it returned "true"/"false", now it returns "1"/"0"), some misunderstanding
   in Procedure, which treated backslash as an escape character and a possible
   issue with TEXT values being cut down to 4k (although not proved, and hard
   to believe).
 o Bugs fixed: 837235 (Working with SQuirreL SQL Client - 90% sure), 748856
   (jTDS Security error in sandbox), 741637 (Deadlock), 734505
   (ArrayIndexOutOfBounds in TdsResultSet.internalFetchRows), 692142 (jTDS
   autocommits data sometimes - 90% sure), 684567 (Problem with image fields in
   PreparedStatements), 803570 (java.sql.SQLException: Network error- Field too
   long).

12/16/2003 - Alin Sinpalean
 o A lot of code cleanup.

12/11/2003 - Alin Sinpalean
 o Fixed bug #694541 (ResultSet getDate & getTimestamp). Dates and Times are
   now normalized (by resetting the hour/minute/second/ms, respectively the
   day/month/year part).
 o Also fixed a bug with dates prior to January 1, 1970 (they would get all
   messed up because of negative values in the calculation).
 o Added some more flexibility to recognizing character sets (simply by
   prepending "Cp" respectively "MS", in case the returned character set is
   only a number).
 o Started refactoring, by moving the current Context from the ResultSet to the
   Tds. This way the Tds can skip to the end of the stream without any outside
   help. This will hopefully also help further refactoring.

===============================================================================
11/29/2003 - jTDS 0.5.2 released
===============================================================================

Changes from jTDS 0.5.1
=======================

11/27/2003 - Alin Sinpalean
 o Fixed bug #808452 (DatabaseMetaData.getTypeInfo() not JDBC compliant). Also
   added the @ODBCVer parameter to the other calls that support it.
 o Moved the "moreResults2 = true" statement to the end of Tds.executeProcedure
   to avoid the situation when an exception is thrown while building the PROC
   packet and the close code deadlocks in skipToEnd waiting for results when in
   fact there aren't any (this situation shouldn't really occur in normal
   situations, it happened to me because of a mistake I made in
   CallableStatement_base, which failed to set the type of a parameter).

11/26/2003 - Alin Sinpalean
 o Added support for CallableStatements with return values.
 o APPNAME and PROGNAME properties didn't actually work; issue fixed.

11/22/2003 - Alin Sinpalean
 o Cleaned up some of Matt's code (e.g. replaced calls to methods that were
   only introduced in Java 1.4 with equivalents to ensure backward
   compatibility).
 o Fixed an issue with the case sensitive database names (when changing the
   database jTDS checks if the old database is the same as what the server has
   returned and the check was case sensitive).
 o Removed some weird type checking and matching in TdsResultSetMetaData
   .getColumnType, which would define NCHAR, NVARCHAR and NTEXT as Types.OTHER
   rather than the correct Java type (this was causing problems with SQuirreL
   SQL when the column type of a ResultSet was checked -- particularly when
   browsing stored procedures and their parameters).
 o Removed the "synchronized" qualifier from TdsStatement.executeQuery, because
   it was causing deadlocks between threads creating scrollable result sets and
   threads closing other scrollable result sets (see unit test TimestampTest
   .testNestedStatements0026).

11/20/2003 - Matt Brinkley
 o Added support for Windows authentication for TDS 7.0.

10/02/2003 - Matt Brinkley
 o Fixed issue related to using catalogs with special characters in name in
   DatabaseMetaData.

08/30/2003 - Matt Brinkley
 o Added support for SQL Server 2000 named instances.
 o Fixed a small bug related to the ordering of the SQLExceptions thrown by
   TdsConnection.close().

02/15/2003 - Alin Sinpalean
 o Fixed bug #679040: database-specified charset preferred over client-
   specified.
 o Fixed bug #679041: (possible) charset problems with platform default
   encoding. Not so sure if all Strings read from the server should be
   converted using the EncodingHelper, but that's how it works now.
 o Also removed some checks and prints to System.out in Tds following warnings
   received (initially this was done because getWarnings was not implemented).

===============================================================================
01/30/2003 - jTDS 0.5.1 released
===============================================================================

Changes from jTDS 0.5
=====================

01/30/2003 - Alin Sinpalean
 o Hope I fixed the "Tds 0 already allocated" issue (for Tds other than 0 it
   seems to be a different issue, that has already been solved, but I have to
   check to make sure). The problem appeared when an exception was thrown
   while executing a scrollable statement or scrolling through it: Tds 0 was
   first allocated, but it wasn't freed because the exception would interrupt
   the normal flow. Moved the Tds freeing into a finally block and seems to
   work just fine, now.

01/29/2003 - Alin Sinpalean

 o Fixed CSUnitTest (had a problem because of the MONEY/SMALLMONEY precision
   issue) and modified build.xml (have no idea why it wouldn't work anymore,
   some problem with classpaths, had to execute the tests in the same JVM).
   Removed jakarta-ant-1.3-optional.jar and parser.jar, because they were not
   needed (jakarta-ant-1.4-optional.jar and crimson.jar contain just the same).

01/27/2003 - Alin Sinpalean

 o Fixed bug #664507: DatabaseMetaData.getIndexInfo() called sp_statistics with
   5 parameters instead of 6 (@index_name was missing). Thanks to Simon Kelly
   (simonkelly) for submitting the bug and the solution.
 o Fixed bug #644391: When using PreparedStatement.setObject(Timestamp), the
   date in database in off by a little more than a second, because the nanos
   are disregarded (the Timestamp is treated as Date).

01/20/2003 - Alin Sinpalean

 o jTDS feels completely strange after such a long while. I honestly hope the
   time will come when I'll be able to go back to real development... :(
 o Fixed bug #662295: Tds.writeDateTimeValue() adds nanoseconds twice under JDK
   1.4.1. The Timestamp.getTime() method adds in the nanos, then
   writeDateTimeValue() adds them again (line 3232) (Patrick Johnson -
   pjohnson73). Also some rounding problems when transforming from milliseconds
   to jiffies. The fix checks if the value returned by getTime() is an integral
   number of seconds and only in this case adds the nanoseconds (otherwise they
   were already added by getTime()). For the rounding problem .33 milliseconds
   are added to the value before converting it to jiffies. Seems to work fine.
 o Fixed a problem with MONEY and SMALLMONEY datatypes where the third and
   fourth decimals were intentionally dropped (no idea why).

12/18/2002 - Alin Sinpalean

 o Long time, no jTDS! Hope I'll have some more time to look after jTDS now
   that I found a new job...
 o Fixed bug #653510: the value returned by DatabaseMetaData.getUserName() was
   different from what the Microsoft driver returned (jTDS was returning "dbo"
   while the Microsoft driver was returning "sa"). Thanks to Jim McBeath for
   finding this out and providing a solution.

===============================================================================
11/11/2002 - jTDS 0.5 released
===============================================================================

Changes from jTDS 0.4
=====================

11/11/2002 - Alin Sinpalean

 o Fixed bug #636110: the warning chain of a result set was instantiated only
   at the end of the TdsResultSet constructor, but a warnig could have been
   added during the call to startResultSet() (also in the constructor) so a
   NullPointerException was thrown if a warning was encountered during loading
   a warning chain (e.g. if the result set contained no rows but it was
   returning a warning).

11/07/2002 - Alin Sinpalean

 o Temporarily fixed bug #632852:

     There appears to be an error in handling long (>4000/8000 bytes) data
     items. This occurs where a subsequent attempt to update data, using the
     same SQL statement, fails when executed via a different PreparedStatement.
     This situation will occur most often when the database connection is
     pooled for reuse for example in a web application.

     The cause of the error is that, when the second SQL statement matches a
     cached stored procedure, the data types of the parameters are not
     re-evaluated. This causes the code in TDS.executeProcedure() to pass a
     long String parameter as a VARCHAR parameter rather than a NTEXT causing
     the statement to fail on the SQL Server with the message "Error converting
     data type text to ntext".

   Thanks go to Mike Hutchinson, for locating and fixing the problem. A final
   solution, however would imply matching both the statement and the parameter
   types when searching for a compatible procedure.

11/01/2002 - Alin Sinpalean

 o Seems like SQL Server 6.5 does not support the extended Transact-SQL syntax
   for cursor declaration (at least not everything that's documented for SQL
   Server 7.0). So I make a choice based on the TDS version and use the
   extended syntax for 7.0+ and the SQL-92 syntax for older versions (and
   Sybase). I guess it's ok this way. :o)

10/29/2002 - Alin Sinpalean

 o Fixed CursorResultSet.next(): position was not incremented/decremented
   (probably since my last update). Anyway, correct position reporting will not
   work correctly in all cases until the sp_cursorXXX procedures are used
   instead of the current CREATE CURSOR/FETCH NEXT/FETCH PREVIOUS statements.

10/26/2002 - Alin Sinpalean

 o Fixed bug #629022 (also signaled in a post in the jTDS Help forum):
   DatabaseMetaData.getColumns() did not work if null was supplied as schema or
   table name. This was because a query was used to retrieve this information.
   Now sp_columns is used. This brings up another tiny issue: type numbers are
   wrong (e.g. -9 for NVARCHAR; it should be -1111 == unknown) but I guess it's
   not that bad.

10/23/2002 - Alin Sinpalean

 o Tiny change in CallableStatement_base constructor where the procedure name
   was parsed: periods were not considered to be part of a procedure name, so
   if a procedure name also containing catalog and/or schema was provided, only
   the first part of the name (up until the first period) was considered to be
   the procedure name. This meant that the schema or catalog was used as
   procedure name.

10/22/2002 - Alin Sinpalean

 o Implemented correctly the DatabaseMetaData methods getNumericFunctions,
   getStringFunctions and getSystemFunctions and added the corresponding code
   to EscapeProcessor (to convert the standard function names to SQL Server-
   specific function names -- I sure hope it works with Sybase, too as I have
   no way of testing this).
 o Implemented TdsStatement methods get/setFetchSize and get/setFetchDirection.

10/21/2002 - Alin Sinpalean

 o Fix in Tds.executeProcedure() if a Boolean was supplied as value for a
   parameter of type CHAR/VARCHAR, it crashed with a type cast exception. This
   should be checked when selecting the procedure, anyway (i.e. also check that
   the parameter types are compatible in addition to the generator string).
 o Fix in EscapeProcessor: for one reason or another backslash was treated as
   an escape sequence even inside the 'escape' string (e.g. "{escape '\'}" was
   incorrect because the backslash was considered an escape character).
 o Implementede DatabaseMetaData.getUDTs(). It now returns a hand-made empty
   result set; inspired from the MS driver's docs. :o)
 o Slight misunderstanding in TimestampTest.testGetBoolean0025(): not sure
   which VARCHAR/CHAR values are true and which are false with getBoolean().
   Have to take a look at this.

10/18/2002 - Alin Sinpalean

 o Bugfix in PacketResultSet.getLong(): CHAR values were not trimmed before
   being parsed.
 o Bugfix in Tds.writeDecimalValue(): if an Object which was not a subclass of
   Number was supplied (particularly a Boolean) writeDecimalValue crashed.
 o Bugfix in EscapeProcessor: escapes (all of them) were only recognized in
   lower case; also outer join escapes were parsed incorrectly (the last letter
   was cut off).
 o Bugfix in PreparedStatement_base: procedures were first added to the tds
   procedure cache and the proceduresOfTra collection and only then submitted
   to the DB server, which meant that if the submission failed further attempts
   to use the same (form of) statement would fail with 'procedure not found'
   which was a bit confusing.
 o Bugfix in PacketRowResult.getBoolean(): CHAR/VARCHAR/TEXT values were not
   correctly converted to boolean values. I'm not sure it's correct now either,
   but it works with the JDBCCTS. :o) Currently anything different from "0" is
   considered true.

10/17/2002 - Alin Sinpalean

 o Oooops! There were a lot of problems with my implementation from yesterday.
   It took me quite a lot of time to figure out where all those problems came
   from, but I finally managed to get to a state in which it seems to work. I
   even created a good test for it.

10/16/2002 - Alin Sinpalean

 o I think I fixed the 'cursor not found' issue with cursor result sets. Still
   need some testing to make sure it works fine, but it looks quite good. ;o)


===============================================================================
10/14/2002 - jTDS 0.4 released
===============================================================================

Changes from jTDS 0.3.2
=======================

10/14/2002 - Alin Sinpalean

 o Finally renamed packages from com.internetcds.jdbc to net.sourceforge.jtds.
   This calls for a new release of jTDS, as I promised. A lot of cosmetic
   changes took place at the same time, it's really hard to make a list of
   them. Currently there are 5 subpackages of net.sourceforge.jtds: jdbc (the
   former tds package, where most of the implementation is), jdbcx (with the
   TdsDataSource implementation), util (containing the Logger), test (with all
   the JUnit tests) and tools (containing some TDS reverse engineering tools).
   Hopefully the new structure will also help in getting more organized. The
   old sources are still available in the repository with all their history,
   under the src.old directory.
 o Bugfix (bug #621842, submitted and fixed by Anton Decusar and Andrei
   Chafirine): encoding Cp1251 is not recognized by jTDS because it is returned
   by SQL Server as 'cp1251' (with 'c' instead of 'C').

10/02/2002 - Alin Sinpalean

 o Bugfix (bug #617501): URLs of the form
   "jdbc:freetds:sqlserver://<server>:<port>" not recognized by jTDS. This is
   because database name was required initially and when I made it optional I
   did not check the way URLs were parsed. I think all URL forms are accepted
   now.

09/26/2002 - Alin Sinpalean

 o Long time, no work! :o)
 o Implemented PreparesStatement_base.setTime() and optimized a bit Tds
   handling of Time, Date and Timestamp objects in writeDateTimeValue(). Tried
   to make something out from bug #614698, but it looks like it's only a
   misunderstanding of the java.sql.Date type semantics. I'll close it.

09/20/2002 - Alin Sinpalean

 o Bugfix in CursorResultSet: next() always returned true for the first time,
   even if there was no data in the ResultSet. Seems to have been there for a
   long, long time. I added the beforeFirst() implementation but still didn't
   see it (not to mention that the implementation was broken from the very
   start because of the first row being prefetched). So, the first row is no
   longer prefetched, there's a "FETCH PRIOR" call that doesn't do anything but
   initializing the context. Thanks to wolfgang_a_h@gmx.at for finding the bug.
   (bug submitted later as #613199)
 o Bugfix #598679 (TdsConnection.getTypeMap not implemented): just looked at
   the javadoc comment for the method and it says that it should return an
   empty Map unless the application has added an entry. So, as the application
   can't add an entry (setTypeMap throws an SQLException as well :o) ) we'll
   just return an empty Map each time. :o)))


===============================================================================
09/20/2002 - jTDS 0.3.2 released
===============================================================================

Changes from jTDS 0.3.1
=======================

09/20/2002 - Alin Sinpalean

 o Bugfix in Tds: when the autocommit flag was set on a Tds, the transaction
   was automatically committed by Tds.changeSettings(). I think I was the
   brilliant mind that did that (because I had no idea about what I was doing
   at the time), but it was completely wrong. Removed.
 o TdsComm.startPacket throws an exception if there is still data left in the
   input buffer. The problem is that the data is never consumed, so that Tds is
   never closed. Temporary fix: dump the buffer contents. Will have to come up
   with something better.
 o TdsConnection.setCatalog() was synchronized on the statement while executing
   the query. The problem was that the statement might have been null. Fix:
   synchronization is made on the tds (again) if the Statement is null.
 o Implemented TdsResultSetMetaData.getColumnClassName(). Also much easier than
   feared. :o)

09/19/2002 - Alin Sinpalean

 o Created a goToNextResult() method in Tds, that eats up all input until the
   next relevant result (for a Statement or CallableStatement only ResultSets
   and TDS_DONE packets, for PreparedStatements also TDS_DONEINPROC packets)
   that is called in all the places where the processing of a result has just
   finished (or at least I hope so). This way, Tds objects are no longer held
   up by PreparedStatement executions, which also contain some end of procedure
   execution information (a return value, maybe output parameters and a
   TDS_DONEPROC packet).
 o Tested jTDS with the J2EE Compliance Test Suite (actually only part of it,
   because it's *very* slow) and after the fix mentioned above it doesn't hang
   anymore (it hanged because the J2EE disabled autocommit mode and the first
   time a DatabaseMetaData method was called -- one that uses PreparedStatement
   -- the Tds remained allocated to that PreparedStatement, another one was
   created and this second one deadlocked, waiting for the first one to commit
   the transaction). There are a few issues, still (e.g. supportsConvert()),
   but overall it seems to work! (It's also true that the CTS is completely
   braindead -- does not check anything else except the fact that the methods
   don't throw exceptions and return non-null ResultSets.)
 o Implemented DatabaseMetaData.supportsConvert(int, int)! Wasn't as hard as I
   thought it would be. :o)

09/18/2002 - Alin Sinpalean

 o Rewrote (or should I say, 'partially deleted') Tds.sendTds70Login() based on
   the information obtained from packet sniffing I did during the weekend. Much
   shorter and more concise.
 o Removed the initialization of the Tds where the default values for
   transaction isolation level and implicit_transactions were reinstated by
   jTDS. This way, creating a connection is 'a bit' faster.
 o Bugfix (#600286): when using TDS 7.0 jTDS sends the database name in the
   login packet or sends an empty string (like it did until now) if no database
   is specified in the URL/properties. TDS 4.2 sends a "use <database>" query
   if the database length is not 0. The database that was selected ultimately
   by the server is obtained through processing all TDS_ENVCHANGE packets, then
   TdsConnection gets it from Tds (the relevant TDS_ENVCHANGE packet is parsed
   in the Tds constructor, so the database name is already there for
   TdsConnection. This way, Driver TdsDataSource don't have to define a default
   database name ("master") so they start with an empty string. That's about
   it! :o)

09/18/2002 - Alin Sinpalean

 o Lots of changes and improvements here! All of them were done until yesterday
   but unfortunately I could not commit them last night so I'm going to do it
   now. I'll also try to do a list of changes, as exact as possible. Here goes.
 o Removed the main methods from all non-test classes that had one. They were
   doing some testing, unfortunately I don't have the database structure on
   which they worked and there are a lot of other tests, so I decided to just
   wipe them out. And, another thing: they were unnecessarily adding to the
   size of the .jar file.
 o Made the cancel mechanism work. I have no idea if it ever worked (or if it
   did, if it ever worked right) but it sure doesn't seem so. This means
   changes to CancelController (only one cancel request can be outstanding at a
   time, no more waiting for the cancel ack), TdsComm (no longer eating up
   input by simply ignoring it), Tds (processing of any outstanding cancel when
   executing a query or procedure, throwing an exception when a query times
   out), Prepared_Statement (this was the only point where data was left for
   Tds to ignore instead of being processed, so I fixed that by calling
   skipToEnd before each procedure call), TdsStatement (check for exceptions
   after each execution to see if it wasn't cancelled, cancel() is no longer
   synchronized -- this actually prevented it from working).
 o TdsComm had a static counter for instances for debugging purposes, but each
   instance used that counter as id instead of having its own member to record
   the value of the counter at the time of its creation. Fixed.
 o Changes to Logger in order to close output streams when no longer using
   them. (Maybe this is not as smart as I thought it would be, I'm not sure
   what happens if we close System.out.)
 o Synchronized calls to execute methods from CursorResultSet as this was a
   pretty subtle source of errors: when a CursorResultSet was finalized it ate
   all outstanding results on the Statement, which meant trouble for any other
   concurrent ResultSets. By synchronizing these calls, CursorResultSets will
   not interfere with each others results, but they will still interfere with
   any TdsResultSets (however this is not such a big problem, since the
   probability of having both scrollable and non-scrollable on the same
   Statement is quite low).
 o Added a test in SAfeTest for the cancel mechanism and it seems to work just
   fine. :o)

09/16/2002 - Alin Sinpalean

 o Even bigger clean-up of most of the base classes: TdsStatement,
   TdsResultSet, TdsConnection etc. Lots of changes, so it's pretty
   hard to make a list of them. Anyway, major changes include: synchronization
   and visibility changes in TdsStatement, Logger no longer throws IOExceptions
   (it's kind of stupid to do that), TDS_XXX token name changes, processing of
   database changes in Tds, SQLWarningChain clears the exceptions list when
   throwing one. That's about it.
 o Created a "specification" for TDS 7.0 based on 2 days of packet sniffing.
   Still in preliminary stage, but contains a lot of information. I will have
   to match it up against existing specifications from FreeTDS and other
   sources to make sure I wasn't wrong about things, then I'll probably publish
   it on the documentation page of the project's site.

09/14/2002 - Alin Sinpalean

 o Fix in TdsResultSetMetaData: getColumnTypeName() crashed on SYBBITN columns.
 o Fix in TdsConnection: on close(), not all Statements were closed, because
   the for was going from 1 up but Statements were removed from the Vector as
   they closed, so every second Statement was skipped.
 o Moved startResultSet logic from TdsStatement to TdsResultSet.
 o Massive clean-up of TdsStatement: simplified the way getMoreResults()/
   getResultSet() works. There are still some issues with Tds objects remaining
   allocated, but I will try to fix them.

09/13/2002 - Alin Sinpalean

 o Fixed DatabaseMetaData.getColumns() (temporarily, the final solution would
   be to use a system stored procedure as with all the other meta data methods)
   thanks to Dale Anderson (entraspan), author of the bug, and ultimately,
   solver. I'm not sure this works on SQL Server 6.5, but it seems like no one
   is using that anymore.
 o Implemented CursorResultSet.beforeFirst() and CursorResultSet.afterLast().
   There's an even bigger problem with CursorResultSet: a different Tds could
   be allocated to the Statement than the one on which the cursor was created,
   which will inevitably lead to a crash. Now I start to understand what the
   mainTds thing was for. :o)

09/11/2002 - Alin Sinpalean

 o Optimized TdsComm.getBytes() to use a fixed buffer and not allocate a new
   one every time if not necessary (e.g. when reading in bytes that will be
   turned into a String and no longer used). Performance is much better now,
   although I didn't have the time to do a comparison.
 o Added tests in all non-private methods of TdsResultSet to see check if it's
   open or not (an SQLException is now thrown instead of the
   NullPointerException that was usually thrown when the ResultSet was closed).

09/10/2002 - Alin Sinpalean

 o EscapeProcessor now accepts all JDBC escape sequences (including stored
   procedure calls). CallableStatement_base, however, needs some more work in
   order to "understand" the "{?=call ...}" sequence (a hell lot of work). :o(
 o Reduced "a bit" (from 2000 to 100) the number of connections created by
   TimestampTest.testConnection0039 because there was really no justification
   for that and it took 20 seconds. Really need to write some more tests and
   reorganize the existing ones...
 o Just tested jTDS with SQLDeveloper (http://sqldeveloper.solyp.com), a very
   interesting database manager based on JDBC. The only problem I encountered
   this far (and fixed) was that AbstractResultSet (and CursorResultSet) got
   the context from the 'current row' instead of using their own getCursor()
   method, which meant that when no 'current row' existed, an SQLException got
   thrown. Now, everything seems to work fine. :o)

09/09/2002 - Alin Sinpalean

 o Removed relinquish() from ConnectionHelper interface. I don't even know what
   ConnectionHelper is for...
 o Chenged Statement.closeResults() and ResultSet.close() by adding a parameter
   which says if the Tds should be released or not, if possible.
 o Modified a bit TdsStatement.skipToEnd() to also include a call to
   closeResults(). This way, skipToEnd() will work regardless of the state the
   Statement is currently in.

09/08/2002 - Mike Hutchinson, Alin Sinpalean

 o Alin: First of all I have to thank Mike for the ideas (these were all his)
   and the patch he sent me. I took the liberty of changing them as I saw fit
   (there were some small issues, but all in all the ideas are simply great).
 o Moved the logic for commit/rollback to Tds instead of TdsStatement. This way
   it's possible to not rollback a Tds when the Statement is closed (which, as
   Mike noted, is wrong).
 o TdsConnection.close now rolls back explicitly all Tds objects prior to
   closing them (this was done until now by TdsStatement.close(), which was
   wrong).
 o TdsConnection.commitOrRollback calls directly the commit() and rollback()
   methods of Tds instead of TdsStatement, due to the changes above.
 o PreparedStatement_base.execute() only adds the newly created stored
   procedure to tds.proceduresOfTra if the Connection is not in autoCommit
   mode.
 o TdsStatement.releaseTds() releases the Tds even if in manual commit mode.
   This is possible because we're no longer commiting Statements but the Tds
   connections themselves.
 o TdsStatement.close() no longer calls rollback(). This was wrong.
 o TdsStatement.close() only called Connection.markAsClosed(this) if actTds was
   not null (which was ok considering the way jTDS worked until now). However,
   since a TdsStatement can now release the Tds even when in manual commit mode
   markAsClosed always has to be called. Even if this is sometimes redundant it
   ensures Statements are removed from the Connection's list of active
   Statements not causing any memory leakage (which, as I understood from Mike,
   was pretty serious, leading to VM crashes).
 o Removed TdsStatement.commit(), TdsStatement.rollback(),
   TdsStatement.finalize() and TdsResultSet.finalize() as they were no longer
   needed.


===============================================================================
09/06/2002 - jTDS 0.3.1 released
===============================================================================

Changes from jTDS 0.3
=====================

09/06/2002 - Alin Sinpalean

 o The modifications to EncodingHelper did not take into account multiple-byte
   charsets (they were hardcoded before). Now this is automagically determined
   based on the size of the resulting String (if same, then it's a single-byte
   charset).
 o Modifications to the EncodingHelper and Tds for a better encoder management
   and changed the default encoding to Cp1252 (when SQL Server responds with
   'iso_1' - that's inexact, SQL Server is, in fact, using Cp1252).
 o Tds.discardResultSet fix: if an error or warning was returned immediately
   after a ResultSet that was not read completely, but discarded, jTDS crashed
   because it only expected TDS_DONE* tokens.

09/05/2002 - Alin Sinpalean

 o Added jdbc3_0-ext.jar to the lib folder, containing the .class files for
   java.sql.Savepoint and java.sql.ParameterMetaData and changed the libraries
   used by JBuilder to include this jar, too. This allows compilation of the
   changes made by Justin under JDK 1.3 and should not affect compilation under
   JDK 1.4.
 o Fixed CursorResultSet.createCursor(): SCROLL_INSENSITIVE cursors could not
   be created because of a syntax error.

09/03/2002 - Justin SB

 o Added stubs to enable compilation with JDK 1.4 (no new functionality)

08/30/2002 - Alin Sinpalean

 o TdsResultSetMetaData.get* fixed (Bug #598911). Still a couple of
   incompatibilities with the JDBC-ODBC bridge, due to the fact that I consider
   their implementation to be incorrect.
 o Synchronized TdsConnection. Still need to do some similar work on Statements
   and ResultSets, but it's a good job, anyway (I hope no deadlocks were
   introduced because of this).
 o Implemented TdsConnection.setCatalog. The dirty way, but it works.

08/28/2002 - Alin Sinpalean

 o Modifications to the javadoc comments in a lot of places (warnings were
   thrown by javadoc).
 o Beautification of TdsDefinitions.
 o TdsConnection.getMetaData() no longer allocates a Tds, because it didn't use
   it anyway. The Tds instance DatabaseMetaData contains is used only for calls
   to methods returning constant values (for that Tds instance).
 o Started fixing Bug #598911 (ResultSetMetaData.get* incorrect):
   Tds.lookupColumnSize() returns the display size rather than the length in
   bytes for fixed size columns, TdsResultSetMetaData.getColumnTypeName()
   returns the SQL Server-specific names of columns, rather than INT1, INT2
   etc.
 o DatabaseMetaData changes: implemented getCrossReference(), changed
   getCatalogs() implementation, removed makeTypeTable() -- no longer used.
 o Changed the implementation of almost all methods in DatabaseMetaData to use
   standard stored procedures instead of the custom but unsafe code. Only a
   couple of methods are still using the old way (getColumns because of custom
   types and getSchemas because the result would be the second column and it's
   currently impossible to hide any columns but the last ones).

08/26/2002 - Alin Sinpalean

 o Database name is no longer explicitly required in the URL for the driver or
   to be set for the DataSource. The default value for it (if not specified) is
   "master", which is ok for SQL Server, but of which I'm not so sure of for
   Sybase (Bug #598886).
 o Changed the implementation of DatabaseMetaData methods getProcedures,
   getProcedureColumns and ... to use SQL Server-defined stored procedures, for
   increased performance and better compatibility with other drivers.

08/23/2002 - Alin Sinpalean

 o Improved NULL, 0-length and single-space string handling (both when sending
   parameters and receiving values.
 o Tds.rollback() just drops all procedures submitted during the last
   transaction rather than resubmitting them (no one can guarantee they will be
   used again, so better just drop them).
 o Removed TdsComm.backup() - wasn't used anymore and was pretty dangerous
   anyway.
 o Changes to AsTest and CSUnitTest to reflect the way update counts are
   returned from PreparedStatements and CallableStatements.
 o Added a freetds.SAfeTest test to test the NULL, 0-length and single-space
   string handling.

08/21/2002 - Alin Sinpalean

 o jTDS officially became "jTDS Type 4 JDBC 2.0 driver for MS SQL Server", as
   DatabaseMetaData.getDriverName() returns this value.
 o Not directly related to the development of jTDS, The jTDS Project finally
   has its own homepage: http://jtds.sourceforge.net

08/20/2002 - Alin Sinpalean

 o Added a Statement member to the Tds class, that should point to the
   Statement currently using the object (if any, null if not used). Using this
   the Tds can decide whether to return update counts from DONEINPROC packets
   if the current Statement is a PreparedStatement. This way, PreparedStatement
   can return update counts from inside stored procedures while Statement
   doesn't.
 o Fixed the tests that failed because of the fact that more Statements were
   allocated at once (meaning some of them were not able to create the
   temporary tables/stored procedures created by others) by closing the
   Statements when they were no longer needed.
 o Implemented all methods of ResultSetMetaData except getColumnClassName and
   used case sensitivity and table name from result packets (both TDS 4.2 and
   TDS 7.0). (Request #587751)
 o Fixed TdsStatement.rollback(): calls Tds.rollback() when not in autocommit
   mode, in order to redefine all missing stored procedures.


===============================================================================
08/19/2002 - jTDS 0.3 released
===============================================================================

Changes from jTDS 0.2
=====================

08/19/2002 - Alin Sinpalean

 o Check for ENVCHANGE packets in TdsStatement.getMoreResultsImpl (if a query
   that changed the environment was executed, the driver crashed because of
   unrecognized packet types - ENVCHANGE).
 o Added a fakeColumnCount to Columns to mask columns to the end user (e.g. for
   meta data use).
 o Implemented methods in DatabaseMetaData: getColumnPrivileges,
   getTablePrivileges, getTypeInfo, getBestRowIdentifier, getVersionColumns.
   Also some minor changes to methods returning constant values.
 o Bugfix (#595022): Hidden the rowstat column returned by CursorResultSets.

08/16/2002 - Alin Sinpalean

 o DatabaseMetaData.getSchemas() fix: TABLE_CATALOG column was also returned as
   a result column; removed it.
 o TdsResultSet.fetchNextRow() fix: the Tds was not released when the end of
   data was reached; now it is.
 o TdsConnection.prepareCall() fix: a useless call to allocateTds() was made,
   which locked a Tds that was never released again; commented out.
 o Fixes in the tests: AsTest, CSUnitTest, PreparedStatementTest, TestBase,
   TimestampTest.
 o Condition in Microsoft7MetaData.getProcedures() to avoid
   NullPointerExceptions when a null schema pattern was provided.

08/15/2002 - Alin Sinpalean

 o Rewrote build.xml.

08/14/2002 - Alin Sinpalean

 o Added support for the UNIQUEIDENTIFIER datatype.
 o Created a com.internetcds.jdbcx.tds package containing a DataSource
   implementation and an object factory (alpha version, not even tested with
   JNDI - I tried to do it but it doesn't seem that easy). Anyway, it's a
   starting point.

08/13/2002 - Alin Sinpalean

 o Fix in CursorResultSet: if no rows were returned by the query, loadContext
   failed with a NullPointerException when trying to get the current row's
   context. Now the context is loaded in internalFetch -- not very elegant, but
   at least it works. ;o)

08/08/2002 - Alin Sinpalean

 o DatabaseMetaData.getInstance() now returns a DatabaseMetaData or
   Microsoft7MetaData based on the TDS version rather than the server version.

08/06/2002 - Alin Sinpalean

 o Optimized the implementations of TdsComm.getBytes(int) and TdsComm.peek();
   they are no longer using TdsComm.getByte(), which was slowing them down.
 o Implemented getExportedKeys.
 o TDS 7.0 is now the default protocol used by jTDS.

08/05/2002 - Alin Sinpalean

 o Added a databaseMajorVersion member to the Tds class to help make the
   difference between SQL Server versions (e.g. for DatabaseMetaData usage).
 o Fixed some of the additions Jason made, most of them due to the fact that
   he probably used SQLServer 2000 while I am using 7.0 (there could be some
   even bigger problems for people using SQLServer 6.5, if there are any) and
   a problem related to getTables - catalog name for tables in other databases
   (catalogs) were wrong (pubs was used instead of the catalog name).
 o Added implementations to methods without parameters returning boolean values
   in DatabaseMetaData (based on values returned by the JDBC-ODBC and some
   other drivers).
 o Bugfix 587749: Bit to Int conversion works. So does Binary to String.

08/05/2002 - Jerason Banes (patch)

 o Fixed the following methods in DatabaseMetaData: getSchemas, getTables,
   getColumns, supportSchemasInTableDefinitions.
 o Implemented the following methods of DatabaseMetaData: getIndexes,
   getPrimaryKeys, getImportedKeys.

07/xx/2002 - Alin Sinpalean
 o TdsStatement checks if it isn't already closed on a call to close() and the
   allocated Tds object isn't freed until no more results are available
