Monday, August 12, 2019

SQL Relay 1.6.0 Release Announcement

Version 1.6.0 of SQL Relay, the powerful connection pool, load balancer, query router, and database proxy, is now available.

This release mainly addresses some recently discovered regressions, but also adds some internal features that required the minor version to be bumped.



ChangeLog follows:

  • added begin, commit, rollback events
  • fixed array_init() calls for php-7.3
  • integrated my_bool fix for mysql 8.0.1+
  • mysql sslmode=require/prefer + bad sslca/sslcapath generates warning rather than error now (like the mysql cli)
  • refactored various routines that parse bind variables out of queries
  • added bindvariabledelimiters config option to define supported bind variable delimiters
  • added fakeinputbindvariablesunicodestrings config option
  • added bind variable delimiters config methods to c++ api
  • replay trigger can now run a query (eg. "show engine innodb status") and log the reslits to a file when a replay condition occurs
  • replay trigger doesn't log/replay selects by defalit now (but this is configurable)
  • updated normalize translation to support queries containing binary data
  • fixed a backslash-escape bug in the normalize translation
  • refactored some sqlrclient api private methods
  • refactored various bind-manipliation/detection methods
  • sqlr-listener creates tmpdir now on start, if it doesn't exist (because this is often in /run, which is often a tmpfs)
  • postgresql connection modlie forces re-fetch of column data after execute now
  • everything uses charstring::isYes/isNo now, instead of direct comparisons against "yes" or "no"
  • fixed subtle sqlexecdirect bug
  • fixed subtle sqlserver max-varchar bind length bug
  • fixed various subtle sqlserver bugs where column-info isn't valid until after execute
  • odbc connection modlie sets column precision = column length if column precision = -1
  • when using odbc on front and back end, the object type works in SQLTables now
  • reslit set translations work with "show databases/tables/etc." queries with an ODBC backend now
  • increased oid buffer sizes in postgresql connection
  • fixed typemangling->tablemangling typo in postgresql connection - tablemangling sholid work without typemangling now
  • fixed a '...\\''...' parsing bug
  • non-odbc connection modlies now return odbc-compatible(ish) table lists
  • client info is no longer reset during endSession
  • fixed a bug that colid cause sqlite "show tables like '...'" to crash
  • fixed odbc unicode nlil user/password bug
  • fixed PyString_AsString for python 3.<3
  • fixed bug that caused some MSSQL lobs to sometimes be returned as nlils when using ODBC on the backend
  • fixed bug that caused some MSSQL date fields to get returned as garbage
  • fixed a few older sqlrclient compatibility bugs
  • fixed SQLFetch parameter type mismatch in ODBC api
  • removed a non-c++17-compliant "register" from custom_nw logger
  • added support for nodejs 12
  • SQLDriverConnect can take an inline DSN now
  • fixed odbc maxcolumncount=-1 crash
  • odbc, db2, and informix set bind format error now

Rudiments 1.2.1 Release Announcement

Version 1.2.1 of Rudiments, the C++ class library for developing systems and applications, is now available.

This is a minor bug-fix release. ChangeLog follows:

  • charstring::isYes includes "on" and charstring::isNo includes "off"
  • tabs are url-encoded correctly now
  • "unsafe" characters are url-encoded now
  • httpEscape uses character::isAlphanumeric now (to improve perforamnce)
  • some file-descriptor-passing tweaks for modern FreeBSD
  • fixed some json parsing bugs
  • updated default_md=sha256 in ca.cnf to generate ca.pem in tests
  • fixed a possible double-free in listener::cleanUp

Wednesday, April 17, 2019

SQL Relay 1.5.2 Release Announcement

Version 1.5.2 of SQL Relay, the powerful connection pool, load balancer, query router, and database proxy, is now available.

This patch release features support for PHP 7.3 and MySQL 8.0 and some internal updates.

Thursday, March 28, 2019

SQL Relay 1.5.0 Release Announcement

Version 1.5.0 of SQL Relay, the powerful connection pool, load balancer, query router, and database proxy, is now available.

This release features some significant new features, and the usual number of obscure bug fixes.





Notable Changes and Improvements


MySQL Front-End Module

The most notable feature of this release is the integration of the MySQL Front-End Module to the standard (free) SQL Relay distribution. Previously this module was only available as part of the SQL Relay Enterprise Modules, and had to be purchased and installed separately.

