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

Comparing deliantra/Deliantra-Client/DC.pm (file contents):
Revision 1.139 by root, Sun Apr 1 15:08:14 2007 UTC vs.
Revision 1.140 by root, Fri Apr 6 07:45:33 2007 UTC

24} 24}
25 25
26use utf8; 26use utf8;
27 27
28use AnyEvent (); 28use AnyEvent ();
29use BerkeleyDB;
30use Pod::POM (); 29use Pod::POM ();
31use File::Path (); 30use File::Path ();
32use Storable (); # finally 31use Storable (); # finally
33 32
34BEGIN { 33BEGIN {
71 $_ 70 $_
72} 71}
73 72
74sub socketpipe() { 73sub socketpipe() {
75 socketpair my $fh1, my $fh2, Socket::AF_UNIX, Socket::SOCK_STREAM, Socket::PF_UNSPEC 74 socketpair my $fh1, my $fh2, Socket::AF_UNIX, Socket::SOCK_STREAM, Socket::PF_UNSPEC
76 or die "cannot establish bidiretcional pipe: $!\n"; 75 or die "cannot establish bidirectional pipe: $!\n";
77 76
78 ($fh1, $fh2) 77 ($fh1, $fh2)
79} 78}
80 79
81sub background(&;&) { 80sub background(&;&) {
143 $msg =~ s/\n//g; 142 $msg =~ s/\n//g;
144 utf8::encode $msg; 143 utf8::encode $msg;
145 print $msg, "\n"; 144 print $msg, "\n";
146} 145}
147 146
148package CFPlus::Database;
149
150our @ISA = BerkeleyDB::Btree::;
151
152sub get($$) {
153 my $data;
154
155 $_[0]->db_get ($_[1], $data) == 0
156 ? $data
157 : ()
158}
159
160my %DB_SYNC;
161
162sub put($$$) {
163 my ($db, $key, $data) = @_;
164
165 my $hkey = $db + 0;
166 CFPlus::weaken $db;
167 $DB_SYNC{$hkey} ||= AnyEvent->timer (after => 30, cb => sub {
168 delete $DB_SYNC{$hkey};
169 $db->db_sync if $db;
170 });
171
172 $db->db_put ($key => $data)
173}
174
175package CFPlus; 147package CFPlus;
176 148
177sub find_rcfile($) { 149sub find_rcfile($) {
178 my $path; 150 my $path;
179 151
254 and die $res->status_line; 226 and die $res->status_line;
255 227
256 $res 228 $res
257} 229}
258 230
259our $DB_ENV;
260our $DB_STATE;
261
262sub db_table($) {
263 my ($table) = @_;
264
265 $table =~ s/([^a-zA-Z0-9_\-])/sprintf "=%x=", ord $1/ge;
266
267 new CFPlus::Database
268 -Env => $DB_ENV,
269 -Filename => $table,
270# -Filename => "database",
271# -Subname => $table,
272 -Property => DB_CHKSUM,
273 -Flags => DB_CREATE | DB_UPGRADE,
274 or die "unable to create/open database table $_[0]: $BerkeleyDB::Error"
275}
276
277our $DB_HOME = "$Crossfire::VARDIR/cfplus";
278
279sub open_db {
280 use strict;
281
282 mkdir $DB_HOME, 0777;
283 my $recover = $BerkeleyDB::db_version >= 4.4
284 ? eval "DB_REGISTER | DB_RECOVER"
285 : 0;
286
287 $DB_ENV = new BerkeleyDB::Env
288 -Home => $DB_HOME,
289 -Cachesize => 8_000_000,
290 -ErrFile => "$DB_HOME/errorlog.txt",
291# -ErrPrefix => "DATABASE",
292 -Verbose => 1,
293 -Flags => DB_CREATE | DB_RECOVER | DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_TXN | $recover,
294 -SetFlags => DB_AUTO_COMMIT | DB_LOG_AUTOREMOVE,
295 or die "unable to create/open database home $DB_HOME: $BerkeleyDB::Error";
296
297 $DB_STATE = db_table "state";
298
299 1
300}
301
302unless (eval { open_db }) {
303 File::Path::rmtree $DB_HOME;
304 open_db;
305}
306
307package CFPlus::Layout; 231package CFPlus::Layout;
308 232
309$CFPlus::OpenGL::SHUTDOWN_HOOK{"CFPlus::Layout"} = sub { 233$CFPlus::OpenGL::SHUTDOWN_HOOK{"CFPlus::Layout"} = sub {
310 reset_glyph_cache; 234 reset_glyph_cache;
311}; 235};

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines