~ubuntu-branches/ubuntu/precise/gozerbot/precise

« back to all changes in this revision

Viewing changes to build/lib/gozerbot/persist.py

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Malcolm
  • Date: 2008-06-02 19:26:39 UTC
  • mfrom: (1.1.3 upstream) (3.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080602192639-3rn65nx4q1sgd6sy
Tags: 0.8.1-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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()