===============================================================================
08/22/2007 - jTDS 1.2.2 released
===============================================================================

Changes from jTDS 1.2.1
=======================

08/18/2007 - Brian Heineman
 o Applied Mike Hutchinson's fix for bug
   [1774322] Sybase nulled text fields return not null
 
08/05/2007 - Brian Heineman
 o Applied patch [1592113] NTLMv2 properties on datasource.
 o Applied patch [1236417] 64-bit support for Single Sign On (SSO)
 o Applied patch [1504761] Itanium and AMD64/EM64T 64 bit support for SSO
 o Implemented feature [1491811] sqlState code for snapshot conflict.
 o Updated SQL Server sqlState codes.

08/02/2007 - Brian Heineman
 o Corrected bug [1765905] Driver version miscellanea is incorrect;
   updated to 1.2.2.

===============================================================================
07/12/2007 - jTDS 1.2.1 released
===============================================================================

Changes from jTDS 1.2
=====================

07/12/2007 - Brian Heineman
 o Applied patch from Alin Sinpalean for concurrent batch updates.
 o Corrected Java 1.3/1.4 compile problem.

07/11/2007 - Brian Heineman
 o Applied patch from Alin Sinpalean for cursor exception handling.
 
07/08/2007 - Brian Heineman
 o Corrected bug [1571660] Changed reference from Statement.EXECUTE_FAILED
   (which was added in Java 1.4) to JtdsStatement.EXECUTE_FAILED.
 o Applied patch [1567127] Eclipse javadoc warnings.
 o Applied patch [1567332] Updated build file to work with or without
   backslashes on Windows.  This also fixes the problem of having spaces
   in the JAVA_HOME path.
 o Applied patch [1567151] HTML validation patches.
 o Applied patch [1567994] Updated equality checks.
 o Corrected bug [1623668] Lost apostrophes in statement parameter
   values (prepareSQL=0) by applying the patch mentioned in the issue;
   added test to ensure that there are no regressions.
 o Corrected bug [1437845] milliseconds are lost under JRE 1.3 by applying
   the patch attached to the issue.
 o Corrected bug [1696767] incorrect ResultSetMetaData when useLOBS=false by
   applying the patch mentioned in the issue.
 o Corrected bug [1453552] JTDS Driver returns wrong column type with sybase
   by applying the patch attached to the issue.
 o Corrected bug [1374518] rollback fails on Sybase 12.5 by applying the patch
   attached to the issue.
 o Corrected bug [1460746] Batching of Prepare Statements by applying the patch
   attached to the issue.
 o Applied patch [1460207] Connection.setCatalog() has invalid check
 o Implemented feature [1749962] Temporary directory should be configurable
 o Corrected bug [1596743] executeQuery absorbs thread interrupt status  by
   applying the patch mentioned in the issue.
 
06/23/2006 - Matt Brinkley
 o Oops...checked in some test code.  I backed out those changes.

06/23/2006 - Matt Brinkley
 o Fixed the flags passed for NTLMv2 authentication.  Before the fix,
   authentication would fail in configuration where Minimum Session
   Security for NTLM SSP based (including secure RPC) Servers setting
   was set to 'Require NTLM v2 session security'.

05/19/2006 - Alin Sinpalean
 o Fix the previous changelist. Copy-paste didn't really help there.

05/18/2006 - Alin Sinpalean
 o Added support for SNAPSHOT transaction isolation, in the same way as the
   new MS driver -- using setTransactionIsolation(4096).

04/05/2006 - Matt Brinkley
 o NTLMv2 auth fix: now it doesn't NPE if server fails to send target info.

03/23/2006 - Matt Brinkley
 o Added NTLMv2 support for windows authentication.

01/12/2006 - David Kilzer
 o Applied Mike Hutchinson's fix for Bug [1403067] ProtocolException:
   Invalid table TAB_NAME_TOKEN.  TdsCore.tdsTableNameToken() now handles
   tables referenced using server.database.owner.table syntax.  Also
   modified exception code to include the unknown TAB_NAME_TOKEN value.

12/22/2005 - David Kilzer
 o Replaced JtdsObjectFactoryUnitTest.testAllProperties() method with an
   inner class that extends DefaultPropertiesTestLibrary to make this
   test class fail automatically when a new property is added to the
   library class.  Removed stale comments in JtdsDataSourceUnitTest.
 o Fixed Bug [1386615] Connecting across domains with named pipes fails
   on Windows.  New 'useJCIFS' boolean parameter added that will force
   use of the jCIFS library on Windows for named pipe connections.
 o Updated ConnectionJDBC2UnitTest class to check for both an instance
   field and a getter for all properties.  Added "missing" getters to
   ConnecionJDBC2 class:  getAppName(), getBufferMaxMemory(),
   getBufferMinPackets(), getDatabaseName(), getMacAddress(), getNamedPipe(),
   getProgName(), getWsid().  Renamed package-private getters in
   ConnectionJDBC2 class that returned boolean values to use "get" instead
   of "is":  getLastUpdateCount(), getUseUnicode().  Moved
   DefaultPropertiesTestLibrary.ucFirst() to UnitTestBase class.
 o Fixed default path for named pipes on Sybase.  (Previous behavior
   would always default to the SQL Server path!)  Added
   DefaultProperties.getNamedPipePath() method with unit tests.

