Steffen Goeldner wrote:
> 
> Tim Bunce wrote:
> >
> > On Fri, Feb 08, 2002 at 03:16:38PM +0100, Steffen Goeldner wrote:
> 
> > >
> > > Ok. Or, I'm thinking about a method ado_schema_dbinfo_literal(), caching
> > > all data of the adSchemaDBInfoLiterals pseudo-table, ...
> > > Attached are some results for the MSDAORA and Jet Provider.
> >
> > Seems like a good idea.
> 
> Fine! Here a code snippet:
>
> [...]

And here is the patch:
diff -Nrc DBD-ADO-2.4.02-orig/lib/DBD/ADO/GetInfo.pm 
DBD-ADO-2.4.02/lib/DBD/ADO/GetInfo.pm
*** DBD-ADO-2.4.02-orig/lib/DBD/ADO/GetInfo.pm  Thu Jan 01 01:00:00 1970
--- DBD-ADO-2.4.02/lib/DBD/ADO/GetInfo.pm       Fri Feb 08 22:31:11 2002
***************
*** 0 ****
--- 1,64 ----
+ package DBD::ADO::GetInfo;
+ 
+ use DBD::ADO();
+ 
+ my $fmt = '%02d.%02d.%1d%1d%1d%1d';       # ODBC version string: ##.##.#####
+ 
+ my $sql_driver_ver = sprintf $fmt, split(/[\._]/, $DBD::ADO::VERSION);
+ 
+ sub sql_catalog_name_separator {
+       my $dbh = shift;
+       DBD::ADO::db::ado_schema_dbinfo_literal($dbh,'CATALOG_SEPARATOR') ||'.';
+ }
+ sub sql_concat_null_behavior {
+       { 1 => 0 # SQL_CB_NULL
+       , 2 => 1 # SQL_CB_NON_NULL
+       }->{$_[0]->{ado_conn}->Properties->{'NULL Concatenation Behavior'}{Value}};
+ }
+ sub sql_identifier_case {
+       { 1 => 1 # SQL_IC_UPPER
+       , 2 => 2 # SQL_IC_LOWER
+       , 4 => 3 # SQL_IC_SENSITIVE
+       , 8 => 4 # SQL_IC_MIXED
+       }->{$_[0]->{ado_conn}->Properties->{'Identifier Case Sensitivity'}{Value}};
+ }
+ sub sql_identifier_quote_char {
+       my $dbh = shift;
+       DBD::ADO::db::ado_schema_dbinfo_literal($dbh,'QUOTE') ||
+       DBD::ADO::db::ado_schema_dbinfo_literal($dbh,'QUOTE_PREFIX') ||'"';
+ }
+ sub sql_keywords {
+       my $dbh = shift;
+       my $sth = $dbh->func('adSchemaDBInfoKeywords','OpenSchema');
+       my @Keywords = ();
+       while ( my $row = $sth->fetch ) {
+               push @Keywords, $row->[0];
+       }
+       return join ',', @Keywords;
+ }
+ 
+ %info = (
+      41 => \&sql_catalog_name_separator   # SQL_CATALOG_NAME_SEPARATOR
+ ,    22 => \&sql_concat_null_behavior     # SQL_CONCAT_NULL_BEHAVIOR
+ ,     6 =>  $INC{'DBD/ADO.pm'}            # SQL_DRIVER_NAME               # XXX
+ ,     7 =>  $sql_driver_ver               # SQL_DRIVER_VER                # XXX
+ ,    28 => \&sql_identifier_case          # SQL_IDENTIFIER_CASE
+ ,    29 => \&sql_identifier_quote_char    # SQL_IDENTIFIER_QUOTE_CHAR
+ ,    89 => \&sql_keywords                 # SQL_KEYWORDS
+ );
+ 
+ %odbc2ado = (
+     114 => 'Catalog Location'             # SQL_CATALOG_LOCATION
+ ,    42 => 'Catalog Term'                 # SQL_CATALOG_TERM
+ ,     2 => 'Data Source Name'             # SQL_DATA_SOURCE_NAME
+ ,    17 => 'DBMS Name'                    # SQL_DBMS_NAME
+ ,    18 => 'DBMS Version'                 # SQL_DBMS_VERSION
+ #     6 => 'Provider Name'                # SQL_DRIVER_NAME               # XXX
+ #     7 => 'Provider Version'             # SQL_DRIVER_VER                # XXX
+ ,    40 => 'Procedure Term'               # SQL_PROCEDURE_TERM
+ ,    39 => 'Schema Term'                  # SQL_SCHEMA_TERM
+ ,    45 => 'Table Term'                   # SQL_TABLE_TERM
+ ,    47 => 'User Name'                    # SQL_USER_NAME
+ );
+ 
+ 1;
diff -Nrc DBD-ADO-2.4.02-orig/lib/DBD/ADO.pm DBD-ADO-2.4.02/lib/DBD/ADO.pm
*** DBD-ADO-2.4.02-orig/lib/DBD/ADO.pm  Thu Dec 13 01:17:30 2001
--- DBD-ADO-2.4.02/lib/DBD/ADO.pm       Sat Mar 02 20:55:50 2002
***************
*** 754,759 ****
--- 754,792 ----
        $sth;
      }
  
+       sub get_info {
+               my($dbh, $info_type) = @_;
+               $info_type = int($info_type);
+               require DBD::ADO::GetInfo;
+               if ( exists $DBD::ADO::GetInfo::odbc2ado{$info_type} ) {
+                       return 
+$dbh->{ado_conn}->Properties->{$DBD::ADO::GetInfo::odbc2ado{$info_type}}{Value};
+               }
+               my $v = $DBD::ADO::GetInfo::info{$info_type};
+               if (ref $v eq 'CODE') {
+                       my $get_info_cache = $dbh->{dbd_get_info_cache} ||= {};
+                       return $get_info_cache->{$info_type} if exists 
+$get_info_cache->{$info_type};
+                       $v = $v->($dbh);
+                       return $$v if ref $v eq 'SCALAR';  # don't cache!
+                       $get_info_cache->{$info_type} = $v;
+               }
+               return $v;
+       }
+ 
+       sub ado_schema_dbinfo_literal {
+               my($dbh, $literal_name) = @_;
+               my $cache = $dbh->{ado_schema_dbinfo_literal_cache};
+               unless ( defined $cache ) {
+                       $dbh->trace_msg("-> ado_schema_dbinfo_literal: filling 
+cache\n");
+                       $cache = $dbh->{ado_schema_dbinfo_literal_cache} = {};
+                       my $sth = $dbh->func('adSchemaDBInfoLiterals','OpenSchema');
+                       while ( my $row = $sth->fetch ) {
+                               $cache->{$row->[0]} = [ @$row ];
+                       }
+               }
+               my $row = $cache->{$literal_name};
+               return $row->[1] unless wantarray;  # literal value
+               return @$row;
+       }
  
        sub table_info {
                my($dbh, $attribs) = @_;

Reply via email to