[DB-SIG] db module wrapper

Chris Cogdon chris at cogdon.org
Thu Aug 19 18:33:21 CEST 2004


On Aug 19, 2004, at 08:57, M.-A. Lemburg wrote:

> I don't understand why you'd want to access the quoted
> SQL string with embedded parameters. After all binding
> parameters exist to make all this quoting unnecessary and
> indeed, many drivers pass the SQL string and the parameters
> well separated to the database. The database then builds
> an access path using the SQL string (with binding parameters)
> and runs the access path against the parameters that are
> specified as separate part of the request.

I can certainly understand why, because I've asked for this kind of 
thing in the past.

If I was writing a program that can, programatically piece together 
'where' criteria based on multiple, highly-varying external sources 
(such as tens of checkboxes a user on the other side of a web browser 
might select), I would want to have a structure that could return 
'where snippets' (which would be later joined by ANDs, and stuck onto 
the query).

The EASIEST way to do this is to be able to get access to the quoting 
mechanism (and different databases have different ways of quoting, for 
example, postgresql uses single quotes, and mysql uses double quotes 
(unless you put it into compatability mode)) and then pass plain old 
strings back into the section of code that actually issues the query.

One program that does exactly this is ViewCVS. in query.cgi there's a 
bunch of inputs and checkboxes. Each input, when used, generates a 
where snippet (i made up that name just now), plus a list of tables 
that needs to participate in the query. Once each input component is 
polled, all the where snippets and table requirements are collected, 
duplicates removed, and the query is pieced together.

The only reason it works as simply as it does is because ViewCVS has 
access to the quoting mechanism. Unfortunately, because there is no 
'standard' for getting access to the quoting mechanism, I cannot drop 
in another database, or even another database connector, unless it 
happens to have the same, non-standard, function for quoting attributes 
or I made modifications to the program.

One thing I learned when I pushed to have such a function included as 
part of the spec (even if it was OPTIONAL) is that many databases do 
NOT quote variable objects, and do NOT pass the entire query as a 
string to the backend, but instead pass a mixture of a string, and 
various binary objects, as a 'tuple'. Since the binary objects are 
passed 'raw', there is no need to conver them to a string only to have 
them converted back to binary again in the parser. Overall, saving 
time. (unfortunately, this doesn't take into account that some binary 
types need to be converted ANYWAY, such as handling endianness)

(In fact, the alternative to passing where snippets around is to 
emulate this behaviour... passing a format string and a list of 
parameters as a tuples around - which is awfully more complicated)

So... to Marc... that's why I think the DB-API 'community' is reluctant 
to standardise a way of getting access to the quoting mechanism: some 
databases (eg, oracle) don't actually 'do' quoting.

But... to the DB-API community, I still hope that you can see that, at 
least with databases that *DO* do quoting, that there is a good 
argument for making access to the quoting mechanism an optional but at 
least STANDARDISED part of the specification.


-- 
    ("`-/")_.-'"``-._        Chris Cogdon <chris at cogdon.org>
     . . `; -._    )-;-,_`)
    (v_,)'  _  )`-.\  ``-'
   _.- _..-_/ / ((.'
((,.-'   ((,/   fL



More information about the DB-SIG mailing list