12/21/2005 - David Kilzer
 o Extracted the JtdsDataSource.addNonNullProperties() method from
   getConnection(String, String) method for easier testing.  Added inner
   test class Test_JtdsDataSource_addNonNullProperties to
   JtdsDataSourceUnitTest to test new addNonNullProperties() method.
   Replaced call to Exception.getStackTrace() in
   getConnection(String, String) with a call to Support.linkException().
   Fixed addNonNullProperties() to set the serverType parameter if it is
   not null.  Note that this does not affect Driver.parseURL() which
   ends up (re)setting that property from the URL.

12/20/2005 - David Kilzer
 o Implemented RFE [1291335] Provide a mechanism for binding to a local
   IP address.  New "bindAddress" parameter introduced (Java 1.4 and newer
   only).
 o Updated UnitTestBase.invoke*() methods to link original exceptions to
   RuntimeExceptions.  Added new UnitTestBase.invokeSetInstanceField()
   method.  Added back suite tests to JtdsDataSourceUnitTest that test
   default values on the JtdsDataSource class and its getReference()
   method by setting the default values through reflection before testing.
   This allows one new test method to be added to the
   DefaultPropertiesTestLibrary class and for tests to fail everywhere a
   developer hasn't implemented a new driver property yet.

12/19/2005 - David Kilzer
 o Changed reference to old 'TdsDataSource' class in faq.html to newer
   'JtdsDataSource' class.
 o Alphabetized parameters in faq.html to make them easier to find.
 o Added missing </code> tag in "badrpc" question in faq.html.
 o Updated the loginTimeout parameter information in faq.html to document
   behavior with TCP/IP connections.
 o Fixed the "What are the class names...?" question to match the TOC
   entry.

12/19/2005 - Alin Sinpalean
 o Minor optimization in determining the scale for decimal parameters.

12/05/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1371295] executeBatch returns incorrect counts.
   Batch updates now always return an array of length equal to the batch size,
   padded up with EXECUTE_FAILED values if necessary.
 o Applied Mike's fix for a bug related to [1368058] Calling StoredProcedure
   with functions (identifiers containing special characters not parsed).

11/25/2005 - Alin Sinpalean
 o Corrected bug [1358059] Memory leak in add/remove statement. The remove
   statement logic did not remove the WeakReference if the Statement had been
   garbage collected.
 o Corrected an issue in TdsData causing CHAR columns containing single blanks
   to be returned as zero length strings.
 o Removed redundand call to checkClosed() in TdsCore.
 o Removed duplicate entries from Charsets.properties.

11/23/2005 - Alin Sinpalean
 o Made a few modifications to the test suite to accomodate changes in SQL
   Server 2005.

11/09/2005 - Alin Sinpalean
 o Corrected bug [1351891] Using JtdsCallableStatement.setFloat causes
   SQLException. findParameter() was called as if to retrieve parameter values
   from the setByte(), setDouble() and setFloat() methods, which caused the
   parameter not to be found.

===============================================================================
10/08/2005 - jTDS 1.2 released
===============================================================================

Changes from jTDS 1.1
=====================

11/03/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1346086] Problem with DATABASE name change on
   Sybase.
 o Applied patch [1250393] modify getJdbcType() to handle subclass of basic
   JDBC types, submitted by  Joel Schneider (cognophile).
 o Corrected a minor DatabaseMetaData error: supportsTransactionIsolationLevel
   returned true for TRANSACTION_NONE or any invalid value.

10/31/2005 - Alin Sinpalean
 o Corrected bug in JtdsDatabaseMetaData.getBestRowIdentifier(). Statement was
   closed, causing errors when using the returned result set.

