This is a scratch-written pure-Nim implementation of the client
side of the MySQL database protocol (also compatible
with MariaDB, etc.). It's based on the asyncdispatch
and
asyncnet
modules and should be a fully non-blocking, asynchronous
library.
The library implements both the "text protocol" (send a simple string query, get back results as strings) and the "binary protocol" (get a prepared statement handle from a string with placeholders; send a set of value bindings, get back results as various datatypes approximating what the server is using).
Other than ordinary queries, it does not support various other commands that might be useful. It doesn't support old versions of the server (pre-4.1) or probably several other things. It was primarily an exercise in learning Nim.
For practical asynchronous use, some kind of turnstile mechanism needs to exist in order to prevent different requests from stomping on each other. It might make sense to combine this with some kind of transaction support.
The API presented by this module is very specific to MySQL. A more generic async DB API would be nice. That API would ideally be a separate layer on top of the MySQL-specific API.
Long packets (more than 2^24-1 bytes) are not handled correctly.
The compressed protocol is not supported--- I'm not sure if this is actually a deficiency. As a workaround, SSL with a null cipher and compression could be used.
For local (unix-domain) connections to work, you would need to extend Nim's socket modules to support those.
Date and time values are not supported (but not hard to support). You can always CAST to a string or seconds-since-the-epoch format on the server side, though.
The protocol allows streaming large values to the server (if, for example, you are inserting a large BLOB) and this could be implemented elegantly as parameter that lazily generates strings.
Cursors, FETCH, and the like are not implemented.