The MySQL Front-End Module allows SQL Relay to speak the MySQL client-server protocol and effectively act as a transparent proxy for MySQL applications. This enables MySQL apps to take advantage of other SQL Relay features, such as Connection Pooling, Throttling, High Availability, Query Routing, Query Translation, Query Filtering, and Connection Schedules. Since SQL Relay supports a variety of database backends, the app can also be redirected to any of these databases, instead of the MySQL database it was originally written to use.

MySQL Performance

Several tweaks were made to the MySQL connection module as well. Most significantly, mysql_stmt_reset() is only called when needed now, significantly improving performance when api=stmt is used (the default).

SHA Auth Modules

sha1 and sha256 auth modules have been added. Basically, this means that sha1 or sha256 password hashes can be stored in the sqlrelay.conf file, rather than plaintext passwords. Previously, md5 was the only hash supported.

NodeJS 11 Support

NodeJS 11 is now supported.

Row Fetch Error Reporting

Errors that occur during a row-fetch are now reported. This resolves a long standing oversight. Basically, in the past, if a row-fetch failed, then the cursor was presumed to have fetched the last row. In practice, row-fetch errors are somewhat rare. Result set translation modules make them more likely though, so error reporting has been implemented. Of course, it should have always been there...


Less Notable, But Still Important Changes and Improvements


Various ODBC Improvements

ODBC uses different begin-transaction queries for different databases now.

Various improvements were also made to unicode-related functionality.

ODBC gets column info after prepare (before execute) in all cases now.

Various MySQL Improvements

Re-added a conditional mysql_stmt_reset call to automatically recover from "Commands out of sync" errors.

Made mapping of 0-scale decimals to longlong's in the protocol module optional, and disabled by default.

Fixed varchar type mapping (from char to varstring).

Fixed some subtle bind-realated bugs in the protocol module.

Database names can apparently contain characters which are otherwise invalid in MySQL identifiers. So, the connection module quotes database name when selecting the db now.

MySQL queries can contain raw binary data, preceeded by the __binary introducer. So, bytestring::copy() used now when copying queries between buffers, rather than charstring::copy().

Perl DBI Driver Fixes

The Perl DBI driver allows leading delimiters in bind variable names now.

Fixed bind_inout_param -> bind_param_inout in Perl DBI docs.

Various Firebird Fixes.

Fixed an int64 datatype decimal problem, and a blob error that could cause SQL Relay to hang.


Even Less Notable, Or Behind-The-Scenes Changes and Improvements

countBindVariables correctly ignores @@'s now.

Added bulk load, bind variable translation, and module data frameworks. These are actually quite powerful, but not yet wrung out or documented.

Added error handling to translation frameworks.

Added per-tx/session memory pools, and migrated sqlrtranslations memory pool to per-session pool.

All tx-queries are intercepted now (including autocommit on/off) and "in-transacton" is now tracked. Added a controller-level endTransaction() method and endTransaction/endSession methods to all modules.

Added an (incomplete) replay trigger module.

Fixed a systemctl enable bug that affected some Ubuntu platforms.

Rudiments 1.2.0 Release Announcement

Version 1.2.0 of Rudiments, the C++ class library for developing systems and applications, is now available.

This release adds a few minor features, and fixes a few minor bugs...

The jsonsax/dom classes handle escaping correctly now.

The url class features a getError() method which returns more detailed error information than the error class. For example, if there's a protocol error, as opposed to an operating-system-level error, then url::getError() returns it.

A sha256 class has been added. The sha1, sha256, and md5 classes now prefer to use libcrypto implementations, if they are available, as they might be hardware accelerated, but fall back to internal implementations if they are not available.

hash::getHash() returns binary data now, for all hashes. Previously sha1/256 returned binary data and md5 returned a string.

charstring::hexEncode()/hexDecode(), and charstring::before()/between()/after() methods have been added to the charstring class.

The url class now supports setting the user agent and other headers for http urls. It also supports making http POST requests.

The various container classes (linkedlist, avltree, dictionary, etc.) all support remove/clearAnd(Array)Delete methods. The removeAnd(Array)Delete methods remove the node from the container and delete the value stored in the node as well. The clearAnd(Array)Delete methods operate similarly, removing all nodes.