#!/usr/bin/perl -w use strict; use Test::More tests => 7; BEGIN { require 't/test-lib.pl'; use_ok('Rose::DB::Object'); } our $HAVE_PG; SKIP: foreach my $db_type (qw(pg pg_with_schema)) { skip("PostgreSQL tests", 6) unless($HAVE_PG); OVERRIDE_OK: { no warnings; *MyPgObject::init_db = sub { Rose::DB->new($db_type) }; } my $o = MyPgObject->new(name => 'John', k1 => 1, k2 => undef, k3 => 3); ok(ref $o && $o->isa('MyPgObject'), "new() 1 - $db_type"); $o->flag2('TRUE'); $o->date_created('now'); $o->last_modified($o->date_created); $o->save_col(7); ok($o->save, "save() 1 - $db_type"); is($o->id, 1, "auto-generated primary key - $db_type"); } BEGIN { # # PostgreSQL # my $dbh; eval { $dbh = Rose::DB->new('pg_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { our $HAVE_PG = 1; # Drop existing table and create schema, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE Rose_db_object_test CASCADE'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_test CASCADE'); $dbh->do('DROP TABLE Rose_db_object_chkpass_test'); $dbh->do('DROP SEQUENCE Rose_db_object_test_seq'); $dbh->do('DROP SEQUENCE Rose_db_object_private.Rose_db_object_test_seq'); $dbh->do('CREATE SCHEMA Rose_db_object_private'); } our $PG_HAS_CHKPASS = pg_has_chkpass(); $dbh->do('CREATE SEQUENCE Rose_db_object_test_seq'); my $pg_vers = $dbh->{'pg_server_version'}; my $active = $pg_vers >= 80100 ? q('act''ive') : q('act\'ive'); $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_test ( id INT DEFAULT nextval('Rose_db_object_test_seq') NOT NULL PRIMARY KEY, k1 INT, k2 INT, k3 INT, @{[ $PG_HAS_CHKPASS ? 'password CHKPASS,' : '' ]} name VARCHAR(32) NOT NULL, code CHAR(6), flag BOOLEAN NOT NULL DEFAULT 't', flag2 BOOLEAN, status VARCHAR(32) DEFAULT $active, bits BIT(5) NOT NULL DEFAULT B'00101', start DATE DEFAULT '1980-12-24', save INT, nums INT[], last_modified TIMESTAMP, date_created TIMESTAMP, UNIQUE(save), UNIQUE(k1, k2, k3) ) EOF $dbh->do('CREATE SEQUENCE Rose_db_object_private.Rose_db_object_test_seq'); $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_private.Rose_db_object_test ( id INT DEFAULT nextval('Rose_db_object_test_seq') NOT NULL PRIMARY KEY, k1 INT, k2 INT, k3 INT, @{[ $PG_HAS_CHKPASS ? 'password CHKPASS,' : '' ]} name VARCHAR(32) NOT NULL, code CHAR(6), flag BOOLEAN NOT NULL DEFAULT 't', flag2 BOOLEAN, status VARCHAR(32) DEFAULT $active, bits BIT(5) NOT NULL DEFAULT B'00101', start DATE DEFAULT '1980-12-24', save INT, nums INT[], last_modified TIMESTAMP, date_created TIMESTAMP, UNIQUE(save), UNIQUE(k1, k2, k3) ) EOF $dbh->disconnect; Rose::DB->default_type('pg'); package MyTmpPgObject; use Rose::DB::Object::Helpers qw(clone); our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } MyTmpPgObject->meta->table('Rose_db_object_test'); MyTmpPgObject->meta->auto_initialize; my $code = MyTmpPgObject->meta->perl_class_definition; $code =~ s/\bMyTmpPgObject\b/MyPgObject/g; eval $code; die $@ if($@); } } END { # Delete test table if($HAVE_PG) { # PostgreSQL my $dbh = Rose::DB->new('pg_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE Rose_db_object_test CASCADE'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_test CASCADE'); $dbh->do('DROP SEQUENCE Rose_db_object_test_seq'); $dbh->do('DROP SEQUENCE Rose_db_object_private.Rose_db_object_test_seq'); $dbh->do('DROP SCHEMA Rose_db_object_private CASCADE'); $dbh->disconnect; } }