#!/usr/bin/perl -w use strict; use Test::More tests => 218; BEGIN { require 't/test-lib.pl'; use_ok('DateTime'); use_ok('Rose::DB::Object'); use_ok('Rose::DB::Object::Manager'); } our($HAVE_PG, $HAVE_MYSQL, $HAVE_INFORMIX, $HAVE_SQLITE); # # PostgreSQL # SKIP: foreach my $db_type (qw(pg pg_with_schema)) { skip("PostgreSQL tests", 92) unless($HAVE_PG); Rose::DB->default_type($db_type); # Test the subselect limit code #Rose::DB::Object::Manager->default_limit_with_subselect(1); TEST_HACK: { no warnings; *MyPgObject::init_db = sub { Rose::DB->new($db_type) }; } my $o = MyPgObject->new(name => 'John', code => 1, started => '1/1/2000', num => 10); ok($o->save, "save() 1 - $db_type"); $o = MyPgObject->new(name => 'Fred', code => 2, started => '1/2/1999', num => 20); ok($o->save, "save() 2 - $db_type"); $o = MyPgObject->new(name => 'Steve', code => 3, started => '1/3/1998', num => 30); ok($o->save, "save() 3 - $db_type"); $o = MyPgObject->new(name => 'Bud', code => 4, started => '1/4/1997', num => 40); ok($o->save, "save() 4 - $db_type"); $o = MyPgObject->new(name => 'Betty', code => 5, started => '1/5/1996', num => 50); ok($o->save, "save() 5 - $db_type"); my $now = DateTime->now; my $yesterday = $now->clone->subtract(days => 1); # Start update tests #local $Rose::DB::Object::Manager::Debug = 1; #$DB::single = 1; my $num = MyPgObject::Manager->update_objs( set => { num => { sql => 'num + 1' }, code => 'foo', data => "\000\001\002", }, where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] }, data => { ne => "\000\001\002" }, ]); ok(defined $num, "update 1 - $db_type"); ok($num == 0, "update 2 - $db_type"); is($num, '0', "update 3 - $db_type"); eval { $num = MyPgObject::Manager->update_objs( where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); }; ok($@, "update missing set 1 - $db_type"); $num = MyPgObject::Manager->update_objs( set => { num => { sql => 'num + 1' }, }, where => [ name => { like => '%oh%' }, or => [ started => { lt => $now }, started => { lt => $yesterday }, started => { lt => '1/1/2005' }, ], ]); ok($num, "update 4 - $db_type"); ok($num == 1, "update 5 - $db_type"); is($num, 1, "update 6 - $db_type"); $o = MyPgObject->new(name => 'John'); $o->load; is($o->num, 11, "update verify 1 - $db_type"); $o = MyPgObject->new(name => 'Fred'); $o->load; is($o->num, 20, "update verify 2 - $db_type"); $o = MyPgObject->new(name => 'Steve'); $o->load; is($o->num, 30, "update verify 3 - $db_type"); $o = MyPgObject->new(name => 'Bud'); $o->load; is($o->num, 40, "update verify 4 - $db_type"); $o = MyPgObject->new(name => 'Betty'); $o->load; is($o->num, 50, "update verify 5 - $db_type"); eval { $num = MyPgObject::Manager->update_objs( set => { ended => DateTime->new(year => 1999, month => 2, day => 3), }); }; ok($@, "update refused - $db_type"); $num = MyPgObject::Manager->update_objs( all => 1, set => { data => "\000\001\003", ended => DateTime->new(year => 1999, month => 2, day => 3), }); ok($num, "update 7 - $db_type"); ok($num == 5, "update 8 - $db_type"); is($num, 5, "update 9 - $db_type"); my $objs = MyPgObject::Manager->get_objs; my $test_num = 6; foreach my $obj (@$objs) { ok($obj->ended->ymd eq '1999-02-03', "update verify date $test_num - $db_type"); ok($obj->data eq "\000\001\003", "update verify data $test_num - $db_type"); } # End update tests # Start delete tests $num = MyPgObject::Manager->delete_objs( where => [ name => { like => 'NoneSuch%' }, data => "\000\001\003", started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); ok(defined $num, "delete 1 - $db_type"); ok($num == 0, "delete 2 - $db_type"); is($num, '0', "delete 3 - $db_type"); $num = MyPgObject::Manager->delete_objs( where => [ name => { like => 'B%' }, started => { lt => 'now' }, ]); ok($num, "delete 4 - $db_type"); ok($num == 2, "delete 5 - $db_type"); is($num, 2, "delete 6 - $db_type"); $num = MyPgObject::Manager->delete_objs( where => [ name => { like => '%oh%' }, num => [ (1 .. 11) ], data => "\000\001\003", ]); ok($num, "delete 7 - $db_type"); ok($num == 1, "delete 8 - $db_type"); is($num, 1, "delete 9 - $db_type"); $num = MyPgObject::Manager->get_objs_count; is($num, 2, "count remaining 1 - $db_type"); eval { $num = MyPgObject::Manager->delete_objs }; ok($@, "delete refuse - $db_type"); $num = MyPgObject::Manager->delete_objs(all => 1); ok($num, "delete 10 - $db_type"); ok($num == 2, "delete 11 - $db_type"); is($num, 2, "delete 12 - $db_type"); $num = MyPgObject::Manager->get_objs_count; is($num, 0, "count remaining 2 - $db_type"); # End delete tests # End test of the subselect limit code #Rose::DB::Object::Manager->default_limit_with_subselect(0); } # # MySQL # SKIP: foreach my $db_type ('mysql') { skip("MySQL tests", 41) unless($HAVE_MYSQL); Rose::DB->default_type($db_type); my $o = MyMySQLObject->new(name => 'John', code => 1, started => '1/1/2000', num => 10); ok($o->save, "save() 1 - $db_type"); $o = MyMySQLObject->new(name => 'Fred', code => 2, started => '1/2/1999', num => 20); ok($o->save, "save() 2 - $db_type"); $o = MyMySQLObject->new(name => 'Steve', code => 3, started => '1/3/1998', num => 30); ok($o->save, "save() 3 - $db_type"); $o = MyMySQLObject->new(name => 'Bud', code => 4, started => '1/4/1997', num => 40); ok($o->save, "save() 4 - $db_type"); $o = MyMySQLObject->new(name => 'Betty', code => 5, started => '1/5/1996', num => 50); ok($o->save, "save() 5 - $db_type"); my $now = DateTime->now; my $yesterday = $now->clone->subtract(days => 1); # Start update tests #local $Rose::DB::Object::Manager::Debug = 1; #$DB::single = 1; my $num = MyMySQLObject::Manager->update_objs( set => { num => { sql => 'num + 1' }, code => 'foo', }, where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); ok(defined $num, "update 1 - $db_type"); ok($num == 0, "update 2 - $db_type"); is($num, '0', "update 3 - $db_type"); eval { $num = MyMySQLObject::Manager->update_objs( where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); }; ok($@, "update missing set 1 - $db_type"); $num = MyMySQLObject::Manager->update_objs( set => { num => { sql => 'num + 1' }, }, where => [ name => { like => '%oh%' }, or => [ started => { lt => $now }, started => { lt => $yesterday }, started => { lt => '1/1/2005' }, ], ]); ok($num, "update 4 - $db_type"); ok($num == 1, "update 5 - $db_type"); is($num, 1, "update 6 - $db_type"); $o = MyMySQLObject->new(name => 'John'); $o->load; is($o->num, 11, "update verify 1 - $db_type"); $o = MyMySQLObject->new(name => 'Fred'); $o->load; is($o->num, 20, "update verify 2 - $db_type"); $o = MyMySQLObject->new(name => 'Steve'); $o->load; is($o->num, 30, "update verify 3 - $db_type"); $o = MyMySQLObject->new(name => 'Bud'); $o->load; is($o->num, 40, "update verify 4 - $db_type"); $o = MyMySQLObject->new(name => 'Betty'); $o->load; is($o->num, 50, "update verify 5 - $db_type"); eval { $num = MyMySQLObject::Manager->update_objs( set => { ended => DateTime->new(year => 1999, month => 2, day => 3), }); }; ok($@, "update refused - $db_type"); $num = MyMySQLObject::Manager->update_objs( all => 1, set => { ended => DateTime->new(year => 1999, month => 2, day => 3), }); ok($num, "update 7 - $db_type"); ok($num == 5, "update 8 - $db_type"); is($num, 5, "update 9 - $db_type"); my $objs = MyMySQLObject::Manager->get_objs; my $test_num = 6; foreach my $obj (@$objs) { ok($obj->ended->ymd eq '1999-02-03', "update verify $test_num - $db_type"); } # End update tests # Start delete tests $num = MyMySQLObject::Manager->delete_objs( where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); ok(defined $num, "delete 1 - $db_type"); ok($num == 0, "delete 2 - $db_type"); is($num, '0', "delete 3 - $db_type"); $num = MyMySQLObject::Manager->delete_objs( where => [ name => { like => 'B%' }, started => { lt => 'now' }, ]); ok($num, "delete 4 - $db_type"); ok($num == 2, "delete 5 - $db_type"); is($num, 2, "delete 6 - $db_type"); $num = MyMySQLObject::Manager->delete_objs( where => [ name => { like => '%oh%' }, num => [ (1 .. 11) ], ]); ok($num, "delete 7 - $db_type"); ok($num == 1, "delete 8 - $db_type"); is($num, 1, "delete 9 - $db_type"); $num = MyMySQLObject::Manager->get_objs_count; is($num, 2, "count remaining 1 - $db_type"); eval { $num = MyMySQLObject::Manager->delete_objs }; ok($@, "delete refuse - $db_type"); $num = MyMySQLObject::Manager->delete_objs(all => 1); ok($num, "delete 10 - $db_type"); ok($num == 2, "delete 11 - $db_type"); is($num, 2, "delete 12 - $db_type"); $num = MyMySQLObject::Manager->get_objs_count; is($num, 0, "count remaining 2 - $db_type"); # End delete tests } # # Informix # SKIP: foreach my $db_type ('informix') { skip("Informix tests", 41) unless($HAVE_INFORMIX); Rose::DB->default_type($db_type); my $o = MyInformixObject->new(name => 'John', code => 1, started => '1/1/2000', num => 10); ok($o->save, "save() 1 - $db_type"); $o = MyInformixObject->new(name => 'Fred', code => 2, started => '1/2/1999', num => 20); ok($o->save, "save() 2 - $db_type"); $o = MyInformixObject->new(name => 'Steve', code => 3, started => '1/3/1998', num => 30); ok($o->save, "save() 3 - $db_type"); $o = MyInformixObject->new(name => 'Bud', code => 4, started => '1/4/1997', num => 40); ok($o->save, "save() 4 - $db_type"); $o = MyInformixObject->new(name => 'Betty', code => 5, started => '1/5/1996', num => 50); ok($o->save, "save() 5 - $db_type"); my $now = DateTime->now; my $yesterday = $now->clone->subtract(days => 1); # Start update tests #local $Rose::DB::Object::Manager::Debug = 1; #$DB::single = 1; my $num = MyInformixObject::Manager->update_objs( set => { num => { sql => 'num + 1' }, code => 'foo', }, where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); ok(defined $num, "update 1 - $db_type"); ok($num == 0, "update 2 - $db_type"); is($num, '0', "update 3 - $db_type"); eval { $num = MyInformixObject::Manager->update_objs( where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); }; ok($@, "update missing set 1 - $db_type"); $num = MyInformixObject::Manager->update_objs( set => { num => { sql => 'num + 1' }, }, where => [ name => { like => '%oh%' }, or => [ started => { lt => $now }, started => { lt => $yesterday }, started => { lt => '1/1/2005' }, ], ]); ok($num, "update 4 - $db_type"); ok($num == 1, "update 5 - $db_type"); is($num, 1, "update 6 - $db_type"); $o = MyInformixObject->new(name => 'John'); $o->load; is($o->num, 11, "update verify 1 - $db_type"); $o = MyInformixObject->new(name => 'Fred'); $o->load; is($o->num, 20, "update verify 2 - $db_type"); $o = MyInformixObject->new(name => 'Steve'); $o->load; is($o->num, 30, "update verify 3 - $db_type"); $o = MyInformixObject->new(name => 'Bud'); $o->load; is($o->num, 40, "update verify 4 - $db_type"); $o = MyInformixObject->new(name => 'Betty'); $o->load; is($o->num, 50, "update verify 5 - $db_type"); eval { $num = MyInformixObject::Manager->update_objs( set => { ended => DateTime->new(year => 1999, month => 2, day => 3), }); }; ok($@, "update refused - $db_type"); $num = MyInformixObject::Manager->update_objs( all => 1, set => { ended => DateTime->new(year => 1999, month => 2, day => 3), }); ok($num, "update 7 - $db_type"); ok($num == 5, "update 8 - $db_type"); is($num, 5, "update 9 - $db_type"); my $objs = MyInformixObject::Manager->get_objs; my $test_num = 6; foreach my $obj (@$objs) { ok($obj->ended->ymd eq '1999-02-03', "update verify $test_num - $db_type"); } # End update tests # Start delete tests $num = MyInformixObject::Manager->delete_objs( where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); ok(defined $num, "delete 1 - $db_type"); ok($num == 0, "delete 2 - $db_type"); is($num, '0', "delete 3 - $db_type"); $num = MyInformixObject::Manager->delete_objs( where => [ name => { like => 'B%' }, started => { lt => 'now' }, ]); ok($num, "delete 4 - $db_type"); ok($num == 2, "delete 5 - $db_type"); is($num, 2, "delete 6 - $db_type"); $num = MyInformixObject::Manager->delete_objs( where => [ name => { like => '%oh%' }, num => [ (1 .. 11) ], ]); ok($num, "delete 7 - $db_type"); ok($num == 1, "delete 8 - $db_type"); is($num, 1, "delete 9 - $db_type"); $num = MyInformixObject::Manager->get_objs_count; is($num, 2, "count remaining 1 - $db_type"); eval { $num = MyInformixObject::Manager->delete_objs }; ok($@, "delete refuse - $db_type"); $num = MyInformixObject::Manager->delete_objs(all => 1); ok($num, "delete 10 - $db_type"); ok($num == 2, "delete 11 - $db_type"); is($num, 2, "delete 12 - $db_type"); $num = MyInformixObject::Manager->get_objs_count; is($num, 0, "count remaining 2 - $db_type"); # End delete tests } # # SQLite # SKIP: foreach my $db_type ('sqlite') { skip("Informix tests", 41) unless($HAVE_SQLITE); Rose::DB->default_type($db_type); my $o = MySQLiteObject->new(name => 'John', code => 1, started => '1/1/2000', num => 10); ok($o->save, "save() 1 - $db_type"); $o = MySQLiteObject->new(name => 'Fred', code => 2, started => '1/2/1999', num => 20); ok($o->save, "save() 2 - $db_type"); $o = MySQLiteObject->new(name => 'Steve', code => 3, started => '1/3/1998', num => 30); ok($o->save, "save() 3 - $db_type"); $o = MySQLiteObject->new(name => 'Bud', code => 4, started => '1/4/1997', num => 40); ok($o->save, "save() 4 - $db_type"); $o = MySQLiteObject->new(name => 'Betty', code => 5, started => '1/5/1996', num => 50); ok($o->save, "save() 5 - $db_type"); my $now = DateTime->now; my $yesterday = $now->clone->subtract(days => 1); # Start update tests #local $Rose::DB::Object::Manager::Debug = 1; #$DB::single = 1; my $num = MySQLiteObject::Manager->update_objs( set => { num => { sql => 'num + 1' }, code => 'foo', }, where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] }, [ \q(rose_db_object_test.num % 2 == ?) => 0 ], ]); ok(defined $num, "update 1 - $db_type"); ok($num == 0, "update 2 - $db_type"); is($num, '0', "update 3 - $db_type"); eval { $num = MySQLiteObject::Manager->update_objs( where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); }; ok($@, "update missing set 1 - $db_type"); $num = MySQLiteObject::Manager->update_objs( set => { num => { sql => 'num + 1' }, }, where => [ name => { like => '%oh%' }, or => [ started => { lt => $now }, started => { lt => $yesterday }, started => { lt => '1/1/2005' }, ], [ \q(rose_db_object_test.num % 2 != ?) => 0 ], ]); ok($num, "update 4 - $db_type"); ok($num == 1, "update 5 - $db_type"); is($num, 1, "update 6 - $db_type"); $o = MySQLiteObject->new(name => 'John'); $o->load; is($o->num, 11, "update verify 1 - $db_type"); $o = MySQLiteObject->new(name => 'Fred'); $o->load; is($o->num, 20, "update verify 2 - $db_type"); $o = MySQLiteObject->new(name => 'Steve'); $o->load; is($o->num, 30, "update verify 3 - $db_type"); $o = MySQLiteObject->new(name => 'Bud'); $o->load; is($o->num, 40, "update verify 4 - $db_type"); $o = MySQLiteObject->new(name => 'Betty'); $o->load; is($o->num, 50, "update verify 5 - $db_type"); eval { $num = MySQLiteObject::Manager->update_objs( set => { ended => DateTime->new(year => 1999, month => 2, day => 3), }); }; ok($@, "update refused - $db_type"); $num = MySQLiteObject::Manager->update_objs( all => 1, set => { ended => DateTime->new(year => 1999, month => 2, day => 3), }); ok($num, "update 7 - $db_type"); ok($num == 5, "update 8 - $db_type"); is($num, 5, "update 9 - $db_type"); my $objs = MySQLiteObject::Manager->get_objs; my $test_num = 6; foreach my $obj (@$objs) { ok($obj->ended->ymd eq '1999-02-03', "update verify $test_num - $db_type"); } # End update tests # Start delete tests $num = MySQLiteObject::Manager->delete_objs( where => [ name => { like => 'NoneSuch%' }, started => { gt => [ $now, $yesterday, '1/1/2005' ] } ]); ok(defined $num, "delete 1 - $db_type"); ok($num == 0, "delete 2 - $db_type"); is($num, '0', "delete 3 - $db_type"); $num = MySQLiteObject::Manager->delete_objs( where => [ name => { like => 'B%' }, started => { lt => 'now' }, ]); ok($num, "delete 4 - $db_type"); ok($num == 2, "delete 5 - $db_type"); is($num, 2, "delete 6 - $db_type"); $num = MySQLiteObject::Manager->delete_objs( where => [ name => { like => '%oh%' }, num => [ (1 .. 11) ], ]); ok($num, "delete 7 - $db_type"); ok($num == 1, "delete 8 - $db_type"); is($num, 1, "delete 9 - $db_type"); $num = MySQLiteObject::Manager->get_objs_count; is($num, 2, "count remaining 1 - $db_type"); eval { $num = MySQLiteObject::Manager->delete_objs }; ok($@, "delete refuse - $db_type"); $num = MySQLiteObject::Manager->delete_objs(all => 1); # $sth->rows is broken in DBD::SQLite # http://rt.cpan.org/NoAuth/Bug.html?id=16187 ok(2, "delete 10 - $db_type"); ok(2 == 2, "delete 11 - $db_type"); is(2, 2, "delete 12 - $db_type"); #ok($num, "delete 10 - $db_type"); #ok($num == 2, "delete 11 - $db_type"); #is($num, 2, "delete 12 - $db_type"); $num = MySQLiteObject::Manager->get_objs_count; is($num, 0, "count remaining 2 - $db_type"); # End delete tests } 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('CREATE SCHEMA rose_db_object_private'); } $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_test ( id SERIAL NOT NULL PRIMARY KEY, name VARCHAR(32) NOT NULL, code CHAR(6), started DATE, ended DATE, num INT, data BYTEA, UNIQUE(name) ) EOF $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_private.rose_db_object_test ( id SERIAL NOT NULL PRIMARY KEY, name VARCHAR(32) NOT NULL, code CHAR(6), started DATE, ended DATE, num INT, data BYTEA, UNIQUE(name) ) EOF $dbh->disconnect; # Create test subclass package MyPgObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } MyPgObject->meta->table('rose_db_object_test'); MyPgObject->meta->columns ( id => { type => 'serial', primary_key => 1 }, name => { type => 'varchar', length => 32 }, code => { type => 'char', length => 6 }, started => { type => 'date', default => '12/24/1980' }, ended => { type => 'date', default => '1/1/2000' }, num => { type => 'int' }, data => { type => 'bytea' }, ); MyPgObject->meta->add_unique_key('name'); MyPgObject->meta->initialize; package MyPgObject::Manager; our @ISA = qw(Rose::DB::Object::Manager); sub object_class { 'MyPgObject' } MyPgObject::Manager->make_manager_methods('objs'); } # # MySQL # eval { $dbh = Rose::DB->new('mysql_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { our $HAVE_MYSQL = 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(<<"EOF"); CREATE TABLE rose_db_object_test ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32) NOT NULL, code CHAR(6), started DATE, ended DATE, num INT, UNIQUE(name) ) EOF $dbh->disconnect; # Create test subclass package MyMySQLObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('mysql') } MyMySQLObject->meta->table('rose_db_object_test'); MyMySQLObject->meta->columns ( id => { type => 'serial', primary_key => 1 }, name => { type => 'varchar', length => 32 }, code => { type => 'char', length => 6 }, started => { type => 'date', default => '12/24/1980' }, ended => { type => 'date', default => '1/1/2000' }, num => { type => 'int' }, ); MyMySQLObject->meta->add_unique_key('name'); MyMySQLObject->meta->initialize; package MyMySQLObject::Manager; our @ISA = qw(Rose::DB::Object::Manager); sub object_class { 'MyMySQLObject' } MyMySQLObject::Manager->make_manager_methods('objs'); } # # Informix # eval { $dbh = Rose::DB->new('informix_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { our $HAVE_INFORMIX = 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(<<"EOF"); CREATE TABLE rose_db_object_test ( id SERIAL NOT NULL PRIMARY KEY, name VARCHAR(32) NOT NULL, code CHAR(6), started DATE, ended DATE, num INT, UNIQUE(name) ) EOF $dbh->disconnect; # Create test subclass package MyInformixObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('informix') } MyInformixObject->meta->table('rose_db_object_test'); MyInformixObject->meta->columns ( id => { type => 'serial', primary_key => 1 }, name => { type => 'varchar', length => 32 }, code => { type => 'char', length => 6 }, started => { type => 'date', default => '12/24/1980' }, ended => { type => 'date', default => '1/1/2000' }, num => { type => 'int' }, ); MyInformixObject->meta->add_unique_key('name'); MyInformixObject->meta->initialize; package MyInformixObject::Manager; our @ISA = qw(Rose::DB::Object::Manager); sub object_class { 'MyInformixObject' } MyInformixObject::Manager->make_manager_methods('objs'); } # # SQLite # eval { $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { our $HAVE_SQLITE = 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'); } $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_test ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(32) NOT NULL, code CHAR(6), started DATE, ended DATE, num INT, UNIQUE(name) ) EOF $dbh->disconnect; # Create test subclass package MySQLiteObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('sqlite') } MySQLiteObject->meta->table('rose_db_object_test'); MySQLiteObject->meta->columns ( id => { type => 'serial', primary_key => 1 }, name => { type => 'varchar', length => 32 }, code => { type => 'char', length => 6 }, started => { type => 'date', default => '12/24/1980' }, ended => { type => 'date', default => '1/1/2000' }, num => { type => 'int' }, ); MySQLiteObject->meta->add_unique_key('name'); MySQLiteObject->meta->initialize; package MySQLiteObject::Manager; our @ISA = qw(Rose::DB::Object::Manager); sub object_class { 'MySQLiteObject' } MySQLiteObject::Manager->make_manager_methods('objs'); } } 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 SCHEMA rose_db_object_private CASCADE'); $dbh->disconnect; } if($HAVE_MYSQL) { # MySQL my $dbh = Rose::DB->new('mysql_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE rose_db_object_test CASCADE'); $dbh->disconnect; } if($HAVE_INFORMIX) { # Informix my $dbh = Rose::DB->new('informix_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE rose_db_object_test CASCADE'); $dbh->disconnect; } if($HAVE_SQLITE) { # SQLite my $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE rose_db_object_test'); $dbh->disconnect; } }