X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FDBI.pm;h=53f0a28e80f63d09958db3fae0bf8036a06592b1;hb=4c4636ed5857768d97998c890154211a0751ac5a;hp=20a62b430c816ad5c06af13873a45fc93c56d835;hpb=6a9f7bae6c936d99cc57d57f2a0fb6202860f076;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Parser/DBI.pm b/lib/SQL/Translator/Parser/DBI.pm index 20a62b4..53f0a28 100644 --- a/lib/SQL/Translator/Parser/DBI.pm +++ b/lib/SQL/Translator/Parser/DBI.pm @@ -1,10 +1,9 @@ package SQL::Translator::Parser::DBI; # ------------------------------------------------------------------- -# $Id: DBI.pm,v 1.1 2003-10-03 00:21:41 kycl4rk Exp $ +# $Id: DBI.pm,v 1.10 2006-05-24 18:08:41 duality72 Exp $ # ------------------------------------------------------------------- -# Copyright (C) 2003 Ken Y. Clark , -# darren chamberlain +# Copyright (C) 2002-4 SQLFairy Authors # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -30,7 +29,12 @@ SQL::Translator::Parser::DBI - "parser" for DBI handles use DBI; use SQL::Translator; - my $dbh = DBI->connect(...); + my $dbh = DBI->connect('dsn', 'user', 'pass', + { + RaiseError => 1, + FetchHashKeyName => 'NAME_lc', + } + ); my $translator = SQL::Translator->new( parser => 'DBI', @@ -41,27 +45,29 @@ Or: use SQL::Translator; - my $translator = SQL::Translator->new( - parser => 'DBI', - dsn => 'dbi:mysql:FOO', - db_user => 'guest', - db_password => 'password', + my $translator = SQL::Translator->new( + parser => 'DBI', + parser_args => { + dsn => 'dbi:mysql:FOO', + db_user => 'guest', + db_password => 'password', + } ); =head1 DESCRIPTION This parser accepts an open database handle (or the arguments to create -one) and queries the database directly for the information. The correct -SQL::Translator::Parser::DBI class is determined automatically by -inspecting $dbh->{'Driver'}{'Name'}. +one) and queries the database directly for the information. The following are acceptable arguments: -=over +=over 4 =item * dbh -An open DBI database handle. +An open DBI database handle. NB: Be sure to create the database with the +"FetchHashKeyName => 'NAME_lc'" option as all the DBI parsers expect +lowercased column names. =item * dsn @@ -77,6 +83,37 @@ The password to use for connecting to a database. =back +There is no need to specify which type of database you are querying as +this is determined automatically by inspecting $dbh->{'Driver'}{'Name'}. +If a parser exists for your database, it will be used automatically; +if not, the code will fail automatically (and you can write the parser +and contribute it to the project!). + +Currently parsers exist for the following databases: + +=over 4 + +=item * MySQL + +=item * SQLite + +=item * Sybase + +=item * PostgreSQL (still experimental) + +=back + +Most of these parsers are able to query the database directly for the +structure rather than parsing a text file. For large schemas, this is +probably orders of magnitude faster than traditional parsing (which +uses Parse::RecDescent, an amazing module but really quite slow). + +Though no Oracle parser currently exists, it would be fairly easy to +query an Oracle database directly by using DDL::Oracle to generate a +DDL for the schema and then using the normal Oracle parser on this. +Perhaps future versions of SQL::Translator will include the ability to +query Oracle directly and skip the parsing of a text file, too. + =cut # ------------------------------------------------------------------- @@ -84,15 +121,22 @@ The password to use for connecting to a database. use strict; use DBI; use vars qw($VERSION @EXPORT); -$VERSION = sprintf "%d.%02d", q$Revision: 1.1 $ =~ /(\d+)\.(\d+)/; +$VERSION = sprintf "%d.%02d", q$Revision: 1.10 $ =~ /(\d+)\.(\d+)/; use constant DRIVERS => { - sqlite => 'SQLite', + mysql => 'MySQL', + odbc => 'SQLServer', + oracle => 'Oracle', + pg => 'PostgreSQL', + sqlite => 'SQLite', + sybase => 'Sybase', + pg => 'PostgreSQL', + db2 => 'DB2', }; use Exporter; -use SQL::Translator::Utils qw(debug normalize_name); -use SQL::Translator::Parser::DBI::SQLite; + +use SQL::Translator::Utils qw(debug); use base qw(Exporter); @EXPORT = qw(parse); @@ -103,7 +147,6 @@ use base qw(Exporter); sub parse { my ( $tr, $data ) = @_; - $tr->debug( "in DBI\n" ); my $args = $tr->parser_args; my $dbh = $args->{'dbh'}; my $dsn = $args->{'dsn'}; @@ -112,7 +155,14 @@ sub parse { unless ( $dbh ) { die 'No DSN' unless $dsn; - $dbh = DBI->connect( $dsn, $db_user, $db_password, {RaiseError=>1} ); + $dbh = DBI->connect( $dsn, $db_user, $db_password, + { + FetchHashKeyName => 'NAME_lc', + LongReadLen => 3000, + LongTruncOk => 1, + RaiseError => 1, + } + ); } die 'No database handle' unless defined $dbh; @@ -122,14 +172,16 @@ sub parse { my $pkg = "SQL::Translator::Parser::DBI::$driver"; my $sub = $pkg.'::parse'; - $tr->debug( "Calling sub '$sub'\n" ); - -# $tr->load( $pkg ); + $tr->load( $pkg ); - { + eval { no strict 'refs'; &{ $sub }( $tr, $dbh ) or die "No result from $pkg"; - } + }; + + $dbh->disconnect if defined $dbh; + + die $@ if $@; return 1; } @@ -145,6 +197,6 @@ Ken Y. Clark Ekclark@cpan.orgE. =head1 SEE ALSO -DBI. +DBI, SQL::Translator. =cut