On Mon, Mar 24, 2003 at 12:04:13AM -0500, Rudy Lippan wrote:
> On Fri, 14 Mar 2003, Tim Bunce wrote:
>
> > > get_info needs implementing. DBI::DBD::Metadata is best for that.
> > >
>
> Very Nice. :) Though, it looks like the output needs quite a bit of help
> in the way of picking off of the mysql struct and such :(
>
> > > quote_identifier needs implementing. (Or you could just implement
> > > get_info for values 29 and 41 and the DBI's default quote_identifier
> > > method should then do the right thing.)
>
> 1. How do you see $dbh->quote_identifier($catalog, $schema, $table) being
> used with mysql, where it seems that $catalog.$table is what mysql
> expects. And "$catalog..$table" does not work.
$catalog is unused for most databases, including MySQL. They use $schema.
Just copying the DBI code should be fine.
> 2. ` is the quoting char (In non-ansi mode); however, `` is not the
> escaped quote,
[Groan] Okay, copy the DBI's quote_identifier code and tweak to use
backslash escaping.
> and '/', '\', and '.' can not be used in a
> quoted identifier. Should quote_identifier() thow an error if it gets
> data that it cannot quote? -- I think it should, but I just wanted to
> some feed back.
It's generally best not to second-guess the server...
mysql> create table foo (`foo.bar` int);
Query OK, 0 rows affected (0.09 sec)
mysql> desc foo;
+---------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| foo.bar | int(11) | YES | | NULL | |
+---------+---------+------+-----+---------+-------+
For table names (which can't contain '.' etc) the server will
generate an error if and when apprioriate.
A couple of other items I've remembered recently...
- I'd really like to see mysql_client_found_rows=1 being the default.
With mysql_client_found_rows off, normal application code can't
tell the difference between an update that failed to match a row
and one that matched a row but didn't actually change anything.
It's a significant inconsistency with other drivers. I don't know
of any other driver that return a rows *physically changed* count.
This is going to be an issue with future versions of Class::DBI
because it will treat $obj->update() updating 0 rows as an error.
- The connect settings passed in the DSN string should be extracted
and set as standard attributes. Currently you can do:
DBI->connect("dbi:mysql:foo;mysql_compression=1", ...)
but not
DBI->connect("dbi:mysql:foo", ..., { mysql_compression=>1 })
or
DBI->connect("dbi:mysql(mysql_compression=1):foo", ...)
but want's to set certain attributes, like mysql_client_found_rows
for mysql. Currently the code has to edit the $DSN value. Not good.
An easy way to implement the change is to use dbd_db_login6
instead of dbd_db_login. Then the \%attr is passed in. The code can
then *delete* from attr any attributes it handles *at connect time*.
The DBI will call $dbh->STORE for any *remaining* attributes after
the connection has been established, before DBI->connect() returns.
Tim.