On Wed, Aug 20, 2008 at 07:38:36PM +0200, H.Merijn Brand wrote:
> 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

Patches welcome. Want a commit bit (if you don't have one already)?

> 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 :(

Seems like your quote_identifier() method is doing the wrong thing.
The docs for quote_identifier say:

    **Undefined names are ignored** and the remainder are quoted and then
    joined together, typically with a dot (".") character.

Tim.

> 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/

Reply via email to