Tim Bunce wrote:
>
> Umm, carrying on from there... move %get_info_constants into DBD::Oracle::GetInfo
> and make get_info do:
>
> sub get_info {
> my($dbh, $info_type) = @_;
> require DBD::Oracle::GetInfo;
> my $v = $DBD::Oracle::GetInfo::info{int($info_type)};
> $v = &$v($dbh, $info_type) if ref $v eq 'CODE';
----------
The implementation (currently) doesn't need that parameter.
Steffen
diff -Nrc DBD-Oracle-1.12.orig/Oracle/GetInfo.pm DBD-Oracle-1.12/Oracle/GetInfo.pm
*** DBD-Oracle-1.12.orig/Oracle/GetInfo.pm Thu Jan 01 01:00:00 1970
--- DBD-Oracle-1.12/Oracle/GetInfo.pm Sun Feb 03 21:36:11 2002
***************
*** 0 ****
--- 1,66 ----
+ package DBD::Oracle::GetInfo;
+
+ use DBD::Oracle();
+
+ my $fmt = '%02d.%02d.%1d%1d%1d%1d'; # ODBC version string: ##.##.#####
+
+ my $sql_driver_ver = sprintf $fmt, split (/\./, $DBD::Oracle::VERSION);
+
+ sub sql_dbms_version {
+ my $dbh = shift;
+ return sprintf $fmt, @{DBD::Oracle::db::ora_server_version($dbh)};
+ }
+ sub sql_data_source_name {
+ my $dbh = shift;
+ return 'dbi:Oracle:' . $dbh->{Name};
+ }
+ sub sql_user_name {
+ my $dbh = shift;
+ # XXX OPS$
+ return $dbh->{CURRENT_USER};
+ }
+
+ %info = (
+ 117 => 0 # SQL_ALTER_DOMAIN
+ , 114 => 2 # SQL_CATALOG_LOCATION
+ , 10003 => 'N' # SQL_CATALOG_NAME
+ , 41 => '@' # SQL_CATALOG_NAME_SEPARATOR
+ , 42 => 'Database Link' # SQL_CATALOG_TERM
+ , 87 => 'Y' # SQL_COLUMN_ALIAS
+ , 22 => 1 # SQL_CONCAT_NULL_BEHAVIOR
+ , 127 => 0 # SQL_CREATE_ASSERTION
+ , 130 => 0 # SQL_CREATE_DOMAIN
+ , 2 => \&sql_data_source_name # SQL_DATA_SOURCE_NAME
+ , 17 => 'Oracle' # SQL_DBMS_NAME
+ , 18 => \&sql_dbms_version # SQL_DBMS_VERSION
+ , 6 => 'DBD/Oracle.pm' # SQL_DRIVER_NAME
+ , 7 => $sql_driver_ver # SQL_DRIVER_VER
+ , 136 => 0 # SQL_DROP_ASSERTION
+ , 139 => 0 # SQL_DROP_DOMAIN
+ , 28 => 1 # SQL_IDENTIFIER_CASE
+ , 29 => '"' # SQL_IDENTIFIER_QUOTE_CHAR
+ , 34 => 0 # SQL_MAX_CATALOG_NAME_LEN
+ , 30 => 30 # SQL_MAX_COLUMN_NAME_LEN
+ , 10005 => 30 # SQL_MAX_IDENTIFIER_LEN
+ , 32 => 30 # SQL_MAX_OWNER_NAME_LEN
+ , 34 => 0 # SQL_MAX_QUALIFIER_NAME_LEN
+ , 32 => 30 # SQL_MAX_SCHEMA_NAME_LEN
+ , 35 => 30 # SQL_MAX_TABLE_NAME_LEN
+ , 107 => 30 # SQL_MAX_USER_NAME_LEN
+ , 90 => 'N' # SQL_ORDER_BY_COLUMNS_IN_SELECT
+ , 39 => 'Owner' # SQL_OWNER_TERM
+ , 40 => 'Procedure' # SQL_PROCEDURE_TERM
+ , 114 => 2 # SQL_QUALIFIER_LOCATION
+ , 41 => '@' # SQL_QUALIFIER_NAME_SEPARATOR
+ , 42 => 'Database Link' # SQL_QUALIFIER_TERM
+ , 93 => 3 # SQL_QUOTED_IDENTIFIER_CASE
+ , 39 => 'Owner' # SQL_SCHEMA_TERM
+ , 14 => '\\' # SQL_SEARCH_PATTERN_ESCAPE
+ , 13 => sub {"$_[0]->{Name}"} # SQL_SERVER_NAME
+ , 94 => '$#' # SQL_SPECIAL_CHARACTERS
+ , 45 => 'Table' # SQL_TABLE_TERM
+ , 46 => 3 # SQL_TXN_CAPABLE
+ , 47 => \&sql_user_name # SQL_USER_NAME
+ );
+
+ 1;
diff -Nrc DBD-Oracle-1.12.orig/Oracle.pm DBD-Oracle-1.12/Oracle.pm
*** DBD-Oracle-1.12.orig/Oracle.pm Fri Aug 31 18:27:18 2001
--- DBD-Oracle-1.12/Oracle.pm Sun Feb 03 21:32:21 2002
***************
*** 313,318 ****
--- 313,327 ----
}
+ sub get_info {
+ my($dbh, $info_type) = @_;
+ require DBD::Oracle::GetInfo;
+ my $v = $DBD::Oracle::GetInfo::info{int($info_type)};
+ $v = $v->($dbh) if ref $v eq 'CODE';
+ return $v;
+ }
+
+
sub table_info {
my($dbh, $attr) = @_;
# XXX add knowledge of temp tables, etc
***************
*** 578,583 ****
--- 587,603 ----
$sth->bind_param_inout(":param", \$msg->[2], 4000);
$sth->execute or return undef;
return 1;
+ }
+
+ sub ora_server_version {
+ my $dbh = shift;
+ return $dbh->{ora_server_version} if defined $dbh->{ora_server_version};
+ $dbh->{ora_server_version} =
+ [ split /\./, $dbh->selectrow_array(<<'SQL', undef, 'Oracle%') .''];
+ SELECT version
+ FROM product_component_version
+ WHERE product LIKE ?
+ SQL
}
} # end of package DBD::Oracle::db