X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FDBI.pm;h=7115f74761ebb0b60a4442996dd161f804438d0a;hb=f56361ad7eea3245af7ec5b0eaed5ca439bd6168;hp=e2cad9ef4e73b51884a314a461a59a02cbd3b860;hpb=935800450f88b0500c4fa7c3b174cd22b5f9eb56;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Parser/DBI.pm b/lib/SQL/Translator/Parser/DBI.pm index e2cad9e..7115f74 100644 --- a/lib/SQL/Translator/Parser/DBI.pm +++ b/lib/SQL/Translator/Parser/DBI.pm @@ -9,7 +9,7 @@ SQL::Translator::Parser::DBI - "parser" for DBI handles use DBI; use SQL::Translator; - my $dbh = DBI->connect('dsn', 'user', 'pass', + my $dbh = DBI->connect('dsn', 'user', 'pass', { RaiseError => 1, FetchHashKeyName => 'NAME_lc', @@ -18,7 +18,9 @@ SQL::Translator::Parser::DBI - "parser" for DBI handles my $translator = SQL::Translator->new( parser => 'DBI', - dbh => $dbh, + parser_args => { + dbh => $dbh, + }, ); Or: @@ -36,8 +38,8 @@ Or: =head1 DESCRIPTION -This parser accepts an open database handle (or the arguments to create -one) and queries the database directly for the information. +This parser accepts an open database handle (or the arguments to create +one) and queries the database directly for the information. The following are acceptable arguments: @@ -45,8 +47,8 @@ The following are acceptable arguments: =item * dbh -An open DBI database handle. NB: Be sure to create the database with the -"FetchHashKeyName => 'NAME_lc'" option as all the DBI parsers expect +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 @@ -67,7 +69,7 @@ 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!). +and contribute it to the project!). Currently parsers exist for the following databases: @@ -96,12 +98,11 @@ query Oracle directly and skip the parsing of a text file, too. =cut -# ------------------------------------------------------------------- - use strict; +use warnings; use DBI; -use vars qw($VERSION @EXPORT); -$VERSION = '1.59'; +our @EXPORT; +our $VERSION = '1.59'; use constant DRIVERS => { mysql => 'MySQL', @@ -133,16 +134,18 @@ sub parse { my $db_user = $args->{'db_user'}; my $db_password = $args->{'db_password'}; + my $dbh_is_local; unless ( $dbh ) { die 'No DSN' unless $dsn; - $dbh = DBI->connect( $dsn, $db_user, $db_password, + $dbh = DBI->connect( $dsn, $db_user, $db_password, { FetchHashKeyName => 'NAME_lc', LongReadLen => 3000, LongTruncOk => 1, RaiseError => 1, - } + } ); + $dbh_is_local = 1; } die 'No database handle' unless defined $dbh; @@ -154,21 +157,21 @@ sub parse { SQL::Translator::load( $pkg ); - eval { + my $s = eval { no strict 'refs'; &{ $sub }( $tr, $dbh ) or die "No result from $pkg"; }; + my $err = $@; - $dbh->disconnect if defined $dbh; + eval { $dbh->disconnect } if (defined $dbh and $dbh_is_local); - die $@ if $@; + die $err if $err; - return 1; + return $s; } 1; -# ------------------------------------------------------------------- =pod =head1 AUTHOR