ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/DB.pm
(Generate patch)

Comparing deliantra/Deliantra-Client/DC/DB.pm (file contents):
Revision 1.30 by root, Thu Dec 27 18:35:56 2007 UTC vs.
Revision 1.33 by root, Tue Mar 25 21:11:51 2008 UTC

1=head1 NAME 1=head1 NAME
2 2
3DC::DB - async. database and filesystem access for cfplus 3DC::DB - async. database and filesystem access for deliantra
4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 use DC::DB; 7 use DC::DB;
8 8
22use Config; 22use Config;
23use BDB; 23use BDB;
24 24
25use DC; 25use DC;
26 26
27our $DBDIR = "cfplus-" . BDB::VERSION . "-$Config{archname}"; 27our $ODBDIR = "cfplus-" . BDB::VERSION . "-$Config{archname}";
28our $DBDIR = "client-" . BDB::VERSION . "-$Config{archname}";
28our $DB_HOME = "$Deliantra::VARDIR/$DBDIR"; 29our $DB_HOME = "$Deliantra::VARDIR/$DBDIR";
29 30
31if (!-e $DB_HOME and -e "$Deliantra::VARDIR/$ODBDIR") {
32 rename "$Deliantra::VARDIR/$ODBDIR", $DB_HOME;
33 print STDERR "INFO: moved old database from $Deliantra::VARDIR/$ODBDIR to $DB_HOME\n";
34}
35
30if (!-e $DB_HOME and -e "$Deliantra::OLDDIR/$DBDIR") { 36if (!-e $DB_HOME and -e "$Deliantra::OLDDIR/$ODBDIR") {
31 rename "$Deliantra::OLDDIR/$DBDIR", $DB_HOME; 37 rename "$Deliantra::OLDDIR/$DBDIR", $DB_HOME;
32 print STDERR "INFO: moved old database from $Deliantra::OLDDIR/$DBDIR to $DB_HOME\n"; 38 print STDERR "INFO: moved old database from $Deliantra::OLDDIR/$ODBDIR to $DB_HOME\n";
33} 39}
34 40
35BDB::max_poll_time 0.03; 41BDB::max_poll_time 0.03;
42BDB::max_parallel 1;
36 43
37our $DB_ENV; 44our $DB_ENV;
38our $DB_STATE; 45our $DB_STATE;
39our %DB_TABLE; 46our %DB_TABLE;
40 47
41sub open_db { 48sub try_open_db {
42 mkdir $DB_HOME, 0777; 49 mkdir $DB_HOME, 0777;
43 50
44 $DB_ENV = db_env_create; 51 $DB_ENV = db_env_create;
45 52
46 $DB_ENV->set_errfile (\*STDERR); 53 $DB_ENV->set_errfile (\*STDERR);
77 } 84 }
78} 85}
79 86
80############################################################################# 87#############################################################################
81 88
82unless (eval { open_db }) { 89our $WATCHER;
83 warn "$@";#d# 90our $SYNC;
84 eval { File::Path::rmtree $DB_HOME };
85 open_db;
86}
87
88our $WATCHER = EV::io BDB::poll_fileno, EV::READ, \&BDB::poll_cb;
89
90our $SYNC = EV::timer_ns 0, 60, sub {
91 $_[0]->stop;
92 db_env_txn_checkpoint $DB_ENV, 0, 0, 0, sub { };
93};
94
95our $tilemap; 91our $tilemap;
96 92
97sub exists($$$) { 93sub exists($$$) {
98 my ($db, $key, $cb) = @_; 94 my ($db, $key, $cb) = @_;
99 95
213sub logprint($$$) { 209sub logprint($$$) {
214 DC::DB::Server::req (logprint => @_); 210 DC::DB::Server::req (logprint => @_);
215} 211}
216 212
217############################################################################# 213#############################################################################
218
219# fetch the full face table first
220unless ($tilemap) {
221 do_table facemap => sub {
222 $tilemap = $_[0];
223 delete $tilemap->{id};
224 my %maptile = reverse %$tilemap;#d#
225 if ((scalar keys %$tilemap) != (scalar keys %maptile)) {#d#
226 $tilemap = { };#d#
227 DC::error "FATAL: facemap is not a 1:1 mapping, please report this and delete your $DB_HOME directory!\n";#d#
228 }#d#
229 };
230}
231 214
232package DC::DB::Server; 215package DC::DB::Server;
233 216
234use strict; 217use strict;
235 218
415 398
416sub stop { 399sub stop {
417 close $FH; 400 close $FH;
418} 401}
419 402
403package DC::DB;
404
405sub open_db {
406 unless (eval { try_open_db }) {
407 warn "$@";#d#
408 eval { File::Path::rmtree $DB_HOME };
409 try_open_db;
410 }
411
412 # fetch the full face table first
413 unless ($tilemap) {
414 do_table facemap => sub {
415 $tilemap = $_[0];
416 delete $tilemap->{id};
417 my %maptile = reverse %$tilemap;#d#
418 if ((scalar keys %$tilemap) != (scalar keys %maptile)) {#d#
419 $tilemap = { };#d#
420 DC::error "FATAL: facemap is not a 1:1 mapping, please report this and delete your $DB_HOME directory!\n";#d#
421 }#d#
422 };
423 }
424
425 $WATCHER = EV::io BDB::poll_fileno, EV::READ, \&BDB::poll_cb;
426 $SYNC = EV::timer_ns 0, 60, sub {
427 $_[0]->stop;
428 db_env_txn_checkpoint $DB_ENV, 0, 0, 0, sub { };
429 };
430}
431
432END {
433 %DB_TABLE = ();
434 undef $DB_ENV;
435}
436
4201; 4371;
421 438
422=back 439=back
423 440
424=head1 AUTHOR 441=head1 AUTHOR

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines