auto-increment for postgresql
Marcus Ramberg [Mon, 8 Aug 2005 21:12:01 +0000 (21:12 +0000)]
lib/DBIx/Class/PK/Auto/Pg.pm [new file with mode: 0644]
t/12pg.t [new file with mode: 0644]

diff --git a/lib/DBIx/Class/PK/Auto/Pg.pm b/lib/DBIx/Class/PK/Auto/Pg.pm
new file mode 100644 (file)
index 0000000..3452cae
--- /dev/null
@@ -0,0 +1,50 @@
+package DBIx::Class::PK::Auto::Pg;
+
+use strict;
+use warnings;
+
+use base qw/DBIx::Class/;
+
+__PACKAGE__->load_components(qw/PK::Auto/);
+
+sub last_insert_id {
+  my $self=shift;
+  $self->get_autoinc_seq unless $self->{_autoinc_seq};
+  $self->storage->dbh->last_insert_id(undef,undef,undef,undef,
+    {sequence=>$self->{_autoinc_seq}});
+}
+
+sub get_autoinc_seq {
+  my $self=shift;
+  my $dbh= $self->storage->dbh;
+    my $sth    = $dbh->column_info( undef, undef, $self->_table_name, '%');
+    while (my $foo = $sth->fetchrow_arrayref){
+      if(defined $foo->[12] && $foo->[12] =~ /^nextval/) {
+        ($self->{_autoinc_seq}) = $foo->[12] =~ 
+         m!^nextval\('"?([^"']+)"?'::text\)!;
+      }
+    }
+}
+
+1;
+
+=head1 NAME 
+
+DBIx::Class::PK::Auto::SQLite - Automatic Primary Key class for SQLite
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+This class implements autoincrements for SQLite.
+
+=head1 AUTHORS
+
+Matt S. Trout <perl-stuff@trout.me.uk>
+
+=head1 LICENSE
+
+You may distribute this code under the same terms as Perl itself.
+
+=cut
+
diff --git a/t/12pg.t b/t/12pg.t
new file mode 100644 (file)
index 0000000..e3d3469
--- /dev/null
+++ b/t/12pg.t
@@ -0,0 +1,31 @@
+use lib qw(lib t/lib);
+use DBICTest::Schema;
+
+use Test::More;
+
+my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/};
+
+warn "$dsn $user $pass";
+
+plan skip_all, 'Set $ENV{DBICTEST_PG_DSN}, _USER and _PASS to run this test'
+  unless ($dsn && $user);
+
+plan tests => 1;
+
+DBICTest::Schema->compose_connection('PgTest' => $dsn, $user, $pass);
+
+my $dbh = PgTest::Artist->storage->dbh;
+
+eval {
+  $dbh->do("DROP TABLE artist;");
+};
+
+$dbh->do("CREATE TABLE artist (artistid serial PRIMARY KEY, name VARCHAR(255));");
+
+PgTest::Artist->load_components('PK::Auto::Pg');
+
+my $new = PgTest::Artist->create({ name => 'foo' });
+
+ok($new->artistid, "Auto-PK worked");
+
+1;