… | |
… | |
17 | use strict; |
17 | use strict; |
18 | use utf8; |
18 | use utf8; |
19 | |
19 | |
20 | use Carp (); |
20 | use Carp (); |
21 | use AnyEvent (); |
21 | use AnyEvent (); |
22 | use Storable (); # finally |
22 | use Storable (); |
|
|
23 | |
|
|
24 | use CFPlus; |
23 | |
25 | |
24 | sub sync { |
26 | sub sync { |
25 | # for debugging |
27 | # for debugging |
26 | #CFPlus::DB::Server::req (sync => sub { }); |
28 | #CFPlus::DB::Server::req (sync => sub { }); |
27 | CFPlus::DB::Server::sync (); |
29 | CFPlus::DB::Server::sync (); |
… | |
… | |
58 | |
60 | |
59 | use strict; |
61 | use strict; |
60 | |
62 | |
61 | use Fcntl; |
63 | use Fcntl; |
62 | use BerkeleyDB; |
64 | use BerkeleyDB; |
|
|
65 | use Config; |
63 | |
66 | |
64 | our $DB_HOME = "$Crossfire::VARDIR/cfplus"; |
67 | our $DB_HOME = "$Crossfire::VARDIR/cfplus-$BerkeleyDB::db_version-$Config{archname}"; |
65 | our $DB_ENV; |
68 | our $DB_ENV; |
66 | our $DB_STATE; |
69 | our $DB_STATE; |
67 | our %DB_TABLE; |
70 | our %DB_TABLE; |
68 | |
71 | |
69 | sub open_db { |
72 | sub open_db { |
… | |
… | |
100 | -Flags => DB_CREATE | DB_UPGRADE, |
103 | -Flags => DB_CREATE | DB_UPGRADE, |
101 | or die "unable to create/open database table $_[0]: $BerkeleyDB::Error" |
104 | or die "unable to create/open database table $_[0]: $BerkeleyDB::Error" |
102 | } |
105 | } |
103 | } |
106 | } |
104 | |
107 | |
105 | our $SYNC_INTERVAL = 6; |
108 | our $SYNC_INTERVAL = 60; |
106 | |
109 | |
107 | our %CB; |
110 | our %CB; |
108 | our $FH; |
111 | our $FH; |
109 | our $ID = "aaa0"; |
112 | our $ID = "aaa0"; |
110 | our ($fh_r_watcher, $fh_w_watcher); |
113 | our ($fh_r_watcher, $fh_w_watcher); |
… | |
… | |
177 | } |
180 | } |
178 | |
181 | |
179 | sub do_get { |
182 | sub do_get { |
180 | my ($db, $key) = @_; |
183 | my ($db, $key) = @_; |
181 | |
184 | |
|
|
185 | utf8::downgrade $key; |
182 | my $data; |
186 | my $data; |
183 | (table $db)->db_get ($key, $data) == 0 |
187 | (table $db)->db_get ($key, $data) == 0 |
184 | ? $data |
188 | ? $data |
185 | : () |
189 | : () |
186 | } |
190 | } |
187 | |
191 | |
188 | sub do_put { |
192 | sub do_put { |
189 | my ($db, $key, $data) = @_; |
193 | my ($db, $key, $data) = @_; |
190 | |
194 | |
|
|
195 | utf8::downgrade $key; |
|
|
196 | utf8::downgrade $data; |
191 | (table $db)->db_put ($key => $data) |
197 | (table $db)->db_put ($key => $data) |
192 | } |
198 | } |
193 | |
199 | |
194 | sub do_table { |
200 | sub do_table { |
195 | my ($db) = @_; |
201 | my ($db) = @_; |
… | |
… | |
243 | local $SIG{__DIE__}; |
249 | local $SIG{__DIE__}; |
244 | eval { |
250 | eval { |
245 | close $FH; |
251 | close $FH; |
246 | |
252 | |
247 | unless (eval { open_db }) { |
253 | unless (eval { open_db }) { |
248 | File::Path::rmtree $DB_HOME; |
254 | eval { File::Path::rmtree $DB_HOME }; |
249 | open_db; |
255 | open_db; |
250 | } |
256 | } |
251 | |
257 | |
252 | while () { |
258 | while () { |
253 | 4 == read $fh, my $len, 4 |
259 | 4 == read $fh, my $len, 4 |
… | |
… | |
278 | |
284 | |
279 | CFPlus::_exit 0; |
285 | CFPlus::_exit 0; |
280 | } |
286 | } |
281 | |
287 | |
282 | close $fh; |
288 | close $fh; |
283 | fcntl $FH, F_SETFL, O_NONBLOCK; |
289 | CFPlus::fh_nonblocking $FH, 1; |
284 | |
290 | |
285 | $CB{die} = sub { |
291 | $CB{die} = sub { die shift }; |
286 | die shift; |
|
|
287 | }; |
|
|
288 | |
292 | |
289 | $fh_r_watcher = AnyEvent->io (fh => $FH, poll => 'r', cb => \&fh_read); |
293 | $fh_r_watcher = AnyEvent->io (fh => $FH, poll => 'r', cb => \&fh_read); |
290 | |
294 | |
291 | sync_tick; |
295 | sync_tick; |
|
|
296 | } |
|
|
297 | |
|
|
298 | sub stop { |
|
|
299 | close $FH; |
292 | } |
300 | } |
293 | |
301 | |
294 | 1; |
302 | 1; |
295 | |
303 | |
296 | =back |
304 | =back |