1
2
3
4
5 """ allow data to be pickled to disk .. creating the persisted object
6 restores data
7 """
8
9 __copyright__ = 'this file is in the public domain'
10
11 from gozerbot.generic import rlog
12 import pickle, thread, os, copy
13
14 saving = []
15 stopsave = 0
16
18
19 """ persist data attribute to pickle file """
20
21 - def __init__(self, filename, default=None):
22 rlog(1, 'persist', 'reading %s' % filename)
23 self.fn = filename
24 self.lock = thread.allocate_lock()
25 self.data = None
26
27 try:
28 datafile = open(filename, 'r')
29 except IOError:
30 if default != None:
31 self.data = copy.deepcopy(default)
32 return
33 try:
34 self.data = pickle.load(datafile)
35 datafile.close()
36 except:
37 if default != None:
38 self.data = copy.deepcopy(default)
39 else:
40 rlog(100, 'persist', 'ERROR: %s' % filename)
41 raise
42
44 """ save persist data """
45 if stopsave:
46 rlog(100, 'persist', 'stopping mode .. not saving %s' % self.fn)
47 return
48 try:
49 saving.append(str(self.fn))
50 self.lock.acquire()
51
52 tmp = self.fn + '.tmp'
53 try:
54 datafile = open(tmp, 'w')
55 except IOError:
56 rlog(100, 'persist', "can't save %s" % self.fn)
57 return
58 pickle.dump(self.data, datafile)
59 datafile.close()
60 os.rename(tmp, self.fn)
61 rlog(2, 'persist', '%s saved' % self.fn)
62 finally:
63 saving.remove(self.fn)
64 self.lock.release()
65