On Mon, 1 Sep 2008 12:07:53 +0100, Tim Bunce <[EMAIL PROTECTED]>
wrote:

> On Mon, Sep 01, 2008 at 08:17:38AM +0200, H.Merijn Brand wrote:
> > On Sun, 31 Aug 2008 22:52:32 +0100, Tim Bunce <[EMAIL PROTECTED]>
> > wrote:
> > 
> > > 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)?
> > 
> > These are the patches I feel comfortable with, as they obviously will
> > not clash with *opinions*. Is the repo in git? in that case, I'll take
> > the bit. If it is in svn, I'll pass.
> 
> svn, pity.

OK, patch:
--8<---
diff -pu lib/DBI/DBD.pm.org lib/DBI/DBD.pm
--- lib/DBI/DBD.pm.org  2008-09-01 15:22:45.000000000 +0200
+++ lib/DBI/DBD.pm      2008-09-01 15:24:48.000000000 +0200
@@ -2632,8 +2632,8 @@ database.

 With the pre-requisites in place, you might type:

-    perl -MDBI::DBD::Metadata -e write_getinfo_pm \
-            dbi:ODBC:foo_db username password Driver
+    perl -MDBI::DBD::Metadata -we \
+       "write_getinfo_pm (qw{ dbi:ODBC:foo_db username password Driver })"

 The procedure writes to standard output the code that should be added to
 your F<Driver.pm> file and the code that should be written to
@@ -2657,8 +2657,8 @@ L</Generating the get_info method>.

 With the pre-requisites in place, you might type:

-    perl -MDBI::DBD::Metadata -e write_typeinfo \
-            dbi:ODBC:foo_db username password Driver
+    perl -MDBI::DBD::Metadata -we \
+       "write_typeinfo (qw{ dbi:ODBC:foo_db username password Driver })"

 The procedure writes to standard output the code that should be added to
 your F<Driver.pm> file and the code that should be written to
-->8---

> > > > 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:
> > 
> > I do not have a quote_identifier () method. I rely on DBI doing the
> > right thing.
> 
> I believe the DBI's quote_identifier does the right thing.
> 
> I'd guess that the CATALOG value returned by table_info is an empty
> string but should be an undef.

Not defined at all, so I *guess* that is the same as undefined. Look,
these are all commented out:

lib/DBD/Unify/GetInfo.pm:#   114 => 0,     # SQL_CATALOG_LOCATION
lib/DBD/Unify/GetInfo.pm:# 10003 => undef, # SQL_CATALOG_NAME
lib/DBD/Unify/GetInfo.pm:#    41 => "",    # SQL_CATALOG_NAME_SEPARATOR
lib/DBD/Unify/GetInfo.pm:#    42 => "",    # SQL_CATALOG_TERM
lib/DBD/Unify/GetInfo.pm:#    92 => 0,     # SQL_CATALOG_USAGE
lib/DBD/Unify/GetInfo.pm:#    34 => 18,    # SQL_MAXIMUM_CATALOG_NAME_LENGTH
lib/DBD/Unify/GetInfo.pm:#    34 => 18,    # SQL_MAX_CATALOG_NAME_LEN

> > IIRC quote_identifier () was not in the list of required
> > methods for DBD
> 
> It's not required unless the DBI's default doesn't do thing right thing
> for a particular driver.

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