                        CHANGES version 3.4.0

              This file summarizes changes made since 1.0
              
Version 3.4.0
-------------

* New: Connection_beginTransactionType() can be used to
  specify a transaction's isolation level and characteristics
  when beginning a new transaction.
* New: valueOr macro for safe handling of API return values:
  - Provides a default for NULL, 0, or negative returns.
  - Works with pointers, integers, and floats.
  - Safely evaluates expressions only once.
  - Compatible with GCC and Clang (uses GNU C extension).
  Example:
   const char* host = valueOr(URL_getHost(url), "localhost");
* New: Enabled multi-thread mode for SQLite connections by default.
  This can improve performance in multi-threaded applications by
  allowing concurrent access to the database. Works with stock
  libsqlite builds (SQLITE_THREADSAFE=1 or 2). The URL property,
  serialized=true, can be used to set the connection and SQLite
  back in serialized thread mode.
* New: Added PreparedStatement_setSString() for setting a sized
  string value. If the string length is known, using this
  method is more efficient.
* Fix: Disabled use of sqlite3_enable_shared_cache and
  SQLITE_OPEN_SHAREDCACHE with open_v2(). Although we did
  see some concurrency benefits with shared cache in the
  past, it is best not to use it due to some potential
  nasty side-effects. SQLite also discourages its use. Luckily,
  stock libsqlite is built with shared cache disabled so our
  attempt to activate it was essentially a no-op in any case.
* Fix: C++, added missing support for binding a floating
  point value in PreparedStatement::bind()
* Fix: C++, Use PreparedStatement_setSString() when binding
  a std::string_view which is more efficient and safer.
* Fix: Plus minor improvements and fixes

Version 3.3.0
-------------
* New: The pool now starts the reaper thread by default,
  while previously it was started on request. The function
  ConnectionPool_setReaper() has changed purpose from
  previously starting the reaper thread to now being able
  to disable the reaper thread by setting sweep interval to 0.
* New: The C++ API has been updated to have better
  ergonomics and provide more modern features. C++20 is
  required, and the API is not backward compatible. See
  test/zdbpp.cpp for examples and use of libzdb in a C++
  project. The C API remains backward compatible and does
  not require any changes to your code.
* New: Added ConnectionPool_isFull() for improved connection
  pool management. This method allows users to check if the
  pool is at capacity before attempting to get a connection.
  It's recommended to use ConnectionPool_isFull() before
  calling ConnectionPool_getConnection() to proactively
  manage pool resources and handle full pool scenarios
  efficiently, such as increasing max connections
* New: PreparedStatement_setNull() can be used to explicit
  set a parameter in a prepared statements to SQL NULL.
* New: Changed default timeout before an inactive connection
  is evicted from the pool, from 30 seconds to 90 seconds.
  ConnectionPool_setConnectionTimeout() can be used to change
  this value.
* Fix: Improved Connection Pool Concurrency and
  Reliability. Significantly reduced lock contention in
  the connection pool when multiple threads request
  connections simultaneously. Connections returned from
  the pool are still guaranteed to be active and connected
  to the database.
* Fix: Plus minor improvements and fixes

Version 3.2.3
-------------
* New: Provide better error reporting if a Connection cannot be
  obtained from the Connection Pool by introducing the method
  ConnectionPool_getConnectionOrException(). In C++ the exception
  thrown now contains the actual cause instead of a generic error.
* Fix: In C++ guard against stopping the Connection Pool with active
  Connections. I.e. all Connections should be returned to the pool
  before explicitly attempting to stop the pool. This is due to how
  C++ destructors are called at scope end; if there is a reference
  to a live Connection object after the pool is stopped it might cause
  a dealloc sequence problem.  
* Fix: Issue #50 where unit test 5 could fail for MariaDB because
  mysql_stmt_affected_rows() only returns actual affected rows, not
  matched rows which MySQL does.
* Fix: plus other minor improvements and fixes

