package myDB; use strict; use warnings; our $dsn="DBI:mysql:database=testdb;host=localhost;port=3306"; sub new { my $class=shift; my $self=bless({},$class); $self->_try(sub{ $self->{DBH}=DBI->connect_cached( $dsn, "root", "", {RaiseError => 1, PrintError => 0} ); }); return $self; } sub fetch_all { my $self=shift; my $sth; my $ok=0; my @data; $ok=$self->_try(sub{ $sth=$self->{DBH}->prepare_cached("SELECT * FROM testtable"); }); return () unless($ok); $ok=$self->_try(sub{ $sth->execute(); }); return () unless($ok); $ok=$self->_try(sub{ while(my @row=$sth->fetchrow()) { push(@data,\@row); } }); @data=() unless($ok); $self->_try(sub{ $sth->finish() }); return @data; } sub error { return shift->{ERROR}; } sub DESTROY { my $self=shift; $self->{DBI}->disconnect(); } sub _try { my $self=shift; my $ref=shift; eval{$ref->()}; if($@) { $self->{ERROR}=$@; return 0; } $self->{ERROR}=''; return 1; } 1;