Class-Tables
view release on metacpan or search on metacpan
values ('Fredegar Bolger',2);
insert into employees (employee_name,department_id)
values ('Meriadoc Brandybuck',2);
insert into employees (employee_name,department_id)
values ('Lotho Sackville-Baggins',4);
insert into employees (employee_name,department_id)
values ('Ted Sandyman',4);
insert into employees (employee_name,department_id)
values ('Will Whitfoot',4);
insert into employees (employee_name,department_id)
values ('Bandobras Took',1);
insert into employees (employee_name,department_id)
values ('Folco Boffin',1);
insert into products (name,weight,price)
values ('Southfarthing Pipeweed',10,200);
insert into products (name,weight,price)
values ('Prancing Pony Ale',150,300);
insert into products (name,weight,price)
values ('Farmer Cotton Mushrooms',200,150);
insert into products (name,weight,price)
values ('Green Dragon Ale',150,350);
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (2,6,6,'2002-12-10');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (4,3,1,'2002-12-10');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (1,2,20,'2002-12-09');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (3,4,8,'2002-12-11');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (1,1,1,'2002-12-13');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (3,1,2,'2002-12-15');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (3,3,3,'2002-12-12');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (3,3,15,'2002-12-08');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (2,6,11,'2002-12-08');
insert into purchases
(purchase_product,purchase_employee_id,purchase_quantity,purchases_date)
values (3,2,8,'2002-12-14')
END_OF_SQL
####################
## initialization ##
####################
my $timer = times;
use_ok('Class::Tables');
{
package MySubclass;
our @ISA = ('Class::Tables');
our $hello = 0;
sub search {
my $x = shift;
$hello++;
$x->SUPER::search(@_);
}
}
MySubclass->dbh($dbh);
# use Data::Dumper;
# print Dumper \%Class::Tables::CLASS;
#################
## subclassing ##
#################
my @classes = qw/Employees Departments Products Purchases/;
for (@classes) {
no strict 'refs';
is_deeply(
\@{"$_\::ISA"},
['MySubclass'],
"$_ class created w/ proper \@ISA" );
}
########################
## fetch class method ##
########################
for (@classes) {
isa_ok(
$_->fetch(1),
$_,
"$_->fetch" );
}
is( Employees->fetch(234332),
undef,
"fetch returns undef on failure" );
#########################
## search class method ##
#########################
is( Employees->search(id => 1)->id,
Employees->fetch(1)->id,
"search on id is equivalent to fetch" );
my @emps = Employees->search;
ok( scalar @emps,
"search with no args" );
is( scalar Purchases->search(employee => 3),
undef,
"cascading deletes turned on" );
@p2 = Purchases->search;
is( scalar @p1 - $num,
scalar @p2,
"cascading deletes leave the rest" );
{
local $Class::Tables::CASCADE = 0;
Employees->fetch(2)->delete;
isnt(
scalar Purchases->search(employee => 2),
undef,
"cascading deletes turned off" );
}
$_->delete for Employees->search;
is( scalar Employees->search,
undef,
"delete all in a table" );
#######################
## undef/null values ##
#######################
{
my $prod = Products->fetch(4);
$prod->weight(undef);
my $ar = $dbh->selectall_arrayref("select weight from products where id=4");
ok( exists $ar->[0][0] && ! defined $ar->[0][0],
"undef becomes NULL in database" );
}
## flyweight object goes out of scope, so next line must query the database
ok( ! defined Products->fetch(4)->weight,
"NULL database values come back undef" );
is( scalar( () = Products->search( weight => undef ) ),
1,
"search method handles searching with IS NULL" );
###########################
## subclassing revisited ##
###########################
isnt(
$MySubclass::hello,
0,
"subclass overrides methods" );
## done!
$timer = times - $timer;
diag "SUMMARY: $Class::Tables::SQL_QUERIES queries, ${timer}s (using $driver)";
#############
## cleanup ##
#############
END {
if ($dbh and $dbh->{Active}) {
$dbh->do($_) for (split /\s*;\s*/, <<' END_OF_SQL');
drop table /*! if exists */ departments;
drop table /*! if exists */ employees;
drop table /*! if exists */ products;
drop table /*! if exists */ purchases
END_OF_SQL
$dbh->disconnect;
}
}
( run in 0.600 second using v1.01-cache-2.11-cpan-e1769b4cff6 )