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/

Reply via email to