Version 3.2.2
-------------
* Fix: Removed Thread.h from the API. This is an internal interface
  and should not have been exposed in the first place.

Version 3.2.1
-------------
* New: Include Library version number in zdb.h
* Fix: Simplified test/zdbpp.cpp and added missing header
* Fix: Improved support for MySQL 8 and MariaDB

Version 3.2
-----------
* New: C++17 support via zdbpp.h which is distributed with libzdb
  for more idiomatic use of libzdb from C++.
* New: Support prefetch rows for MySQL and Oracle. Either
  programatically via Connection_setFetchSize() or via ResultSet_setFetchSize()
  or via a new global 'fetch-size' URL option. Thanks to dragon
  jiang (jianlinlong)
* New: MySQL 5.7 and later. Added session query timeout accessible via
  Connection_setQueryTimeout()
* New: MySQL 8. Added a new URL option 'auth-plugin' which specify
  the authentication plugin to use when connecting to a MySQL server.
* New: Oracle: Added a new URL option 'sysdba' for connecting with
  sysdba privileges.
* Fixed: Revert previous fix and remove last SQL terminator character ';' in
  statements, except if preceded with END; to allow for ending a pl/sql block.
* Fixed: Oracle: Set SQL null value in prepared statement
* Fixed: Oracle: Handle date/time literal values

Version 3.1
-----------
* New: Support Literal IPv6 Addresses in URL, RFC2732. You can now
  use an IPv6 address as host in URL as long as it is enclosed in
  brackets, e.g. mysql://[2001:db8:85a3::8a2e:370:7334]:3306/test
  Requires that linked database libs supports IPv6. MySQL 5.x, 
  Postgres 9.x and Oracle 11.x or later versions should be fine.
* New: Honour timezone information if provided with date-time column
  values. Previous version assumed date-time information to be in UTC
  (which is the usual case).
* Fixed: #7 Removed onstop handler which called third-party database
  libraries shutdown method. This could cause a problem for MySQL and
  SQLite if more than one Connection Pool was used as the onstop handler
  was called in ConnectionPool_stop() and thereby would render other
  live Connection Pools invalid as the underlying library was shutdown.
* Fixed: #8 Do not remove a trailing SQL termination charachter ';' from
  the SQL statement.

Version 3.0
-----------
* New: Methods for retrieving Date, Time, DateTime and TimeStamp column
  values from a ResultSet. PreparedStatement_setTimestamp for setting
  Unix timestamp.
* New: ResultSet_isnull, can be used to explicit test if a column
  value in a Result Set is SQL null. A Result Set already returns
  the NULL pointer for string and blob types and 0 for primitive data
  types if column value is SQL null, but to differ between SQL null and 
  the value NULL or 0, this method can be used.
* New: PreparedStatement_getParameterCount, Returns the number of 
  parameters in a prepared statement
* New: It is now a checked runtime error for the url parameter given 
  in ConnectionPool_new() to be NULL.
* New: No longer require flex installed as the generated file is
  part of the distribution.
* Fixed: Oracle: memory corruption in OracleResultSet when a Blob 
  value is retrieved as a String

Version 2.12
--------------
* New: PreparedStatement_rowsChanged added to PreparedStatement.h
* Fixed: Oracle: OCIPing is used to check oracle connection and
  ensure that the Pool returns connected connections. Thanks to
  Pavlo Lavrenenko.

Version 2.11.3
--------------
* New: License exception added to allow for linking and 
  distributing this Software together with OpenSSL.

Version 2.11.2
--------------
* New: Throw SQLException if a database access error occurs
  when ResultSet_next() is called. Previously, access errors
  could be masked as end of result set. Thanks to JiaQiang Xu.
* Fixed: Possible mem leak in Oracle's blob operation fixed 
  (Volodymyr Tarasenko)

Version 2.11.1
--------------
* Fixed: MySQL: Fixed a ResultSet bind memory error which could occur
  if string or blob columns of different size caused successive buffer
  reallocation. Thanks to Ryan Addams for discovering the problem.

