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