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.137 by root, Sat Dec 9 21:26:45 2006 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(&;&) {
124 while ($buffer =~ s/^(.*)\n//) { 123 while ($buffer =~ s/^(.*)\n//) {
125 my $line = $1; 124 my $line = $1;
126 $line =~ s/\s+$//; 125 $line =~ s/\s+$//;
127 utf8::decode $line; 126 utf8::decode $line;
128 if ($line =~ /^\x{e877}json_msg (.*)$/s) { 127 if ($line =~ /^\x{e877}json_msg (.*)$/s) {
129 $cb->(from_json $1); 128 $cb->(JSON::XS->new->allow_nonref->decode ($1));
130 } else { 129 } else {
131 ::message ({ 130 ::message ({
132 markup => "background($pid): " . CFPlus::asxml $line, 131 markup => "background($pid): " . CFPlus::asxml $line,
133 }); 132 });
134 } 133 }
137} 136}
138 137
139sub background_msg { 138sub background_msg {
140 my ($msg) = @_; 139 my ($msg) = @_;
141 140
142 $msg = "\x{e877}json_msg " . to_json $msg; 141 $msg = "\x{e877}json_msg " . JSON::XS->new->allow_nonref->encode ($msg);
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}
147
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 => 5, cb => sub {
168 delete $DB_SYNC{$hkey};
169 $db->db_sync if $db;
170 });
171
172 $db->db_put ($key => $data)
173} 145}
174 146
175package CFPlus; 147package CFPlus;
176 148
177sub find_rcfile($) { 149sub find_rcfile($) {
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 => 1_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