Version 2.11
------------
* New: Added support for the new bytea hex encoding format
  introduced in PostgreSQL 9.0.
* Fixed: MySQL: A table with two or more columns larger than 256
  bytes would cause libzdb to truncate the second column to 256 
  bytes in the first row. Thanks to Me from China for bug report
  and patch.
* Fixed: Using configure flags --with-xxx without arguments
  now works as expected. Thanks to Johan Bergström for report

Version 2.10.6
--------------
* New: ConnectionPool_start() now throws an SQLException instead
  of calling ABORT if starting the pool failed. Thanks to
  Christopher O'Hara for suggestion.
* Fixed: MySQL: Using a stored procedure which returned a
  result set would freeze the connection until it was reaped.
  Thanks to Jesse White for patch.
* Fixed: Ensure that the library can be restarted after it was 
  stopped without leaking resources. Only applicable for MySQL
  which could leak memory on runtime restart. Thanks to Axel 
  Steiner for initial patch and suggestion.

Version 2.10.5
--------------
* New: Automatically unescape the following URL components:
  credentials, path and parameter values.

Version 2.10.4
--------------
* MySQL: Improved error reporting for select and prepared statements

Version 2.10.3
--------------
* Fixed: Oracle: fixed a compile issue for GCC when strict C99 is
  used. Thanks to Stas Oginsky.

Version 2.10.2
--------------
* Fixed: Oracle: fixed a parameter sequence bug at connection. Bug
  was introduced in 2.9. Thanks to l00106600.

Version 2.10.1
--------------
* A zdb.pc library package config file was added. Thanks to 
  Matthieu Verbert
* Build, configure and minor code improvements

Version 2.10
-----------
* Libzdb is now compatible with and can be included in C++ or 
  Objective-C(++) projects.
* Internal optimising changes and improvements

Version 2.9
-----------
* SQLite: Unescape path to allow for (white-)space in database file
  path. Thanks to Jonas Schnelli
* SQLite: Use sqlite3_open_v2 instead of sqlite3_enable_shared_cache 
  which is deprecated in OS X Lion. 
* Oracle: Fixed a problem with ResultSet not returning all data
              
Version 2.8.1
-------------
* Oracle: Fixed a transaction related memory leak
              
Version 2.8
-----------
* Allow spaces in URL property values
* PostgreSQL: Allow sending application name to the server for 
  logging. Thanks to Chris Mayo. See the PostgreSQL URL property,
  application-name.
Bug fixes:
* ResultSet_getBlob: Ensure that returned blob size is 0 if blob
  is SQL null.
* Oracle: Fixed ResultSet memory leak.

Version 2.7
-----------
* Added tentative support for Oracle. Thanks to Volodymyr
  Tarasenko, and Sergey Pavlov for implementing this.
  This implementation does not support BLOB, though CLOB
  is supported. It will also not run all zdb unit tests,
  but should be useful for most purposes. It is released
  with the hope that others may still find it useful and
  help iron out any remaining issues.
* Added new convenience zdb.h meta include file which
  can be used to include all required API interfaces
* Internal optimizing changes and improvements
* SQLite: Clear connection on rollback to prevent SQLite
  from issue an SQLITE_BUSY error if there are pending
  selects in progress.
* SQLite: added a "heap_limit" URL property. Makes SQLite 
  auto-release unused memory if memory usage goes above 
  the specified limit [KB]. Require that SQLite is
  compiled with the SQLITE_ENABLE_MEMORY_MANAGEMENT option
  to take effect.
Bug fixes:
* SQLite: Ensure that the database file is specified in
  connection URL. Thanks to Bogdan Nicula.
* PostgreSQL: Implemented Connection_setQueryTimeout()

