--- deliantra/Deliantra-Client/DC/DB.pm 2007/07/05 10:15:17 1.8 +++ deliantra/Deliantra-Client/DC/DB.pm 2007/07/12 17:56:51 1.9 @@ -1,6 +1,6 @@ =head1 NAME -CFPlus::DB - async. database access for cfplus +CFPlus::DB - async. database and filesystem access for cfplus =head1 SYNOPSIS @@ -20,15 +20,26 @@ use Carp (); use AnyEvent (); use Storable (); +use Config; use CFPlus; +our $DB_HOME = "$Crossfire::VARDIR/cfplus-$BerkeleyDB::db_version-$Config{archname}"; + +sub path_of($) { + "$DB_HOME/data-$_[0]" +} + sub sync { # for debugging #CFPlus::DB::Server::req (sync => sub { }); CFPlus::DB::Server::sync (); } +sub exists($$$) { + CFPlus::DB::Server::req (exists => @_); +} + sub get($$$) { CFPlus::DB::Server::req (get => @_); } @@ -37,6 +48,14 @@ CFPlus::DB::Server::req (put => @_); } +sub unlink($$) { + CFPlus::DB::Server::req (unlink => @_); +} + +sub write_file($$$) { + CFPlus::DB::Server::req (write_file => @_); +} + our $tilemap; sub get_tile_id_sync($) { @@ -62,9 +81,7 @@ use Fcntl; use BerkeleyDB; -use Config; -our $DB_HOME = "$Crossfire::VARDIR/cfplus-$BerkeleyDB::db_version-$Config{archname}"; our $DB_ENV; our $DB_STATE; our %DB_TABLE; @@ -179,6 +196,16 @@ () } +sub do_exists { + my ($db, $key) = @_; + + utf8::downgrade $key; + my $data; + (table $db)->db_get ($key, $data) == 0 + ? length $data + : () +} + sub do_get { my ($db, $key) = @_; @@ -237,6 +264,23 @@ die "maximum number of transaction retries reached - database problems?"; } +sub do_unlink { + unlink $_[0]; +} + +sub do_write_file { + my ($file, $data) = @_; + + utf8::downgrade $file; + utf8::downgrade $data; + open my $fh, ">:raw", CFPlus::DB::path_of $file + or return; + print $fh $data; + close $fh; + + 1 +} + sub run { ($FH, my $fh) = CFPlus::socketpipe;