In my quest of improving on DBD::Unify, I implemented - as per DBI documentation suggestion:
"Other database handle methods As with the driver package, other database handle methods may follow here. In particular you should consider a (possibly empty) disconnect () method and possibly a quote () method if DBI's default isn't correct for you. You may also need the type_info_all () and get_info () methods, as described elsewhere in this document." the methods get_info () and type_info_all (), which I generated on Windows with Strawberry perl as that is the only place where I got ODBC working in a somewhat reliable way, exactly like the docs show me. Note here that http://search.cpan.org/~timb/DBI-1.607/lib/DBI/DBD.pm#Generating_the_get_info_method shows the perl command without quotes and parens, so it is completely useless as an example perl -MDBI::DBD::Metadata -we "write_getinfo_pm (qw{ dbi:ODBC:foo_db username password Driver })" would be a portable solution to not mix up the quotes on WinShit Anyway, I put the generated files in place and my tests started to fail. I did expect some fails, but not this one: As get_info (29) now returns a TRUE value, the 'tables ()' method is using a different strategy to build the list it returns: sub tables { my ($dbh, @args) = @_; my $sth = $dbh->table_info (@args[0..4]) or return; my $tables = $sth->fetchall_arrayref or return; my @tables; » if ($dbh->get_info (29)) { # SQL_IDENTIFIER_QUOTE_CHAR » @tables = map { $dbh->quote_identifier (@{$_}[0,1,2]) } @$tables; » } else { # temporary old style hack (yeach) @tables = map { my $name = $_->[2]; if ($_->[1]) { my $schema = $_->[1]; # a sad hack (mostly for Informix I recall) my $quote = ($schema eq uc $schema) ? '' : '"'; $name = "$quote$schema$quote.$name"; } $name; } @$tables; } return @tables; } # tables With a true value for get_info (29), tables () uses the first block, where it used to use the second block. Unify has no support for CATALOG's, so the values in info are not defined, but still used in the map, causing all my tables no showing up with and empty "". in front of it, which is illegal to the database :( I think therefor that in this case, the catalog setting must also be checked, somewhat like this: sub tables { my ($dbh, @args) = @_; my $sth = $dbh->table_info (@args[0..4]) or return; my $tables = $sth->fetchall_arrayref or return; my @tables; if ($dbh->get_info (29)) { # SQL_IDENTIFIER_QUOTE_CHAR # Check SQL_CATALOG_USAGE my @range = $dbh->get_info (92) ? (0..2) : (1..2); @tables = map { $dbh->quote_identifier (@[EMAIL PROTECTED]) } @$tables; } else { # temporary old style hack (yeach) @tables = map { my $name = $_->[2]; if ($_->[1]) { my $schema = $_->[1]; # a sad hack (mostly for Informix I recall) my $quote = ($schema eq uc $schema) ? '' : '"'; $name = "$quote$schema$quote.$name"; } $name; } @$tables; } return @tables; } # tables -- H.Merijn Brand Amsterdam Perl Mongers http://amsterdam.pm.org/ using & porting perl 5.6.2, 5.8.x, 5.10.x, 5.11.x on HP-UX 10.20, 11.00, 11.11, 11.23, and 11.31, SuSE 10.1, 10.2, and 10.3, AIX 5.2, and Cygwin. http://mirrors.develooper.com/hpux/ http://www.test-smoke.org/ http://qa.perl.org http://www.goldmark.org/jeff/stupid-disclaimers/