NAME
SPOPS::DBI::TypeInfo - Represent type information for a single table
SYNOPSIS
# Do everything at initialization with DBI types
my $type_info = SPOPS::DBI::TypeInfo->new({ database => 'foo', table => 'cards', fields => [ 'face', 'value', 'color' ], types => [ SQL_VARCHAR, SQL_INTEGER, SQL_VARCHAR ] });
# Do everything at initialization with fake types
my $type_info = SPOPS::DBI::TypeInfo->new({ database => 'foo', table => 'cards', fields => [ 'face', 'value', 'color' ], types => [ 'char', 'int', 'char' ] }); ...
# Cycle through the fields and find the types
print "Information for ", join( '.', $type_info->database, $type_info->table ), "\n"; foreach my $field ( $type_info->get_fields ) { print "Field $field is type ", $type_info->get_type( $field ), "\n"; }
# Get the field/type information from the database
my $type_info = SPOPS::DBI::TypeInfo->new({ database => 'db', table => 'MyTable' }); my $dbh = my_function_to_get_database_handle( ... ); my $sql = qq/ SELECT * FROM MyTable WHERE 1 = 0 /; $type_info->fetch_types( $dbh, $sql ); print "Type of 'foo' is ", $type_info->get_type( 'foo' );
# Do the above at one time
my $dbh = my_function_to_get_database_handle( ... ); my $type_info = SPOPS::DBI::TypeInfo->new({ table => 'MyTable' }) ->fetch_types( $dbh );
DESCRIPTION
This is a lightweight object to maintain state about a field names and DBI types for a particular table in a particular database. It is generally used by SPOPS::SQLInterface, but it is sufficiently decoupled so you might find it useful elsewhere.
It is case-insensitive when finding the type to match a field, but
stores the fields in the case added or, if you use fetch_types()
,
the case the database reports.
Fake Types
This class supports a small number of 'fake' types as well so you do not have to import the DBI constants. These are:
Fake DBI ==================== int -> SQL_INTEGER num -> SQL_NUMERIC float -> SQL_FLOAT char -> SQL_VARCHAR date -> SQL_DATE
More can be added as necessary, but these seemed to cover the spectrum.
These fake types can be used anywhere you set a type for a field: in
the constructor, or in add_type()
. So the following do the same
thing:
$type_info->add_type( 'foo', SQL_NUMERIC ); $type_info->add_type( 'foo', 'num' );
METHODS
new( \%params )
Create a new object. There are two types of parameters: the object properties, and the fields and types to be used. The properties are listed in PROPERTIES -- just pass in a value for a property by its name and it will be set.
You have two options for the field names and values.
-
You can pass in parallel arrayrefs in
fields
andtypes
. -
You can pass a hashref of fields to values in
map
.
Example of parallel fields and types:
my $type_info = SPOPS::DBI::TypeInfo->new({ table => 'mytable', fields => [ 'foo', 'bar', 'baz' ], types => [ SQL_INTEGER, SQL_VARCHAR, SQL_TIMESTAMP ] });
Example of a map:
my $type_info = SPOPS::DBI::TypeInfo->new({ table => 'mytable', map => { foo => SQL_INTEGER, bar => SQL_VARCHAR, baz => SQL_TIMESTAMP } });,
Returns: new object instance.
get_type( $field )
Retrieves the DBI type for $field
. The case of $field
does not
matter, so the following will return the same value:
my $type = $type_info->get_type( 'first_name' ); my $type = $type_info->get_type( 'FIRST_NAME' ); my $type = $type_info->get_type( 'First_Name' );
Returns: the DBI type for $field
. If $field
is not registered
with this object, returns undef.
add_type( $field, $type )
Adds the type $type
for field $field
to the object. As noted in
Fake Types
, the value for $type
may be a 'fake' type which will
then get mapped to a DBI type.
If a type for $field
has already been set, no action is taken but a
warning is issued.
Examples:
$type_info->add_type( 'first_name', SQL_VARCHAR ); # ok $type_info->add_type( 'last_name', 'char' ); # ok $type_info->add_type( 'birthdate', SQL_DATE ); # ok $type_info->add_type( 'BIRTHDATE', SQL_DATE ); # results in warning $type_info->add_type( 'FIRST_NAME', SQL_INTEGER ); # results in warning
Returns: type set for $field
fetch_types( $dbh, [ $sql ] )
Retrieve fields and types from the database, given the database handle
$dbh
and the SQL $sql
. If $sql
is not provided we try to use
a common one:
SELECT * FROM $self->table WHERE 1 = 0
If the table
property is not set and no $sql
is passed in the
method throws an exception.
Any failures to prepare/execute the query result in a thrown SPOPS::Exception::DBI object.
The object will store the fields as the database returns them, so a
call to get_fields()
may return the fields in an unknown
order/case. (Getting the type via get_type()
will still work,
however.)
Returns: the object, which allows method chaining as a shortcut.
get_fields()
Returns a list of fields currently registered with this object. They are returned in the order they were added.
Example:
print "Fields in type info object: ", join( ", ", $type_info->get_fields );
get_types()
Returns a list of types currently registered with this object. They are returned in the order they were added.
Example:
print "Types in type info object: ", join( ", ", $type_info->get_types );
as_hash()
Returns the fields and types as a simple hash. The case of the field should be the same as it was specified or retrieved from the database.
Example:
my %type_map = $type_info->as_hash; foreach my $field ( keys %type_map ) { print "Field $field is type $type_map{ $field }\n"; }
PROPERTIES
All properties are get and set with the same name.
database
Name of the database this object is representing. (Optional, may be empty.)
Example:
$type_info->database( "production" ); print "Database for metadata: ", $type_info->database(), "\n";
table
Name of the table this object is representing. This is optional unless
you call fetch_types()
without a second argument ($sql
), since
the object will try to create default SQL to find fieldnames and types
by using the table name.
Example:
$type_info->table( "customers" ); print "Table for metadata: ", $type_info->table(), "\n";
AUTHORS
Chris Winters <chris@cwinters.com>
Thanks to Ray Zimmerman <rz10@cornell.edu> for pointing out the need for this module's functionality.
Generated from the SPOPS 0.87 source.