Version 2.6
-----------
* Internal optimizing changes and improvements
* Enable shared cache mode for SQLite >= 3.5
* Added new configure option --enable-sqliteunlock which
  enables SQLite unlock notification. This feature requires
  SQLite >= 3.6.12 compiled with the SQLITE_ENABLE_UNLOCK_NOTIFY
  C-preprocessor symbol. This option greatly improves upon 
  SQLite concurrency when libzdb and SQLite is used from a 
  multi-threaded program.
* Removed deprecated ResultSet_readData() from API
Bug fixes:
* PostgreSQL: Unescape values retrieved via ResultSet_getBlob()
  and via ResultSet_getBlobByName(). By an incurie, unescape was
  left out of libzdb version 2.5.

Version 2.5
-----------
* Removed GPL license exceptions. The library is now licensed under
  the  GPL version 3 only. 
* Deprecated ResultSet_readData(). This function _was_ useful for 
  MySQL, but not for other drivers where it had some overhead.
* Added GCC __attribute__ printf checks where applicable
* PostgreSQL: Blob retrieval optimized
* PostgreSQL: Added unix-socket parameter to connection URL
* Internal optimizing changes and improvements

Version 2.4
-----------
* The options --with_mysql=<path> and --with_postgresql=<path> to
  configure has a new meaning; If <path> is given it is assumed to be
  the full path to respectively mysql_config and to pg_config. Example:
  ./configure --with_mysql=/usr/local/mysql/bin/mysql_config 
  ./configure --with_postgresql=/usr/local/pgsql/bin/pg_config
* From version 2.4, libzdb places its header files into a zdb
  sub-directory as in, <prefix>/include/zdb. Clients must now use the
  include-dir compiler flag, -I<prefix>/include/zdb.
* Internal optimizing changes and improvements
* Changed two prototypes to 'extern void foo(void)' so the library
  compiles without warning if -Wstrict-prototype is used with gcc.
  Thanks to Paul Stevens
Bug fixes:
* Fixed off-by-one bug in Vector_remove
* PostgreSQL: Fixed PostgresqlResultSet_getColumnSize to report correct
  value.
* PostgreSQL: Improved error reporting and fixed potential allocation
  bugs in prepared statements.
* PostgreSQL: Calling PreparedStatement_setString with a NULL value now
  works

Version 2.3
-----------
* Cleaned up API and changed function return type to void for 
  those functions that can throw exception on error. 
* Support variable arguments in Connection_prepareStatement() 
  to make it easy to build prepared statements in-place

Version 2.2.3
-------------
Bug fixes:
* Make sure connection properties, max rows and query timeout are
  reset on Connection_close(), if changed.
* Ensure that timeout is set for new Connections.
* SQLite: Fixed a bug so the SQLite driver now will retry executing
  on database lock. This should greatly improve concurrent usage of
  SQLite and reduce database locks from occurring 

Version 2.2.2
-------------
Bug fixes:
* Ensure that reaper progress forward and remove all connections it can
* Fixed a va_copy bug on 64 bits systems
                 
Version 2.2.1
-------------
* SQLite: Improved error reporting by using sqlite3_prepare_v2() when 
  available. Thanks to Paul Stevens for suggesting this.
Bug fixes:
* MySQL and PostgreSQL: Fixed off-by-one count when verifying validity
  of parameter and column index. Thanks to Paul Stevens for bug report.
* MySQL: Workaround mysql column truncation bug. Thanks to Paul Stevens
  for bug report.

Version 2.2
-----------
* Detailed error message added to exception. In an exception handler,
  the variable Exception_frame.message, now provides an alternative to 
  Connection_getLastError() for obtaining the latest error message
* From this release, building with exceptions handling is no longer 
  optional but required
* Internal optimizing changes 
Bug fixes:
* Fixed Connection_prepareStatement() error reported on a PostgreSQL
  Connection. Thanks to Paul Stevens for bug report.
* MySQL: Fixed error in ResultSet_getBlob() and ResultSet_getString() 
  which lead to a segfault when trying to obtain "large" strings and 
  blobs. Again thanks to Paul Stevens.