10/27/2005 - Mike Hutchinson
 o Fixed bug "[1305275] Cursor opens fails when cursor threshold <> -1" by
   amending MSCursorResultSet.
 o Fixed bugs "[1283472] Unable to cancel statement with cursor resultset" and
   "[1323363] Deadlock Exception not reported (SQL Server)" by amending
   JtdsStatement executeSQL() and executeSQLQuery().
 o Fixed a bug in handling output parameters that occurs when invoking remote
   stored procedures. The TdsCore.tdsOutputParamToken method was amended.
 o Implement RFE "[1289687] configurable socket setSoTimeout()". This also
   offers a solution to bug "[1297306] Network problem can cause jTDS hang-up".
 o Fixed bug "[1246270] Closing a statement after cancelling it throws an
   exception" by amending JtdsStatement.close().
 o [SQL Server 2005] Database meta data has been improved so that getColumns()
   can distinguish between text and varchar(max), image and varbinary(max) etc.
   Changes were required to JtdsDatabaseMetaData.getColumns() and a new method
   getMSTypeName was added to TdsData. A test case has been added to Tds8Test.
 o [Sybase ASE 15] Added support for new data types unitext, bigint and
   unsigned smallint, int and bigint. This enhancement required changes to
   TdsCore, TdsData and ResponseStream. New test cases have been added to
   Tds5Test.
 o [Sybase ASE 15] With ASE 15 the default packet size is now 2048 bytes. The
   ConnectionJDBC and DefaultProperties classes have been amended so that the
   server default is used when there is no packetSize connection property
   present.
 o [Documentation] Modified faq.html to document bug [1260507]
   CallableStatement Exception and the new soTimeout connection property.
 o [Documentation] Modified typemap.html to document the new Sybase datatypes.

10/20/2005 - Alin Sinpalean
 o Corrected bug [1293415] Charset iso_1 is broken for Sybase. For Sybase the
   server's iso_1 charset maps to the standard ISO-8859-1, rather than Cp1252
   as it does for MS SQL Server.
 o Applied Mike's fix for bug [1330118] SSL fails with SQL 2005 September CTP.
 o Applied Mike's fix for bug [1329765] Pseudo column ROWSTAT is back with SQL
   2005 (September CTP).

10/18/2005 - Alin Sinpalean
 o Corrected bug [1327029] setFetchSize give incorrect error message.
 o Corrected bug [1296482] setAutoCommit() behaviour. According to section
   10.1.1 of the JDBC 3.0 spec (which takes precedence over the API
   documentation) the transaction should only be committed if the auto-commit
   mode is _changed_ during a transaction.

09/27/2005 - David Kilzer
 o Added info to the FAQ about the jTDS implementation of
   javax.naming.spi.ObjectFactory.

09/26/2005 - David Kilzer
 o Applied Mike's patch for bug [1299147] Latest change does not compile
   with java 1.5.  This patch cleans up the use of checkOpen() in a
   number of methods in JtdsCallableStatement, JtdsPreparedStatement,
   JtdsStatement and JtdsResultSet.

09/23/2005 - David Kilzer
 o Fixed compilation on Java 1.5 in MessagesPropertiesUnitTest.  Thanks
   to Mike Hutchinson for the patch in bug [1299147] Latest change does
   not compile with java 1.5.

09/22/2005 - David Kilzer
 o Added MessagesPropertiesUnitTest to ensure every prop.* property has
   a matching prop.desc.* property and vice-versa.

09/21/2005 - David Kilzer
 o Applied patch for bug [1253127] Improved decimal peformance for MSSQL
   SP4 by Mike Hutchinson.  This patch also fixes bug [1236078] Procedure
   doesn't get called for some BigDecimal values (in Java 1.5).

09/20/2005 - David Kilzer
 o Removed RequestStream.setMaxPrecision() and added a 'maxPrecision'
   argument to the RequestStream constructor.  This value should never
   change during the life of the RequestStream, and thus should be set
   in the constructor.  Updated SharedSocket.getRequestStream() method.
 o Refactored SharedSocket constructor to take only a single argument
   of type ConnectionJDBC2.  Added some package-private getter methods
   to ConnectionJDBC2.
 o Replaced SharedNamedPipe.instance() method with a public constructor.
 o Simplified SharedNamedPipe and SharedLocalNamedPipe constructors by
   passing in a ConnectionJDBC2 object instead of a laundry list of
   data values.  Added more package-private getter methods to the
   ConnectionJDBC2 class.  Moved SharedNamedPipe.calculateBufferSize()
   to Support.calculateNamedPipeBufferSize().  Changed hard-coded buffer
   values in SharedLocalNamedPipe constructor to use the value returned
   from Support.calculateNamedPipeBufferSize().

09/09/2005 - David Kilzer
 o Applied Mike's patch to fix a small bug with getProcedureColumns() in
   JtdsDatabaseMetaData and SQL Server 7.0 where the RETURN_VALUE
   parameter was not prefixed with an '@' character.

09/07/2005 - David Kilzer
 o Extracted code from the original Support.linkException() method to accept
   generic Exception objects.  Provided linkException() convenience methods
   for SQLException and SQLWarning classes.  Linked IOException thrown from
   ConnectionJDBC2.createNamedPipe() for connection timeouts using the new
   method.
 o Applied Mike's fix for bug [1273988] Insert UTF8 string fails when length
   is 255 (ASE12.5.2).

