diff options
Diffstat (limited to 'lib/Test/Database/Driver/Pg.pm')
-rw-r--r-- | lib/Test/Database/Driver/Pg.pm | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/Test/Database/Driver/Pg.pm b/lib/Test/Database/Driver/Pg.pm new file mode 100644 index 0000000..106b909 --- /dev/null +++ b/lib/Test/Database/Driver/Pg.pm @@ -0,0 +1,100 @@ +package Test::Database::Driver::Pg; +use strict; +use warnings; +use Carp; + +use Test::Database::Driver; +our @ISA = qw( Test::Database::Driver ); + +sub _version { + DBI->connect_cached( $_[0]->connection_info() ) + ->selectcol_arrayref('SELECT VERSION()')->[0] =~ /^PostgreSQL (\S+)/; + return $1; +} + +sub create_database { + my ($self) = @_; + my $dbname = $self->available_dbname(); + + DBI->connect_cached( $self->connection_info() ) + ->do( "CREATE DATABASE $dbname" + . ( $self->{template} ? " TEMPLATE $self->{template}" : '' ) ); + + # return the handle + return Test::Database::Handle->new( + dsn => $self->dsn($dbname), + name => $dbname, + username => $self->username(), + password => $self->password(), + driver => $self, + ); +} + +sub drop_database { + my ( $self, $dbname ) = @_; + + DBI->connect_cached( $self->connection_info() ) + ->do("DROP DATABASE $dbname") + if grep { $_ eq $dbname } $self->databases(); +} + +sub databases { + my ($self) = @_; + my $basename = qr/^@{[$self->_basename()]}/; + my $databases = eval { + DBI->connect_cached( $self->connection_info(), { PrintError => 0 } ) + ->selectall_arrayref( + 'SELECT datname FROM pg_catalog.pg_database'); + }; + return grep {/$basename/} map {@$_} @$databases; +} + +'Pg'; + +__END__ + +=head1 NAME + +Test::Database::Driver::Pg - A Test::Database driver for Pg + +=head1 SYNOPSIS + + use Test::Database; + my @handles = Test::Database->handles( 'Pg' ); + +=head1 DESCRIPTION + +This module is the C<Test::Database> driver for C<DBD::Pg>. + +=head1 EXTRA PARAMETERS + +This driver understands the following extra parameters in the configuration +file: + +=over 4 + +=item template + +The template to use when creating a new database. + +=back + +=head1 SEE ALSO + +L<Test::Database::Driver> + +=head1 AUTHOR + +Philippe Bruhat (BooK), C<< <book@cpan.org> >> + +=head1 COPYRIGHT + +Copyright 2008-2010 Philippe Bruhat (BooK), all rights reserved. + +=head1 LICENSE + +This module is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=cut + |