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.