equal
deleted
inserted
replaced
10 # |
10 # |
11 # This software may be used and distributed according to the terms of the |
11 # This software may be used and distributed according to the terms of the |
12 # GNU General Public License version 2 or any later version. |
12 # GNU General Public License version 2 or any later version. |
13 |
13 |
14 from i18n import _ |
14 from i18n import _ |
15 import os, errno |
15 import errno |
16 import error, util |
16 import error |
17 |
17 |
18 def active(func): |
18 def active(func): |
19 def _active(self, *args, **kwds): |
19 def _active(self, *args, **kwds): |
20 if self.count == 0: |
20 if self.count == 0: |
21 raise error.Abort(_( |
21 raise error.Abort(_( |
37 try: |
37 try: |
38 opener.unlink(f) |
38 opener.unlink(f) |
39 except (IOError, OSError), inst: |
39 except (IOError, OSError), inst: |
40 if inst.errno != errno.ENOENT: |
40 if inst.errno != errno.ENOENT: |
41 raise |
41 raise |
42 util.unlink(journal) |
42 opener.unlink(journal) |
43 |
43 |
44 class transaction(object): |
44 class transaction(object): |
45 def __init__(self, report, opener, journal, after=None, createmode=None): |
45 def __init__(self, report, opener, journal, after=None, createmode=None): |
46 self.count = 1 |
46 self.count = 1 |
47 self.usages = 1 |
47 self.usages = 1 |
51 self.entries = [] |
51 self.entries = [] |
52 self.map = {} |
52 self.map = {} |
53 self.journal = journal |
53 self.journal = journal |
54 self._queue = [] |
54 self._queue = [] |
55 |
55 |
56 self.file = util.posixfile(self.journal, "w") |
56 self.file = opener.open(self.journal, "w") |
57 if createmode is not None: |
57 if createmode is not None: |
58 os.chmod(self.journal, createmode & 0666) |
58 opener.chmod(self.journal, createmode & 0666) |
59 |
59 |
60 def __del__(self): |
60 def __del__(self): |
61 if self.journal: |
61 if self.journal: |
62 self._abort() |
62 self._abort() |
63 |
63 |
131 return |
131 return |
132 self.file.close() |
132 self.file.close() |
133 self.entries = [] |
133 self.entries = [] |
134 if self.after: |
134 if self.after: |
135 self.after() |
135 self.after() |
136 if os.path.isfile(self.journal): |
136 if self.opener.isfile(self.journal): |
137 util.unlink(self.journal) |
137 self.opener.unlink(self.journal) |
138 self.journal = None |
138 self.journal = None |
139 |
139 |
140 @active |
140 @active |
141 def abort(self): |
141 def abort(self): |
142 '''abort the transaction (generally called on error, or when the |
142 '''abort the transaction (generally called on error, or when the |
150 self.file.close() |
150 self.file.close() |
151 |
151 |
152 try: |
152 try: |
153 if not self.entries: |
153 if not self.entries: |
154 if self.journal: |
154 if self.journal: |
155 util.unlink(self.journal) |
155 self.opener.unlink(self.journal) |
156 return |
156 return |
157 |
157 |
158 self.report(_("transaction abort!\n")) |
158 self.report(_("transaction abort!\n")) |
159 |
159 |
160 try: |
160 try: |
168 |
168 |
169 |
169 |
170 def rollback(opener, file, report): |
170 def rollback(opener, file, report): |
171 entries = [] |
171 entries = [] |
172 |
172 |
173 fp = util.posixfile(file) |
173 fp = opener.open(file) |
174 lines = fp.readlines() |
174 lines = fp.readlines() |
175 fp.close() |
175 fp.close() |
176 for l in lines: |
176 for l in lines: |
177 f, o = l.split('\0') |
177 f, o = l.split('\0') |
178 entries.append((f, int(o), None)) |
178 entries.append((f, int(o), None)) |