09/06/2005 - David Kilzer
 o Applied patch for bug [1277000] "All pipe instances are busy" error not
   handled properly.  Added TestAllPipInstancesAreBusy tool class which is
   used to manually reproduce the error.  Updated "loginTimeout" entry on
   FAQ.  Added more use of Support.linkException() in ConnectionJDBC2
   constructor.
 o Created new Support.isWindowsOS() method to consolidate duplicate code.
   Added SupportUnitTest class to test new method.

08/30/2005 - David Kilzer
 o Updated FAQ to reflect new behavior of the namedPipe parameter since
   patch [1122494] SQL Server Authentication & Named pipes was applied
   in jTDS 1.0.3.

07/27/2005 - Alin Sinpalean
 o Corrected bug [1245775] Column type inconsistency when useLOBs=false.

07/11/2005 - Alin Sinpalean
 o Applied Mike's fix for bugs [1234531] Dates before 01/01/1900 broken due to
   DateTime value markers and [1235845] getTimestamp() returns illegal value
   after getString().

07/05/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1232733] setFetchSize(0) causes exception.
 o Final fix for bug [1229636] Memory Leak in Prepared Statements.

07/04/2005 - Alin Sinpalean
 o Corrected some build issues with Java 1.3.

07/01/2005 - Alin Sinpalean
 o Applied yet another patch for bug [1229636] Memory Leak in Prepared
   Statements, with a minor change. This seems to finally fix the caching and
   memory leaks; handles are always cached, even if maxStatements=0, retrieved
   from the connection cache and the statement list of handles is implemented
   by a Set, to make sure no memory leaks due to duplicates occur.

06/30/2005 - Alin Sinpalean
 o Corrected bug [1229636] Memory Leak in Prepared Statements, based on Mike's
   initial patch.
 o Realized that my initial fix will not work with maxStatements=0 (as opposed
   to Mike's) so made some more changes.
 o Corrected synchronization issue in ConnectionJDBC2.removeStatement() for the
   ConnectionJDBC2.statements instance variable.

06/29/2005 - Alin Sinpalean
 o Corrected a bug with prepare handles caching where the usage count was
   decremented twice when a statement was closed, causing premature release of
   handles.

06/28/2005 - Alin Sinpalean
 o Applied Mike's additional patch for bug [1222199] Delayed exception thrown
   in statement close. "Execution cancelled" exceptions are now only thrown if
   the cancel was caused by a call to Statement.cancel(); if a timeout is the
   cause, the exception is masked as an exception was already thrown when the
   execution timed out.
 o Corrected a memory leak caused by the prepared statement's handles
   collection being implemented through an ArrayList rather than a Set. The
   same handle would be added again and again on each execution and never
   removed until the statement was closed.

06/27/2005 - Alin Sinpalean
 o Per Mike's suggestion, changed the SQLState of query cancelled exceptions to
   HY008 instead of S1008.

06/23/2005 - Alin Sinpalean
 o Corrected bug [1226210] {fn dayofweek()} depends on the language. Fix
   submitted by Xavier Poinsard.

06/22/2005 - Alin Sinpalean
 o Corrected bug [1222199] Delayed exception thrown in statement close. In the
   current implementation Statement.close() does throw any server side errors
   (to make sure the user doesn't miss any) but Connection.close() ignores
   them.
 o Applied Mike's fix for bug [1222238] Unable to connect to Sybase 10 with TDS
   5.

06/21/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1222205] getParameterMetaData returns not
   implemented.

===============================================================================
06/16/2005 - jTDS 1.1 released
===============================================================================

Changes from jTDS 1.0.3
=======================

06/16/2005 - Alin Sinpalean
 o Added the useLOBs connection property to control whether large types (IMAGE
   and TEXT/NTEXT) should be mapped by default to LOBs or Java types (String
   and byte[]). Default is true, i.e. map to LOBs by default.
 o Updated version number to 1.1.

06/15/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1047208] SQLException chaining not implemented
   correctly, with a few additions in places where exceptions might have gotten
   lost.
 o Removed SSPIJNIClient.main() and hexDump() as they weren't used anyway.

06/10/2005 - Alin Sinpalean
 o Corrected bug [1217786] Moving to "beforeFirst" with ResultSet.absolute(-X)
   and a number of related absolute() and relative() issues with
   MSCursorResultSet.

06/03/2005 - Alin Sinpalean
 o Removed no longer needed cache classes.
 o Corrected an issue with savepoints, which was causing cached procedures to
   not be dropped by the driver on a savepoint rollback.
 o Removed already fixed or outdated TODO comments.

06/02/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1212905] PreparedStatement.setFloat issue.
 o Moved all the "create cursor or use direct execution" logic into a single
   place and corrected an issue where useCursors=true would cause a cursor
   prepare to be issued even on executeUpdate().

