Bot-Cobalt
view release on metacpan or search on metacpan
lib/Bot/Cobalt/DB.pm view on Meta::CPAN
1;
__END__
=pod
=head1 NAME
Bot::Cobalt::DB - Locking Berkeley DBs with serialization
=head1 SYNOPSIS
use Bot::Cobalt::DB;
## ... perhaps in a Cobalt_register ...
my $db_path = $core->var ."/MyDatabase.db";
my $db = Bot::Cobalt::DB->new(
file => $db_path,
);
## Open (and lock):
$db->dbopen;
## Do some work:
$db->put( SomeKey => $some_deep_structure );
for my $key ($db->dbkeys) {
my $this_hash = $db->get($key);
}
## Close and unlock:
$db->dbclose;
=head1 DESCRIPTION
B<Bot::Cobalt::DB> provides a simple object-oriented interface to basic
L<DB_File> (Berkeley DB 1.x) usage.
BerkDB is a fast and simple key/value store. This module uses JSON to
store nested Perl data structures, providing easy database-backed
storage for L<Bot::Cobalt> plugins.
=head2 Constructor
B<new()> is used to create a new Bot::Cobalt::DB object representing your
Berkeley DB:
my $db = Bot::Cobalt::DB->new(
file => $path_to_db,
## Optional arguments:
# Database file mode
perms => $octal_mode,
## Locking timeout in seconds
## Defaults to 5s:
timeout => 10,
## Normally, references are serialized transparently.
## If raw is enabled, no serialization filter is used and you're
## on your own.
raw => 0,
);
=head2 Opening and closing
Database operations should be contained within a dbopen/dbclose:
## open, put, close:
$db->dbopen || croak "dbopen failure";
$db->put($key, $data);
$db->dbclose;
## open for read-only, read, close:
$db->dbopen(ro => 1) || croak "dbopen failure";
my $data = $db->get($key);
$db->dbclose;
Methods will fail if the DB is not open.
If the DB for this object is open when the object is DESTROY'd, Bot::Cobalt::DB
will attempt to close it safely.
=head2 Locking
Proper locking is done -- that means the DB is 're-tied' after a lock is
granted and state cannot change between database open and lock time.
The attempt to gain a lock will time out after five seconds (and
L</dbopen> will return boolean false).
The lock is cleared on L</dbclose>.
If the Bot::Cobalt::DB object is destroyed, it will attempt to dbclose
for you, but it is good practice to keep track of your open/close
calls and attempt to close as quickly as possible.
=head2 Methods
=head3 dbopen
B<dbopen> opens and locks the database. If 'ro => 1' is specified,
this is a LOCK_SH shared (read) lock; otherwise it is a LOCK_EX
exclusive (write) lock.
Try to call a B<dbclose> as quickly as possible to reduce locking
contention.
dbopen() will return false (and possibly warn) if the database could
not be opened (probably due to lock timeout).
=head3 is_open
Returns a boolean value representing whether or not the DB is currently
open and locked.
=head3 dbclose
( run in 1.789 second using v1.01-cache-2.11-cpan-f56aa216473 )