Tim Bunce wrote:
>
> On Wed, Feb 06, 2002 at 09:48:54AM +0100, Steffen Goeldner wrote:
[...]
> > I'm not sure if we can cache *every* value. Is it possible that a DBMS
> > allows to change some properties at runtime (something like 'ALTER
> > SESSION SET ...')?
>
> Umm [grumble], you're right. How about this:
>
> 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);
> $get_info_cache->{$info_type} = ($v=$$v) if ref $v eq 'SCALAR';
---------------------
Here, the SCALAR-ref indicates: Cache it! (missing 'not'?)
I'd rather replace the pragma 'use short;' with 'no obfuscate;' ;-)
> }
>
> So caching is the default and a CODE ref can indicate that it doesn't want the
> value cached by returning a ref to the value.
>
> Slightly odd but I think it's probably better than adding cache
> logic to many individual subs.
Steffen
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 Mon Feb 04 20:37:27 2002
***************
*** 0 ****
--- 1,62 ----
+ 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_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;
+ my $sth = $dbh->func('adSchemaDBInfoLiterals','OpenSchema');
+ while ( my $row = $sth->fetch ) {
+ return $row->[1] if $row->[0] eq 'QUOTE'; # XXX QUOTE_PREFIX,
+QUOTE_SUFFIX
+ }
+ return undef;
+ }
+ 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 = (
+ 22 => \&sql_concat_null_behavior # SQL_CONCAT_NULL_BEHAVIOR
+ , 6 => '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 Wed Feb 06 20:20:22 2002
***************
*** 755,760 ****
--- 755,777 ----
}
+ sub get_info {
+ my($dbh, $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{int($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 table_info {
my($dbh, $attribs) = @_;
my @tp;