06/01/2005 - Alin Sinpalean
 o Initial implementation for extended scrollability/updatability support
   (TYPE_SCROLL_SENSITIVE for keyset cursors, TYPE_SCROLL_SENSITIVE + 1 for
   dynamic cursors, CONCUR_UPDATABLE for optimistic concurrency w/ timestamps,
   CONCUR_UPDATABLE + 1 for pessimistic concurrency and  CONCUR_UPDATABLE + 2
   for optimistic concurrency w/ value checking). All the new values work with
   Sybase too, but the behavior is the same as the default.

05/30/2005 - Alin Sinpalean
 o Changed the default prepareSQL mode from 1 (temporary stored procedures) to
   3 (sp_prepare) for SQL Server. For Sybase, the default is still 1.
 o Corrected a bug in DateTime that was causing -1 to be stored as the time
   component of a DATETIME field for a Date value.
 o Applied Mike's patch [1210936] Change byte array to string conversions; the
   patch changes the way byte[] to String conversions are made (now hex values
   are returned) and also a bug with SELECT DISTINCT not working with Sybase.
 o Added information about the useCursors property (and fast forward-only
   cursors to the FAQ).
 o Made the maximum global buffer memory and minimum local buffer packets
   configurable from the connection properties by adding two new properties:
   bufferMaxMemory and bufferMinPackets.

05/27/2005 - Alin Sinpalean
 o Added initial support for fast forward-only cursors.
 o Corrected yet another cancel synchronization issue caused by the end of
   response flag not being reset when a cancel packet was sent.
 o Corrected an issue causing hidden columns to "become visible" in result set
   meta data obtained from prepared statements.
 o Corrected bug [1209039] jTDS can deadlock when used with C3P0 connection
   pooling; unnecessary synchronization on statements caused deadlocks.

05/25/2005 - Alin Sinpalean
 o Applied Mike's last patch posted in RFE tracker [1172683] Improve the
   performance of Prepared Statements. The patch implements metadata caching
   and removes support for sp_prepexec and sp_cursorprepexec (prepareSQL=4).

05/20/2005 - Alin Sinpalean
 o Corrected bug [1204658] Conversion from Number to BigDecimal causes data
   corruption.
 o BigDecimal to String conversion no longer drops insignificant trailing
   zeroes.

05/11/2005 - Alin Sinpalean
 o Corrected bug [1200027] Enhancement: Change how Properties keys are
   determined.
 o Added serialVersionUID to JtdsDataSource.

05/10/2005 - Alin Sinpalean
 o Applied Mike's patch [1197446] Optimized handling of datetime values.
 o Applied Mike's patch with SQLParser improvements, posted in RFE [1172683]
   Improve the performance of Prepared Statements.
 o Applied Mike's fix for bug [1197603] Cursor downgrade error in
   CachedResultSet and added a test case.

05/09/2005 - David Kilzer
 o Made the error.connection.autocommit message in ConnectionJDBC2 specific to
   the method being called (commit() or rollback()) by introducing a parameter.

05/06/2005 - Alin Sinpalean
 o Corrected bug [1195511] Recent change to JtdsStatement breaks Sybase
   metadata.

05/04/2005 - Alin Sinpalean
 o Corrected a bug that was causing the ResultSet position to be reset to the
   beginning of the cached block if a reread was attempted after updateRow().

04/28/2005 - Alin Sinpalean
 o Implemented caching of a single TdsCore instance in ConnectionJDBC2. When a
   statement is closed its TdsCore is cached and reused on the next statement
   creation.
 o Made a lot of properties final.
 o Corrected bug [1180777] collation-related execption on update - if a prepare
   failed, execution was not retried (unprepared) and failed.
 o Removed the ConnectionJDBC2 finalizer, as the resources will be freed anyway
   when garbage collected.

04/25/2005 - Alin Sinpalean
 o Applied Brett Wooldridge's patch for RFE [1172683] Improve the performance
   of Prepared Statements. The patch implements a cache for parsed SQL
   statements (parsed sql and parameter information, where available).

04/22/2005 - Alin Sinpalean
 o Corrected bug [1187872] Supported CodePage: error in error message.
 o Corrected bug [1187927] Driver Hangs on Statement.execute(). Versions 1.0.3
   and prior entered an infinite loop when parsing an unterminated multi-line
   comment.

04/20/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1184376] Sybase getProcedureColumns bug.

04/19/2005 - Alin Sinpalean
 o Major code cleanup using various code inspection tools.

04/17/2005 - Alin Sinpalean
 o Applied Mike's patch for bug [1172405] BLOB/CLOB position methods fail: a
   BlobBuffer class was introduced to handle LOB buffering to memory/disk and
   BlobImpl/ClobImpl, as well as other classes, were modified accordingly.

===============================================================================
04/15/2005 - jTDS 1.0.3 released
===============================================================================

