package DBManager; use strict; use warnings; use DBI; use Date::Manip; use Class::Singleton; our @ISA = qw(Class::Singleton); 1; sub _new_instance { my $type = shift; my $class = ref $type || $type; die "DBManager::instance must be invoked as DBManager->instance" if ! defined $class; my $dbh = DBI->connect("dbi:SQLite:databasefilename", "", ""); die "Cannot connect to database: $DBI::errstr\n" unless defined $dbh; $dbh->{AutoCommit} = 0; $dbh->{RaiseError} = 1; return bless {dbh => $dbh}, $class; } sub DESTROY { my $self = shift; $self->{dbh}->disconnect () if defined $self->{dbh}; } package DBObject; require Exporter; our @ISA = ('Exporter'); our @EXPORT = qw(new); sub new { my ($class, %params) = @_; die "DBObject::new must be invoked as DBObject->new" unless defined $class; die "A table definition (tableDef => ['name', 'column info'] is required by $class->new ()" unless 'ARRAY' eq ref $params{tableDef}; die "database handle must be from a DBManager derived object" if exists $params{db} and ! $params{db}->isa ('DBManager'); my $self = bless {%params}, $class; my %cols = map {s/^\s*//; s/\s*$//; /(\w+)\s*(.*)/; $1 => $2} split /,/, $params{tableDef}[1]; $self->{cols} = \%cols; $self->setDbh (); return $self; } sub DESTROY { my $self = shift; $self->{db} = undef; }