From 3b287d8987186fc9c307616f9e4d5599129d9e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Sun, 18 Jul 1999 00:06:15 -0700 Subject: [PATCH] faster and better Rev: tutorial/Cache.pike:1.2 --- tutorial/Cache.pike | 51 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/tutorial/Cache.pike b/tutorial/Cache.pike index 06459f3ee5..5dec74c3cf 100644 --- a/tutorial/Cache.pike +++ b/tutorial/Cache.pike @@ -1,34 +1,65 @@ mapping data=([]); string file; +Stdio.File log; -int savers; - -mixed `[](string key) +mixed `[](mixed key) { return data[key]; } void save() { - Stdio.write_file(file,encode_value(data)); + if(Stdio.write_file(file+".tmp",encode_value(data))) + { + if(mv(file+".tmp",file)) + { + if(log) destruct(log); + rm(file+".log"); + } + } } -mixed `[]=(string key, mixed val) +mixed `[]=(mixed key, mixed val) { + if(data[key] == val) return val; data[key]=val; - return class delaysave - { - void create() { savers++; } - void destroy() { if(!--savers) save(); } - }(); + + if(!log) log=Stdio.File(file+".log","wct"); + + log->write( + replace(encode_value( ({key,val}) ),"\0","\0\1")+"\0\0" + ); + + return val; } void create(string f) { + werror("Cache: %s",f); file=f; catch { data=decode_value(Stdio.read_file(file)); + werror(" %d entries",sizeof(data)); }; + + catch { + if(string s=Stdio.read_file(file+".log")) + { + array t=s/"\0\0"; + t=t[..sizeof(t)-2]; + foreach(t, string tmp) + { + string key,val; + [key,val]=decode_value(replace(tmp,"\0\1","\0")); + data[key]=val; + } + werror(" + %d logged",sizeof(t)); + save(); + } + }; + + werror("\n"); + atexit(save); } -- GitLab