How can we handle as many quirks as possible in general fashions?
hga@xxxxxx
(18 Sep 2019 01:32 UTC)
|
Re: How can we handle as many quirks as possible in general fashions?
Alaric Snell-Pym
(18 Sep 2019 10:19 UTC)
|
Re: How can we handle as many quirks as possible in general fashions? hga@xxxxxx (18 Sep 2019 12:48 UTC)
|
Re: How can we handle as many quirks as possible in general fashions?
Alaric Snell-Pym
(18 Sep 2019 13:24 UTC)
|
Re: How can we handle as many quirks as possible in general fashions?
hga@xxxxxx
(18 Sep 2019 14:24 UTC)
|
Re: How can we handle as many quirks as possible in general fashions?
Alaric Snell-Pym
(18 Sep 2019 15:29 UTC)
|
Re: How can we handle as many quirks as possible in general fashions?
John Cowan
(22 Sep 2019 01:29 UTC)
|
Re: How can we handle as many quirks as possible in general fashions?
John Cowan
(22 Sep 2019 01:20 UTC)
|
Note for the "Named vs numbered SQL parameters" discussion, this discusses a feature I'd like to fit into it. > From: Alaric Snell-Pym <xxxxxx@snell-pym.org.uk> > Date: Wednesday, September 18, 2019 5:18 AM > > On 18/09/2019 02:31, xxxxxx@ancell-ent.com wrote: > > In general, I reckon drivers can provide their own library that can > be imported directly by apps that need to use features specific to a > specific driver. Yes; what I want is procedures in such database specific libraries, plus I expect some genetic ones for common data transformations, to be callable when using the DBI level and above, with the DBI level passing the results without modification to the DBD driver layers. >>> The best we can do there is probably to have a "default encoding" >>> set as part of the options when making a connection, maybe with >>> the option to override it per-column when binding strings into >>> queries through some MySQL-specific mechanism.... >> >> Per column optional pass throughs ... could that be a general >> mechanism to possibly accomplish other things? How else are we >> going to say, *this* value gets interpreted in *this* non-default >> way? How ugly might that make the API? Here's a bit more from >> Alaric on this: > > I was thinking something like, assuming we have a query procedure > that binds values to a query, like so: > > (query "SELECT * FROM people WHERE name = ?" user-name) > > ...that normally does automatic type conversions, eg if user-name is > a string it'll be handed in as a string to the DB engine using the > "default" encoding. > > We might also have mysql-specific mapping from a mysql-specific opaque > type that wraps a string and an encoding to send it to the DB in: > > (import (prefix mysql mysql:)) > > (query "SELECT * FROM people WHERE name = ?" > (mysql:encoded-string user-name 'EBCDIC)) That's exactly what I came up with last night after posting the message you were replying to. The input parameters can be wrapped with database specific and probably generic "directive" procedures that Do The Right Thing in concert with their DBD layers below. The results of those procedures, or the example above without a modification procedure call, should be passed through the DBI level and only converted into a string or whatever to send to the database at the DBD level, which might have to consult configuration information previously fed to it, and/or metadata it's gleaned from the database. What I haven't yet figured out is how we should direct the DBD to do the same sorts of things with results. Can it all be done at the DBI level when we get them back, perhaps with what are logically callbacks to the DBI level, or do queries and other statement types that return data need to capture and send down to the DBD output data and quirk directives. Maybe something like an optional end parameter, a list with #f for each part of the tuple that doesn't need special treatment. I.e. something like: (query "SELECT address, last_login FROM people WHERE name = ?" user-name '(#f [do-some-magic-with-timestamps])) (Side note: if starting a project, you should never, EVER, have a table named users. I append something semi-random to such tables, like "users_plover" fir Defense in depth against injection attacks.) - Harold