* PostgreSQL: Fixed the "syntax error at character 12" for prepared
  statement deallocation. Thanks to Paul Stevens for bug report.

Version 2.1
-----------
* API: Connection_ping is promoted to a public method. Clients can use
  this method to test if a Connection is alive.
* API: Connection_clear() is exposed as a public method. Normally it 
  is not necessary to call this method, but in some situations, if you
  use PreparedStatement_executeQuery it is necessary to call this 
  function to close a prepared statement explicit. Basically, if you
  see this SQLite error, "SQL statements in progress", call this 
  function to close any previous opened statements before proceeding.
* Upon returning a Connection, the Connection Pool previously tried to 
  commit a Connection if it was in a non-committed state, while now it
  rollback instead, which is assumed to be more correct. 
* Improved retry when SQLite report database lock, which should reduce
  the chance to meet the infamous SQLite "database is locked" error
* Removed section 3 from "Tildeslash License Exception" so libzdb is 
  licensed clear and permissive.
* Internal optimizing changes 

Version 2.0.2
-----------
* Don't normalize path during URL parsing. If the path needs to be
  normalized it is the responsibility of the caller
* Minor internal changes 
* libzdb is now licensed under GNU General Public License version 3

Version 2.0.1
-----------
* ConnectionPool_version() is now a class method
* Minor internal changes 

Version 2.0
-----------
* Exceptions handling added to the library. This change how clients
  should use the library. Methods in the library that can throw an 
  SQL Exception should now be called from inside a try-catch block.
Bug fixes:
* Fixed a PostgreSQL prepared statement bug. If parts of a statement
  was defined after its last parameter, preparation failed.

Version 1.1.3
-------------
Bug fixes:
* This release fixes a MySQL prepared statement bug. If a prepared
  statement was used with two or more number parameters, the numbers
  were saved with a bogus value in the database. Thanks to José Antonio
  Sánchez

Version 1.1.2
-------------
* ResultSet_next() can be given a NULL value, upon which false is returned.

Version 1.1
-------------
* Added PostgreSQL support
* Using 'mysql_config' when available. Thanks to Paul Stevens paul
* Removed the viral clausal from the exceptions license
* Note, the caller is now responsible for freeing the URL_T object used
  in ConnectionPool_new(), via the URL_free() method.
  
Version 1.0.4
-------------
* Use libtool to set release information for the library.
* Simplified and removed section 4 of the license exception.
* Use new version of auto-tools so library extension is set correct
* Include bootstrap script for recreating configure 
* Minor internal changes

Version 1.0.3
-------------
* Clear any previous resultset when calling Connection_execute() also. This
  allow MySQL implementations to issue a Connection_executeQuery() followed
  by Connection_execute() without having to close the Connection first. 
  Otherwise MySQL may return a 'commands out of sync' error. 
Bug fixes:
* Changed declaration of AbortHandler() so clients are not required to 
  provide this function.

Version 1.0.2
-------------
Bug fixes:
* Refactor and consolidate PreparedStatement clearResultSet
* Do not free prepared statements on Connection_executeQuery(), only the
  ResultSet if any.
* MySQL: Avoid unnecessary re-allocation in
  MysqlResultSet.ensureCapacity() and set the new buffer length
  properly.
* MySQL: Stop MysqlResultSet_next() sooner when maxRows is reached for
  versions < 5.0
* MySQL: Do not try to bind params in PreparedStatement unless in-params
  are present in the statement

Version 1.0.1
-------------
* API: Connection_beginTransaction(), Connection_commit() and 
  Connection_rollback() now returns an int (true or false) instead of void.
Bug fixes:
* MySQL: Removed a debug statement in MySQL prepare statement so a
  potential error message is not lost - MySQL pops last error messages.
* MySQL: Make room for a terminating NUL byte when fetching large strings. 
* configure.ac: Don't link with zlib unless mysql version was confirmed
* configure.ac: Don't print a warning if re2c was not found - Not required

Version 1.0
-----------
* Initial release

