diff options
Diffstat (limited to 'DataSource')
-rw-r--r-- | DataSource/Driver.pm | 101 | ||||
-rw-r--r-- | DataSource/Pg.pm | 77 | ||||
-rw-r--r-- | DataSource/mysql.pm | 78 |
3 files changed, 256 insertions, 0 deletions
diff --git a/DataSource/Driver.pm b/DataSource/Driver.pm new file mode 100644 index 0000000..d848fa3 --- /dev/null +++ b/DataSource/Driver.pm @@ -0,0 +1,101 @@ +package DBIx::DataSource::Driver; + +use strict; +use vars qw($VERSION); +use DBI; + +$VERSION = '0.01'; + +=head1 NAME + +DBIx::DataSource::Driver - Driver Writer's Guide and base class + +=head1 SYNOPSIS + + perldoc DBIx::DataSource::Driver; + + or + + package DBIx::DataSource::FooBase; + use DBIx::DataSource::Driver; + @ISA = qw( DBIx::DataSource::Driver ); + +=head1 DESCRIPTION + +To implement a driver for your database: + +1) If you can create a database with an SQL command through DBI/DBD, simply + provide a parse_dsn class method which returns a list consisting of the + *actual* data source to use in DBI->connect and the SQL. + + package DBIx::DataSource::NewDatabase; + use DBIx::DataSource::Driver; + @ISA = qw( DBIx::DataSource::Driver ); + + sub parse_dsn { + my( $class, $action, $dsn ) = @_; + + # $action is `create' or `drop' + # for example, if you parse parse $dsn for $database, + # $sql = "$action $database"; + + # you can die on errors - it'll be caught + + ( $new_dsn, $sql ); + } + +2) Otherwise, you'll need to write B<create_database> and B<drop_database> + class methods. + + package DBIx::DataSource::NewDatabase; + + sub create_database { + my( $class, $dsn, $user, $pass ) = @_; + + # for success, return true + # for failure, die (it'll be caught) + } + + sub drop_database { + my( $class, $dsn, $user, $pass ) = @_; + + # for success, return true + # for failure, die (it'll be caught) + } + +=cut + +sub create_database { shift->_sql('create', @_) }; +sub drop_database { shift->_sql('drop', @_) }; + +sub _sql { + my( $class, $action, $dsn, $user, $pass ) = @_; + my( $new_dsn, $sql ) = $class->parse_dsn($action, $dsn); + my $dbh = DBI->connect( $new_dsn, $user, $pass ) or die $DBI::errstr; +# $dbh->do($sql) or die $dbh->errstr; +# silly DBI. implicit DESTROY yummy. + $dbh->do($sql) or do { my $err = $dbh->errstr; $dbh->disconnect; die $err; }; + $dbh->disconnect or die $dbh->errstr; +} + +=head1 AUTHOR + +Ivan Kohler <ivan-dbix-datasource@420.am> + +=head1 COPYRIGHT + +Copyright (c) 2000 Ivan Kohler +Copyright (c) 2000 Mail Abuse Prevention System LLC +All rights reserved. +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. + +=head1 BUGS + +=head1 SEE ALSO + +L<DBIx::DataSource>, L<DBIx::DataSource::mysql>, L<DBIx::DataSource::Pg>, L<DBI> + +=cut + +1; diff --git a/DataSource/Pg.pm b/DataSource/Pg.pm new file mode 100644 index 0000000..4956785 --- /dev/null +++ b/DataSource/Pg.pm @@ -0,0 +1,77 @@ +package DBIx::DataSource::Pg; + +use strict; +use vars qw($VERSION @ISA); +use DBIx::DataSource::Driver; +@ISA = qw( DBIx::DataSource::Driver ); + +$VERSION = '0.01'; + +=head1 NAME + +DBIx::DataSource::Pg - PostgreSQL driver for DBIx::DataSource + +=head1 SYNOPSIS + + use DBIx::DataSource; + + use DBIx::DataSource qw( create_database drop_database ); + + create_database( "dbi:Pg:dbname=$dbname", $username, $password ) + or warn $DBIx::DataSource::errstr; + + create_database( "dbi:Pg:dbname=$dbname;host=$host;port=$port", + $username, $password ) + or warn $DBIx::DataSource::errstr; + + drop_database( "dbi:Pg:dbname=$dbname", $username, $password ) + or warn $DBIx::DataSource::errstr; + + drop_database( "dbi:Pg:dbname=$dbname;host=$host;port=$port", + $username, $password ) + or warn $DBIx::DataSource::errstr; + +=head1 DESCRIPTION + +This is the PostgresSQL driver for DBIx::DataSource. + +=cut + +sub parse_dsn { + my( $class, $action, $dsn ) = @_; + $dsn =~ s/^(dbi:(\w*?)(?:\((.*?)\))?:)//i #nicked from DBI->connect + or '' =~ /()/; # ensure $1 etc are empty if match fails + my $prefix = $1 or die "can't parse data source: $dsn"; + + my $database; + if ( $dsn =~ s/(^|[;:])dbname=([^=:;]+)([;:]|$)/$1dbname=template1$3/ ) { + $database = $2; + } else { + die "can't parse data source: $prefix$dsn"; + } + + ( "$prefix$dsn", "\U$action\E DATABASE $database" ); +} + +=head1 AUTHOR + +Ivan Kohler <ivan-dbix-datasource@420.am> + +=head1 COPYRIGHT + +Copyright (c) 2000 Ivan Kohler +Copyright (c) 2000 Mail Abuse Prevention System LLC +All rights reserved. +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. + +=head1 BUGS + +=head1 SEE ALSO + +L<DBIx::DataSource::Driver>, L<DBIx::DataSource>, L<DBD::Pg>, L<DBI> + +=cut + +1; + diff --git a/DataSource/mysql.pm b/DataSource/mysql.pm new file mode 100644 index 0000000..f049e0a --- /dev/null +++ b/DataSource/mysql.pm @@ -0,0 +1,78 @@ +package DBIx::DataSource::mysql; + +use strict; +use vars qw($VERSION @ISA); +use DBIx::DataSource::Driver; +@ISA = qw( DBIx::DataSource::Driver ); + +$VERSION = '0.01'; + +=head1 NAME + +DBIx::DataSource::mysql - MySQL driver for DBIx::DataSource + +=head1 SYNOPSIS + + use DBIx::DataSource; + + use DBIx::DataSource qw( create_database drop_database ); + + create_database( "dbi:mysql:$database", $username, $password ) + or warn $DBIx::DataSource::errstr; + + create_database( "dbi:mysql:database=$database;host=$hostname;port=$port", + $username, $password ) + or warn $DBIx::DataSource::errstr; + + drop_database( "dbi:mysql:$database", $username, $password ) + or warn $DBIx::DataSource::errstr; + + drop_database( "dbi:mysql:database=$database;host=$hostname;port=$port", + $username, $password ) + or warn $DBIx::DataSource::errstr; + +=head1 DESCRIPTION + +This is the MySQL driver for DBIx::DataSource. + +=cut + +sub parse_dsn { + my( $class, $action, $dsn ) = @_; + $dsn =~ s/^(dbi:(\w*?)(?:\((.*?)\))?:)//i #nicked from DBI->connect + or '' =~ /()/; # ensure $1 etc are empty if match fails + my $prefix = $1 or die "can't parse data source: $dsn"; + + my $database; + if ( $dsn =~ s/(^|[;:])(db|dbname|database)=([^=:;]+)([;:]|$)/$1$2=$4/ ) { + $database = $3; + } else { + $database = $dsn; + $dsn = ''; + } + + ( "$prefix$dsn", "\U$action\E DATABASE $database" ); +} + +=head1 AUTHOR + +Ivan Kohler <ivan-dbix-datasource@420.am> + +=head1 COPYRIGHT + +Copyright (c) 2000 Ivan Kohler +Copyright (c) 2000 Mail Abuse Prevention System LLC +All rights reserved. +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. + +=head1 BUGS + +=head1 SEE ALSO + +L<DBIx::DataSource::Driver>, L<DBIx::DataSource>, L<DBD::mysql>, L<DBI> + +=cut + +1; + |