X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=DBSchema.pm;h=ebdf607927990fff38ec5b161e042c76c84daa5b;hb=6f27f367ef98911e8f99ea385b76e06d11237ffa;hp=847873d669ccc55fb51bd394832f3989728098d4;hpb=5606f44c8c8134c605d5f5cb05b2e57a4b34e0b3;p=DBIx-DBSchema.git diff --git a/DBSchema.pm b/DBSchema.pm index 847873d..ebdf607 100644 --- a/DBSchema.pm +++ b/DBSchema.pm @@ -3,7 +3,7 @@ package DBIx::DBSchema; use strict; use vars qw(@ISA $VERSION); #use Exporter; -#use Carp qw(verbose); +use Carp qw(confess); use DBI; use FreezeThaw qw(freeze thaw cmpStr); use DBIx::DBSchema::Table; @@ -14,7 +14,7 @@ use DBIx::DBSchema::ColGroup::Index; #@ISA = qw(Exporter); @ISA = (); -$VERSION = "0.12"; +$VERSION = "0.22"; =head1 NAME @@ -39,7 +39,9 @@ DBIx::DBSchema - Database-independent schema objects $DBIx_DBSchema_table_object = $schema->table("table_name"); - @sql = $schema->sql($dsn); + @sql = $schema->sql($dbh); + @sql = $schema->sql($dsn, $username, $password); + @sql = $schema->sql($dsn); #doesn't connect to database - less reliable $perl_code = $schema->pretty_print; %hash = eval $perl_code; @@ -56,9 +58,10 @@ schema from an existing database. You can save the schema to disk and restore it a different process. Most importantly, DBIx::DBSchema can write SQL CREATE statements statements for different databases from a single source. -Currently supported databases are MySQL and PostgreSQL. DBIx::DBSchema will -attempt to use generic SQL syntax for other databases. Assistance adding -support for other databases is welcomed. +Currently supported databases are MySQL and PostgreSQL. Sybase support is +partially implemented. DBIx::DBSchema will attempt to use generic SQL syntax +for other databases. Assistance adding support for other databases is +welcomed. See L, "Driver Writer's Guide and Base Class". =head1 METHODS @@ -83,7 +86,7 @@ sub new { } -=item new_odbc DATABASE_HANDLE || DATA_SOURCE USERNAME PASSWORD [ ATTR ] +=item new_odbc DATABASE_HANDLE | DATA_SOURCE USERNAME PASSWORD [ ATTR ] Creates a new DBIx::DBSchema object from an existing data source, which can be specified by passing an open DBI database handle, or by passing the DBI data @@ -93,7 +96,9 @@ closely correspond to any non-portable column types. Use this to import a schema that you wish to use with many different database engines. Although primary key and (unique) index information will only be read from databases with DBIx::DBSchema::DBD drivers (currently MySQL and PostgreSQL), import of -column names and attributes *should* work for any database. +column names and attributes *should* work for any database. Note that this +method only uses "ODBC" column types; it does not require or use an ODBC +driver. =cut @@ -105,7 +110,7 @@ sub new_odbc { ); } -=item new_native DATABASE_HANDLE || DATA_SOURCE USERNAME PASSWORD [ ATTR ] +=item new_native DATABASE_HANDLE | DATA_SOURCE USERNAME PASSWORD [ ATTR ] Creates a new DBIx::DBSchema object from an existing data source, which can be specified by passing an open DBI database handle, or by passing the DBI data @@ -189,22 +194,37 @@ sub table { $self->{'tables'}->{$table}; } -=item sql_string [ DATASRC ] +=item sql [ DATABASE_HANDLE | DATA_SOURCE [ USERNAME PASSWORD [ ATTR ] ] ] Returns a list of SQL `CREATE' statements for this schema. -If passed a DBI data source such as `DBI:mysql:database' or +The data source can be specified by passing an open DBI database handle, or by +passing the DBI data source name, username and password. + +Although the username and password are optional, it is best to call this method +with a database handle or data source including a valid username and password - +a DBI connection will be opened and the quoting and type mapping will be more +reliable. + +If passed a DBI data source (or handle) such as `DBI:mysql:database' or `DBI:Pg:dbname=database', will use syntax specific to that database engine. Currently supported databases are MySQL and PostgreSQL. -If not passed a data source, or if there is no driver for the specified -database, will attempt to use generic SQL syntax. +If not passed a data source (or handle), or if there is no driver for the +specified database, will attempt to use generic SQL syntax. =cut sub sql { - my($self, $datasrc) = @_; - map { $self->table($_)->sql_create_table($datasrc); } $self->tables; + my($self, $dbh) = (shift, shift); + my $created_dbh = 0; + unless ( ref($dbh) || ! @_ ) { + $dbh = DBI->connect( $dbh, @_ ) or die $DBI::errstr; + $created_dbh = 1; + } + my @r = map { $self->table($_)->sql_create_table($dbh); } $self->tables; + $dbh->disconnect if $created_dbh; + @r; } =item pretty_print @@ -289,7 +309,7 @@ sub _load_driver { } else { $dbh =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i #nicked from DBI->connect or '' =~ /()/; # ensure $1 etc are empty if match fails - $driver = $1 or die "can't parse data source: $dbh"; + $driver = $1 or confess "can't parse data source: $dbh"; } #require "DBIx/DBSchema/DBD/$driver.pm"; @@ -312,6 +332,9 @@ sub _tables_from_dbh { Ivan Kohler +Charles Shapiro and Mitchell Friedman + contributed the start of a Sybase driver. + =head1 COPYRIGHT Copyright (c) 2000 Ivan Kohler @@ -334,8 +357,9 @@ qw(:sql_types) here instead of externally. L, L, L, L, -L, L, L, -L, L, L +L, L, +L, L, L, +L =cut