Changes from jTDS 1.0.2
=======================

04/15/2005 - Alin Sinpalean
 o Updated version number to 1.0.3.

04/13/2005 - Alin Sinpalean
 o Corrected bug [1182066] regression bug resultset: ResultSet.relative() was
   not working as expected.
 o Minor performance optimizations in ClobImpl and LOBTest.

04/11/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1179773] jTDS fails when used with c3p0
   connection pool.
 o Applied Mike's fix for bug [1180164] NPE in TdsData with mulit-byte charset.
 o Applied Mike'd fix for bug [1180169] JDBC escapes not allowed with Sybase
   addBatch.
 o Updated FAQ listing an additional reason why a ResultSet may be downgraded
   to update only read only: not a single SELECT statement.
 o Added DBSolo to the links page per Marko Hantula's request.
 o Closed bug [991089] INSTANCE parameter does not work with SQL Server 2005
   after adding an explanation to the FAQ on how to make it work.

04/07/2005 - Alin Sinpalean
 o Applied Mike and Dave's combined fix for bug [1176221] JtdsPreparedStatement
   setTime setTimestamp Daylight DST Bug.

04/04/2005 - David Kilzer
 o Refactored duplicate code in JtdsPreparedStatement.setDate(int, Date, Calendar),
   setTime(int, Time, Calendar) and setTimestamp(int, Timestamp, Calendar) into
   adjustTimeByCalendar(long, Calendar) method in preparation to fix [1176221]
   JtdsPreparedStatement setTime setTimestamp Daylight DST Bug.

04/04/2005 - Alin Sinpalean
 o Optimized buffer allocation in RequestStream/ResponseStream.
 o Moved the Statement.getMoreResults(Statement.KEEP_CURRENT_RESULT) test to a
   different, JDBC 3.0 only unit test.

03/29/2005 - Alin Sinpalean
 o Applied a temporary (and highly useless) fix for bug [1172405] BLOB/CLOB
   position methods fail. position() methods work now, at least in theory.

03/26/2005 - Alin Sinpalean
 o Applied Mike's patch [1166594] JDBC3 Multiple open result sets. The
   getMoreResults(int) method is fully implemented and the JtdsResultSet class
   has been enhanced so that it can cache the remaining result set rows when
   required by the KEEP_CURRENT_RESULT option. Result sets returned by
   Statement.execute() are only cached by when required by the getMoreResults()
   method. A couple of minor bugs in the CachedResultSet class are also fixed;
   a where clause for updates could include text or image columns which is not
   allowed and the Sybase syntax for inserting rows containing all default
   values was incorrect.
 o Corrected bug [1170777] resultSet.updateRow() fails if no row has been
   changed. Thanks go to Brett Wooldridge for signalling the bug and providing
   a fix.

03/18/2005 - Alin Sinpalean
 o Implemented RFE [1165119] Computername in Connection-URL: added a WSID
   parameter to the URL properties, to override the host name that is
   determined automatically.
 o Corrected bug [1164219] possible incorrect synchronization in
   BlobImpl.java (removed all synchronizations from BlobImpl and ClobImpl).
 o Added a description of jTDS' support for multi threading to the FAQ.
 o Update for bug [1161601] Connection.close() can take a long time when Sybase
   down. The close timeout has been reduced to 1 second, just to make sure the
   logout request makes it through to the server.

03/14/2005 - Alin Sinpalean
 o Applied Mike's additional fix to bug [1158509] Various problems with
   connect/login timeouts.

03/12/2005 - Mike Hutchinson
 o Small change to ConnectionJDBC2 to ensure that the server character set is
   used if none is specified by the user.
 o TdsCore.closeConnection() has been modified to set a 10 second timeout on
   the socket. This should address bug report [1161601] Connection.close() can
   take a long time when Sybase down.
 o TdsData and TdsCore have been modified to address bug [1161609] Text or
   image data truncated on Sybase 12.5. A new TDS 5 data type (0x24) is used to
   send bulk text or image data to the server.
 o A small bug has been corrected in Support.substituteParameters which caused
   short InputStreams to be written as a binary parameter rather than text when
   running with Sybase 11.

03/12/2005 - Alin Sinpalean
 o Added a fix suggested by rtdog to TimerThread.

03/09/2005 - Alin Sinpalean
 o Corrected bug [1158509] Various problems with connect/login timeouts. The
   last problem fixed was concerned with socket connection not timing out (only
   the login itself was timed and interrupted).
 o Applied patch [1155902] Implement parameter meta data retrieval, by Oded
   Arbel. Parameter mode was always returning parameterModeUnknown; now mode
   is determined based on actual parameters.

