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.141 by root, Fri Apr 6 21:53:56 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
32use Fcntl ();
33 33
34BEGIN { 34BEGIN {
35 use Crossfire::Protocol::Base (); 35 use Crossfire::Protocol::Base ();
36 *to_json = \&Crossfire::Protocol::Base::to_json; 36 *to_json = \&Crossfire::Protocol::Base::to_json;
37 *from_json = \&Crossfire::Protocol::Base::from_json; 37 *from_json = \&Crossfire::Protocol::Base::from_json;
71 $_ 71 $_
72} 72}
73 73
74sub socketpipe() { 74sub socketpipe() {
75 socketpair my $fh1, my $fh2, Socket::AF_UNIX, Socket::SOCK_STREAM, Socket::PF_UNSPEC 75 socketpair my $fh1, my $fh2, Socket::AF_UNIX, Socket::SOCK_STREAM, Socket::PF_UNSPEC
76 or die "cannot establish bidiretcional pipe: $!\n"; 76 or die "cannot establish bidirectional pipe: $!\n";
77 77
78 ($fh1, $fh2) 78 ($fh1, $fh2)
79} 79}
80 80
81sub background(&;&) { 81sub background(&;&) {
143 $msg =~ s/\n//g; 143 $msg =~ s/\n//g;
144 utf8::encode $msg; 144 utf8::encode $msg;
145 print $msg, "\n"; 145 print $msg, "\n";
146} 146}
147 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 => 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; 148package CFPlus;
176 149
177sub find_rcfile($) { 150sub find_rcfile($) {
178 my $path; 151 my $path;
179 152
254 and die $res->status_line; 227 and die $res->status_line;
255 228
256 $res 229 $res
257} 230}
258 231
259our $DB_ENV; 232sub fh_nonblocking($$) {
260our $DB_STATE;
261
262sub db_table($) {
263 my ($table) = @_; 233 my ($fh, $nb) = @_;
264 234
265 $table =~ s/([^a-zA-Z0-9_\-])/sprintf "=%x=", ord $1/ge; 235 if ($^O =~ /Win32/) {
266 236 $nb = ! ! $nb;
267 new CFPlus::Database 237 ioctl $fh, 0x8004667e, $nb; # FIONBIO
268 -Env => $DB_ENV, 238 } else {
269 -Filename => $table, 239 fcntl $fh, &Fcntl::F_SETFL, $nb ? &Fcntl::O_NONBLOCK : 0;
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 240 }
300}
301 241
302unless (eval { open_db }) {
303 File::Path::rmtree $DB_HOME;
304 open_db;
305} 242}
306 243
307package CFPlus::Layout; 244package CFPlus::Layout;
308 245
309$CFPlus::OpenGL::SHUTDOWN_HOOK{"CFPlus::Layout"} = sub { 246$CFPlus::OpenGL::SHUTDOWN_HOOK{"CFPlus::Layout"} = sub {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines