Currently, the following language appears in DBI::Const::GetInfo::ODBC:

The API for this module is private and subject to change.

But, it really hasn't in 10 years, and it's quite handy for drivers to
use.  Can we remove this warning and possibly document the module?
Here's an example of how DBD::SNMP is using it:

##############################################################################
# DBD::SNMP::GetInfo

package   # hide from PAUSE
   DBD::SNMP::GetInfo;

use sanity;
use parent qw(SQL::Statement::GetInfo);

sub sql_keywords {
   return join(',', keys %{
SQL::Dialects::SNMP::get_config_as_hash()->{reserved_words} });
}

# GetInfo key adjustments
use DBI::Const::GetInfo::ODBC;  # The API for this module is private
and subject to change.
   # (Yes, I know, but it hasn't, and it's really handy...)

# More details on these variables here:
#   http://msdn.microsoft.com/en-us/library/ms711681.aspx
#   http://vieka.com/esqldoc/esqlref/htm/odbcsqlgetinfo.htm

my %r = %DBI::Const::GetInfo::ODBC::ReturnValues;
my %i = %DBI::Const::GetInfo::ODBC::InfoTypes;
our %info;
*info = *SQL::Statement::GetInfo::info;

# FIXME: This should actually be in SQL::Statement::GetInfo
$info{ $i{SQL_CREATE_TABLE} }             = $r{SQL_CT_CREATE_TABLE} +
$r{SQL_CT_COMMIT_DELETE} + $r{SQL_CT_LOCAL_TEMPORARY};
$info{ $i{SQL_COLUMN_ALIAS} }             = 'Y';
$info{ $i{SQL_SQL92_DATETIME_FUNCTIONS} } = $r{SQL_SDF_CURRENT_DATE} +
$r{SQL_SDF_CURRENT_TIME} + $r{SQL_SDF_CURRENT_TIMESTAMP};
$info{ $i{SQL_NUMERIC_FUNCTIONS} }        = 0x00ffffff;  # all of them!
$info{ $i{SQL_SQL92_NUMERIC_VALUE_FUNCTIONS} } =
$r{SQL_SNVF_BIT_LENGTH} + $r{SQL_SNVF_CHAR_LENGTH} +
$r{SQL_SNVF_CHARACTER_LENGTH} + $r{SQL_SNVF_OCTET_LENGTH} +
$r{SQL_SNVF_POSITION};  # (only missing EXTRACT)
$info{ $i{SQL_SQL92_STRING_FUNCTIONS} }   = 0x000000fe;  # (now with
TRANSLATE support; only missing CONVERT here)
$info{ $i{SQL_STRING_FUNCTIONS} }         = 0x00ff7fff;  # (only
missing DIFFERENCE)
$info{ $i{SQL_SYSTEM_FUNCTIONS} }         = $r{SQL_FN_SYS_DBNAME} +
$r{SQL_FN_SYS_IFNULL} + $r{SQL_FN_SYS_USERNAME};

$info{ $i{SQL_ASYNC_MODE} }             = $r{SQL_AM_CONNECTION};  #
though, technically, everything is forced as async
$info{ $i{SQL_DATA_SOURCE_READ_ONLY} }  = 'Y';  # for the time being,
will change later
$info{ $i{SQL_FILE_USAGE} }             = $r{SQL_FILE_NOT_SUPPORTED};
$info{ $i{SQL_MULTIPLE_ACTIVE_TXN} }    = 'Y';

# RFC2578: OCTET STRING (SIZE (0..65535))
$info{ $i{SQL_MAX_BINARY_LITERAL_LEN} } = 65536;
$info{ $i{SQL_MAX_CHAR_LITERAL_LEN} }   = 65536;
#$info{ $i{SQL_MAX_SCHEMA_NAME_LEN} }   = ???;   # Don't think there's
a max MIB name length...
$info{ $i{SQL_MAX_TABLE_NAME_LEN} }     = 768;   # XXX: This needs RFC
confirmation
$info{ $i{SQL_MAX_COLUMN_NAME_LEN} }    = 768;   # XXX: This needs RFC
confirmation
# RFC2574: msgUserName OCTET STRING (SIZE(0..32)),
$info{ $i{SQL_MAX_USER_NAME_LEN} }      = 32;
# RFC1905: SNMPv2 limits OBJECT IDENTIFIER values to a maximum of 128
sub-identifiers, where each sub-identifier has a
# maximum value of 2**32-1.
$info{ $i{SQL_MAX_COLUMNS_IN_INDEX} }  = 128;
$info{ $i{SQL_MAX_INDEX_SIZE} }        = 128 * 10;

$info{ $i{SQL_SCHEMA_TERM} }           = 'MIB';
$info{ $i{SQL_SCHEMA_USAGE} }          = $r{SQL_SU_DML_STATEMENTS} +
$r{SQL_SU_TABLE_DEFINITION};

# We need to save some sanity here, so case sensitivity is OFF
$info{ $i{SQL_IDENTIFIER_CASE} }       = $r{SQL_IC_MIXED};

-- 
Brendan Byrd <p...@resonatorsoft.org>
Brendan Byrd <bb...@cpan.org>

Reply via email to