package Class::PObject::Driver::db_file; use strict; #use diagnostics; use vars ('$VERSION', '@ISA'); use Carp; use DB_File; use Class::PObject::Driver::DBM; @ISA = ('Class::PObject::Driver::DBM'); $VERSION = '2.01'; sub dbh { my ($self, $object_name, $props, $lock_type) = @_; my $filename = $self->_filename($object_name, $props); my ($DB, %dbh, $unlock); $unlock = $self->_lock($filename, $lock_type||'r') or return undef; unless ( $DB = tie %dbh, "DB_File", $filename, O_RDWR|O_CREAT, 0600 ) { $self->errstr("couldn't connect to '$filename': $!"); return undef } return ($DB, \%dbh, $unlock) } sub _filename { my ($self, $object_name, $props) = @_; my $dir = $self->_dir($props); my $filename = lc $object_name; $filename =~ s/\W+/_/g; return File::Spec->catfile($dir, $filename . '.dbm') } sub _dir { my ($self, $props) = @_; my $dir = $props->{datasource} || File::Spec->tmpdir(); unless ( -e $dir ) { require File::Path; File::Path::mkpath($dir) or die $! } return $dir } 1; __END__ # Below is stub documentation for your module. You'd better edit it! =head1 NAME Class::PObject::Driver::db_file - DB_File PObject driver =head1 SYNOPSIS use Class::PObject; pobject Article => { columns => ['id', 'title', 'author', 'content'], driver => 'db_file', datasource => './data' }; =head1 DESCRIPTION Class::PObject::Driver::db_file is a direct subclass of L. =head1 METHODS Class::PObject::Driver::db_file only provides C method =over 4 =item * C - returns a reference to a hash tied to a database. =back =head1 SEE ALSO L L =head1 COPYRIGHT AND LICENSE For author and copyright information refer to Class::PObject's L. =cut