Thanks Steffen,  I've been very busy ... hopefully I can get a new
DBD::ADO release out soon.

Tom

On Mon, Mar 04, 2002 at 04:28:08PM +0100, Steffen Goeldner wrote:
> 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) = @_;


-- 
Thomas A. Lowery
See DBI/FAQ http://tlowery.hypermart.net

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

Reply via email to