In creating database-agnostic analysers, I want to be unaware of what
is behind the scenes, and when I want to describe a table, I use my own
function:
$ perl -MDP -MPROCURA::DBD -we'DDumper describe ("usr")'
$VAR1 = {
LINK => undef,
NAME => 'c_usr',
NAME_lc => 'c_usr',
NAME_uc => 'C_USR',
NULLABLE => 2,
PRECISION => 9,
SCALE => 0,
TYPE => 2,
TYPE_NAME => 'NUMERIC'
};
$VAR2 = {
LINK => undef,
NAME => 'usr',
NAME_lc => 'usr',
NAME_uc => 'USR',
NULLABLE => 2,
PRECISION => 40,
SCALE => 0,
TYPE => 1,
TYPE_NAME => 'CHAR'
};
$VAR3 = {
LINK => undef,
NAME => 'c_lp',
NAME_lc => 'c_lp',
NAME_uc => 'C_LP',
NULLABLE => 2,
PRECISION => 4,
SCALE => 0,
TYPE => 5,
TYPE_NAME => 'SMALLINT'
};
What you see in action is a function that translates the basic
attributes available from a statement handle into a list of attributes
per field
--8<---
SYNOPSIS
my @desc = describe ("table"); # Get table description as an array of
# hashes. $desc[0]{NAME} is the name of
# the first field
my @desc = describe ("table", "L"); # .. *with* link info in $desc[0]{LINK}
DESCRIPTION
describe (table [, "L"])
Tries to describe "table" and return a listref of hashes in the field
order of the table, so "$r->[0]{NAME_lc}" is the lower case name of
the first field of the table.
The converted entries are "NAME", "NAME_lc", "NAME_uc", "NULLABLE",
"PRECISION", "SCALE", and "TYPE". Additionaly, "TYPE_NAME" has been
added with the "type_info ()" information for that "TYPE" if available.
When an "L" is passed as second argument, an additional hash entry
"LINK" is set to "schema.table.field" when the field references another
field. This additional entry is undef if no link could be found.
-->8---
Not that I suggest to add this to the DBI, but I wonder how useful the
addition of TYPE_NAME would be as a default attribute, as it is not the
easiest of all to decipher:
{ my %types; # Cache for types
# Convert numeric to readable
sub _type_name
{
my ($dbh, $type) = @_;
unless (exists $types{$dbh}{$type}) {
my $tpi = $type =~ m/^-?[0-9]+$/ ? $dbh->type_info ($type) : undef;
$types{$dbh}{$type} = $tpi ? $tpi->{TYPE_NAME} : $type // "?";
}
return $types{$dbh}{$type};
} # type_name
}
and later in describe ():
$desc[$i]{TYPE_NAME} = _type_name ($dbh, $desc[$i]{TYPE});
--
H.Merijn Brand http://tux.nl Perl Monger http://amsterdam.pm.org/
using & porting perl 5.6.2, 5.8.x, 5.10.x, 5.11.x on HP-UX 10.20, 11.00,
11.11, 11.23, and 11.31, OpenSuSE 10.3, 11.0, and 11.1, AIX 5.2 and 5.3.
http://mirrors.develooper.com/hpux/ http://www.test-smoke.org/
http://qa.perl.org http://www.goldmark.org/jeff/stupid-disclaimers/