03/07/2005 - Alin Sinpalean
 o Partially fixed bug [1158509] Various problems with connect/login timeouts.
   FAQ was inexact (stated that loginTimeout was in milliseconds) and
   DriverManager login timeout was ignored because the default values (0 for
   login timeout) were set before the null check.

03/06/2005 - Alin Sinpalean
 o Applied a patch from Mike with a cleaner batch implementation.

03/04/2005 - Alin Sinpalean
 o Added an extra concurrency test, which runs two Statements in parallel: one
   doing SELECTs and UPDATEs and the other doing cancel()s. Seems to work fine.

03/03/2005 - Alin Sinpalean
 o Added a batchSize parameter to control how many statements should be sent at
   once in a batch execution. Batches are now broken up into pieces on
   execution if they exceed this size limit.

03/01/2005 - Alin Sinpalean
 o Following Mike's suggestion, reduced the chunk of code synchronized with
   cancelMonitor to only TdsCore.cancelPending assignments, to ensure these are
   atomic. That should be enough, now that SharedSocket is also synced.

02/28/2005 - Alin Sinpalean
 o Applied Mike's patch [1124854] SSO fixes - prevents error from crashing JVM.
 o Modified ClobImpl to use UCS-2 encoding for storing/retrieving character
   data to/from disk. Previously the default system encoding was used, causing
   characters not in the system encoding to be lost.
 o Corrected a resource (temp file) leak in ClobImpl and BlobImpl: the file
   property was set to null before deleting the file, possibly causing it to
   remain there until the JVM terminated.
 o Completely synchronized access to cancelPending and endOfResponse in TdsCore
   and cancelPending and responseOwner in SharedSocket. This should prevent any
   race conditions when a cancel() is issued.
 o Applied the rest of Mike's fix for bug [1152329] Spurious output params
   assigned (TIMESTMP). Missed part of it when doing the merge.
 o Added FAQ entry about Sybase batching, as discussed in bug report [1123350]
   Hang when executing performance test.

02/27/2005 - Alin Sinpalean
 o Enhanced update count caching implementation by always caching update counts
   up to the end of the response or beginning of the first ResultSet (whichever
   comes first) whenever the end of the current ResultSet is reached. This
   means it's no longer necessary to call getMoreResults() after the last
   ResultSet returned by a CallableStatement to get to the output parameters.
   Also removed the readAhead flag, which caused the rest of the response to
   be dumped when the end of the first ResultSet was reached for a
   CallableStatement.executeQuery.
 o Corrected a problem in SQLParser causing an error message with the wrong
   terminator value missing (i.e. ')' instead of '}' missing from
   "{call proc(?)").
 o Corrected a problem with output parameters being defined as Unicode even
   though sendStringParametersAsUnicode=false was specified.
 o Applied Mike's fix for bug [1152329] Spurious output params assigned
   (TIMESTMP). WRITETEXT and UPDATETEXT commands generate spurious output
   parameter packets, which interfere with the real output parameters. Fix
   ignores output parameters with names not beginning with '@'.
 o Synchronized all accesses to the cancelPending flag, to fix any possible
   issues caused by race conditions.

02/25/2005 - Alin Sinpalean
 o Added code to close the socket and release any data buffered at the socket
   level when Connection.setClosed() is called (usually on I/O or protocol
   errors).
 o Tried to disable warning messages on database and language change; these are
   always generated during login, sometimes causing confusion. Problem is,
   disabling these also disables generation of the associated ENVCHANGE packets
   making jTDS crash with NPEs because it doesn't know the current database.

02/24/2005 - Alin Sinpalean
 o Corrected bug [1150880] Character Set getting overwritten. Collation
   envchange packets altered the charset specified on connection creation.

02/23/2005 - Alin Sinpalean
 o Implemented feature [1145697] Better handling of OutOfMemoryError. On an
   OutOfMemoryError, TdsCore.nextToken() now consumes the rest of the server
   response to ensure no protocol confusion will occur.
 o Implemented feature [1144733] Make jtds.jar display version no. Now
   "java -jar jtds-1.x.jar" will display the jTDS version to standard output.

02/23/2005 - David Kilzer
 o Fix comment in ConnectionJDBC2(String, Properties) constructor.

02/22/2005 - David Kilzer
 o Added .cvsignore to top-level directory to ignore build and dist directories.

02/19/2005 - Alin Sinpalean
 o Applied patch [1122494] SQL Server Authentication & Named pipes, submitted
   by Kartik Shah. On Windows, local named pipes are always used, now, even for
   remote servers.
 o Implemented feature request [1124636] Better error message for missing
   ntlmauth.dll.

02/17/2005 - Alin Sinpalean
 o Corrected a problem related to cancel synchronization in TdsCore: a race
   condition occured between the cancelPending assignments that could cause
   the Connection to fail. Problem was reproducible using testCancel0003() in
   SAfeTest on a slow client.
 o Corrected bug [1120168] jTDS 101 - TDS data type 0 invalid, caused by
   incomplete column info filled in for dummy CachedResultSets.

