Package gozerbot :: Module persist
[hide private]
[frames] | no frames]

Source Code for Module gozerbot.persist

 1  # gozerbot/persist.py 
 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   
17 -class Persist(object):
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 # load data from pickled file 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
43 - def save(self):
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 # first save to temp file and when done rename 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