… | |
… | |
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 | |
23 | |
24 | use CFPlus; |
24 | use CFPlus; |
25 | |
25 | |
26 | sub sync { |
26 | sub sync { |
27 | # for debugging |
27 | # for debugging |
… | |
… | |
61 | use strict; |
61 | use strict; |
62 | |
62 | |
63 | use Fcntl; |
63 | use Fcntl; |
64 | use BerkeleyDB; |
64 | use BerkeleyDB; |
65 | |
65 | |
66 | our $DB_HOME = "$Crossfire::VARDIR/cfplus"; |
66 | our $DB_HOME = "$Crossfire::VARDIR/cfplus-$BerkeleyDB::db_version"; |
67 | our $DB_ENV; |
67 | our $DB_ENV; |
68 | our $DB_STATE; |
68 | our $DB_STATE; |
69 | our %DB_TABLE; |
69 | our %DB_TABLE; |
70 | |
70 | |
71 | sub open_db { |
71 | sub open_db { |
… | |
… | |
179 | } |
179 | } |
180 | |
180 | |
181 | sub do_get { |
181 | sub do_get { |
182 | my ($db, $key) = @_; |
182 | my ($db, $key) = @_; |
183 | |
183 | |
|
|
184 | utf8::downgrade $key; |
184 | my $data; |
185 | my $data; |
185 | (table $db)->db_get ($key, $data) == 0 |
186 | (table $db)->db_get ($key, $data) == 0 |
186 | ? $data |
187 | ? $data |
187 | : () |
188 | : () |
188 | } |
189 | } |
189 | |
190 | |
190 | sub do_put { |
191 | sub do_put { |
191 | my ($db, $key, $data) = @_; |
192 | my ($db, $key, $data) = @_; |
192 | |
193 | |
|
|
194 | utf8::downgrade $key; |
|
|
195 | utf8::downgrade $data; |
193 | (table $db)->db_put ($key => $data) |
196 | (table $db)->db_put ($key => $data) |
194 | } |
197 | } |
195 | |
198 | |
196 | sub do_table { |
199 | sub do_table { |
197 | my ($db) = @_; |
200 | my ($db) = @_; |
… | |
… | |
245 | local $SIG{__DIE__}; |
248 | local $SIG{__DIE__}; |
246 | eval { |
249 | eval { |
247 | close $FH; |
250 | close $FH; |
248 | |
251 | |
249 | unless (eval { open_db }) { |
252 | unless (eval { open_db }) { |
250 | File::Path::rmtree $DB_HOME; |
253 | eval { File::Path::rmtree $DB_HOME }; |
251 | open_db; |
254 | open_db; |
252 | } |
255 | } |
253 | |
256 | |
254 | while () { |
257 | while () { |
255 | 4 == read $fh, my $len, 4 |
258 | 4 == read $fh, my $len, 4 |
… | |
… | |
289 | $fh_r_watcher = AnyEvent->io (fh => $FH, poll => 'r', cb => \&fh_read); |
292 | $fh_r_watcher = AnyEvent->io (fh => $FH, poll => 'r', cb => \&fh_read); |
290 | |
293 | |
291 | sync_tick; |
294 | sync_tick; |
292 | } |
295 | } |
293 | |
296 | |
|
|
297 | sub stop { |
|
|
298 | close $FH; |
|
|
299 | } |
|
|
300 | |
294 | 1; |
301 | 1; |
295 | |
302 | |
296 | =back |
303 | =back |
297 | |
304 | |
298 | =head1 AUTHOR |
305 | =head1 AUTHOR |