02/16/2005 - Alin Sinpalean
 o Applied Mike's fix for bug [1122357] INSERT is executed twice by scrollable
   Statement on Sybase. CachedResultSets are now created on top of plain
   ResultSets from scrollable/updateable Statements. The query is only altered
   (by adding "FOR BROWSE") if executed via executeQuery().

02/15/2005 - Alin Sinpalean
 o Altered SQLParser to accept any number of parameters for a PreparedStatement
   if prepareSql=0, i.e. plain queries rathern than RPC are used to execute the
   query. Also modified the related test to handle this situation.

02/14/2005 - Alin Sinpalean
 o Applied patch [1120010] Fixed search string escape handling, submitted by
   James P. Moring.

02/12/2005 - Alin Sinpalean
 o Corrected bug [1120442] Statement hangs in socket read after
   Statement.cancel().
 o Applied Mike's fix for bug [1120825] Can't open scrollable ResultSet with
   Sybase 11.9.
 o Applied Mike's fix to my fix to bug [1120442] Statement hangs in socket read
   after Statement.cancel(). :o)

02/10/2005 - Alin Sinpalean
 o Improved test for bug [1116046] {fn } escape can't handle nested functions.

===============================================================================
02/15/2005 - jTDS 1.0.2 released
===============================================================================

Changes from jTDS 1.0.1
=======================

02/14/2005 - Alin Sinpalean
 o Corrected bug [1122481] how handle new behavior since 1.0.1. The DataSource
   factory failed with NPE because the properties are no longer initialized in
   the constructor. Added tests to ensure no regressions.
 o Updated version number to 1.0.2.

===============================================================================
02/09/2005 - jTDS 1.0.1 released
===============================================================================

Changes from jTDS 1.0
=======================

02/09/2005 - Alin Sinpalean
 o Corrected bug [1118956] statement.setMaxFieldSize() sends a statement every
   time. Max field size is now set at the same time and in the same way as row
   count.
 o Applied Mike's patch [1118912] Small enhancements. Extended DataTruncation
   support, better transaction isolation support for Sybase and a fixed NPE in
   Logger.

02/08/2005 - Alin Sinpalean
 o Synchronized JtdsStatement.close(); a race condition could occur between a
   pool implementation closing Statements after a timeout and finalize().

02/07/2005 - Alin Sinpalean
 o Added the explanation for the "Connection refused" error message to the FAQ.
 o Removed tests that were failing because of the fix for bug [1113709]
   Connecting via DataSource (the assumptions of these tests were incorrect, to
   start with).

02/05/2005 - Alin Sinpalean
 o Applied patch [117010] Instance parameter support for local named pipes,
   submitted by Matthias Germann.

02/04/2005 - Alin Sinpalean
 o Applied Mike's fix for bugs [1116113] (SSL fails to build or run under java
   1.3) and [1102505] (SSL Resume Failure). TLS resume is now disabled
   altogether until we find out what the actual cause is and work around it.
 o Applied Mike's fix for bug [1116046] {fn} escape can't handle nested
   functions.

02/02/2005 - Alin Sinpalean
 o Applied patch [1110911] Encryption request causes conn reset, submitted by
   Mike Hutchinson. SSL negotiation has been implemented to handle the encrypt
   only login case.
 o Applied a modified version of patch [1107090] Revised query timeout logic,
   submitted by Mike. Timeouts should now have millisecond precision, using a
   single timer thread per VM.
 o Fixed bug [1113709] Connecting via DataSource. Invalid default TDS version
   was used by JtdsDataSource when connecting to Sybase. Breaks all default
   property tests (which relied on DataSource setting default values in the
   constructor), but the previous behavior was incorrect.
 o Fixed bug [1113040] Small bug in net.sourceforge.jtds.jdbcx.PooledConnection
   Thanks go to Marcus Nylander for finding the bug and providing a fix.

02/01/2005 - Alin Sinpalean
 o Updated FAQ to include information about local named pipes.
 o Modified SQLParser to only extract table names when requested to, because it
   was unable to parse function calls.

01/28/2005 - Alin Sinpalean
 o Added checks for timeout exceptions to JtdsStatement.executeSQLQuery() and
   executeSQL(); if a cursor creation fails because of a timeout, the exception
   is thrown back and a direct select is not attempted anymore.
 o commit() and rollback() now throw SQLException if called in auto-commit
   mode, per API documentation.
 o Added checks to setAutoCommit() and setTransactionIsolation() to no longer
   submit requests to the server if already in the correct mode.

01/27/2005 - Alin Sinpalean
 o Fixed bug in CharsetInfo, caused by getClassLoader() returning null when the
   class loader is the bootstrap classloader.

===============================================================================
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
