Re: John Cowan's preliminary notes on a SQLite oriented Simple SQL (ssql) API Peter Bex 12 Sep 2019 12:11 UTC
On Thu, Sep 12, 2019 at 06:35:40AM -0500, xxxxxx@ancell-ent.com wrote: > A very preliminary set of notes on the API is at <https://bitbucket.org/cowan/r7rs-wg1-infra/src/default/SimpleSqlCowan.md>. Cool, thanks for the link. My first thoughts: - It seems unnecessarily complicated to me to have a special "transaction" object. All SQL databases I know of have a transaction be a state of the connection. So you can't create multiple transactions on the same connection. Dropping this and having transaction be a property of the "db" object would be simpler and reduce the API surface. - I'm not sure giving blobs such prominence is needed. I still haven't gotten around to implementing blob support in the postgresql egg, and I think I've never used blobs in my professional career, ever. It's a bit of an antipattern to store file data in databases. However, I do agree that if a DB supports blobs it is important for a driver to support them, so standardising then might be wise. - I would extend transaction support to include a "level". Like I mentioned in my other mail, you can nest transactions via savepoints which can be individually rolled back or "committed" (which is a no-op). - The "meta" interface does not look very well-thought out. This stuff is super complicated and the API seems too limited for proper introspection. - It would be nice to have a way to execute statements with bound arguments without having to go through explicit prepared statement creation. In Postgres at least, it's possible to send parameterised SQL queries directly, so that's less overhead. And more convenient for the user when doing one-off queries (can be implemented in other DBs by making and immediately releasing a prepared statement). - Drop the difference between statements and queries; in Postgres at least you can get a result set with INSERT...RETURNING, so the difference is moot. Everything can return a result set. I don't know if this can be maintained always though; needs some more investigation. - Perhaps represent result sets as opaque random-access objects? Those can be converted to Scheme lists as needed. This could provide some efficiency and makes it easier to access meta data like data types of the columns in the result set etc. Cheers, Peter