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.31 by root, Thu Jan 10 23:02:19 2008 UTC vs.
Revision 1.33 by root, Tue Mar 25 21:11:51 2008 UTC

37 rename "$Deliantra::OLDDIR/$DBDIR", $DB_HOME; 37 rename "$Deliantra::OLDDIR/$DBDIR", $DB_HOME;
38 print STDERR "INFO: moved old database from $Deliantra::OLDDIR/$ODBDIR to $DB_HOME\n"; 38 print STDERR "INFO: moved old database from $Deliantra::OLDDIR/$ODBDIR to $DB_HOME\n";
39} 39}
40 40
41BDB::max_poll_time 0.03; 41BDB::max_poll_time 0.03;
42BDB::max_parallel 1;
42 43
43our $DB_ENV; 44our $DB_ENV;
44our $DB_STATE; 45our $DB_STATE;
45our %DB_TABLE; 46our %DB_TABLE;
46 47
47sub open_db { 48sub try_open_db {
48 mkdir $DB_HOME, 0777; 49 mkdir $DB_HOME, 0777;
49 50
50 $DB_ENV = db_env_create; 51 $DB_ENV = db_env_create;
51 52
52 $DB_ENV->set_errfile (\*STDERR); 53 $DB_ENV->set_errfile (\*STDERR);
83 } 84 }
84} 85}
85 86
86############################################################################# 87#############################################################################
87 88
88unless (eval { open_db }) { 89our $WATCHER;
89 warn "$@";#d# 90our $SYNC;
90 eval { File::Path::rmtree $DB_HOME };
91 open_db;
92}
93
94our $WATCHER = EV::io BDB::poll_fileno, EV::READ, \&BDB::poll_cb;
95
96our $SYNC = EV::timer_ns 0, 60, sub {
97 $_[0]->stop;
98 db_env_txn_checkpoint $DB_ENV, 0, 0, 0, sub { };
99};
100
101our $tilemap; 91our $tilemap;
102 92
103sub exists($$$) { 93sub exists($$$) {
104 my ($db, $key, $cb) = @_; 94 my ($db, $key, $cb) = @_;
105 95
219sub logprint($$$) { 209sub logprint($$$) {
220 DC::DB::Server::req (logprint => @_); 210 DC::DB::Server::req (logprint => @_);
221} 211}
222 212
223############################################################################# 213#############################################################################
224
225# fetch the full face table first
226unless ($tilemap) {
227 do_table facemap => sub {
228 $tilemap = $_[0];
229 delete $tilemap->{id};
230 my %maptile = reverse %$tilemap;#d#
231 if ((scalar keys %$tilemap) != (scalar keys %maptile)) {#d#
232 $tilemap = { };#d#
233 DC::error "FATAL: facemap is not a 1:1 mapping, please report this and delete your $DB_HOME directory!\n";#d#
234 }#d#
235 };
236}
237 214
238package DC::DB::Server; 215package DC::DB::Server;
239 216
240use strict; 217use strict;
241 218
421 398
422sub stop { 399sub stop {
423 close $FH; 400 close $FH;
424} 401}
425 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
4261; 4371;
427 438
428=back 439=back
429 440
430=head1 AUTHOR 441=head1 AUTHOR

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines