37 if self.entries: self.abort() |
37 if self.entries: self.abort() |
38 self.file.close() |
38 self.file.close() |
39 try: os.unlink(self.journal) |
39 try: os.unlink(self.journal) |
40 except: pass |
40 except: pass |
41 |
41 |
42 def add(self, file, offset): |
42 def add(self, file, offset, data=None): |
43 if file in self.map: return |
43 if file in self.map: return |
44 self.entries.append((file, offset)) |
44 self.entries.append((file, offset, data)) |
45 self.map[file] = 1 |
45 self.map[file] = len(self.entries) - 1 |
46 # add enough data to the journal to do the truncate |
46 # add enough data to the journal to do the truncate |
|
47 self.file.write("%s\0%d\n" % (file, offset)) |
|
48 self.file.flush() |
|
49 |
|
50 def find(self, file): |
|
51 if file in self.map: |
|
52 return self.entries[self.map[file]] |
|
53 return None |
|
54 |
|
55 def replace(self, file, offset, data=None): |
|
56 if file not in self.map: |
|
57 raise KeyError(file) |
|
58 index = self.map[file] |
|
59 self.entries[index] = (file, offset, data) |
47 self.file.write("%s\0%d\n" % (file, offset)) |
60 self.file.write("%s\0%d\n" % (file, offset)) |
48 self.file.flush() |
61 self.file.flush() |
49 |
62 |
50 def nest(self): |
63 def nest(self): |
51 self.count += 1 |
64 self.count += 1 |
69 def abort(self): |
82 def abort(self): |
70 if not self.entries: return |
83 if not self.entries: return |
71 |
84 |
72 self.report(_("transaction abort!\n")) |
85 self.report(_("transaction abort!\n")) |
73 |
86 |
74 for f, o in self.entries: |
87 for f, o, ignore in self.entries: |
75 try: |
88 try: |
76 self.opener(f, "a").truncate(o) |
89 self.opener(f, "a").truncate(o) |
77 except: |
90 except: |
78 self.report(_("failed to truncate %s\n") % f) |
91 self.report(_("failed to truncate %s\n") % f) |
79 |
92 |
80 self.entries = [] |
93 self.entries = [] |
81 |
94 |
82 self.report(_("rollback completed\n")) |
95 self.report(_("rollback completed\n")) |
83 |
96 |
84 def rollback(opener, file): |
97 def rollback(opener, file): |
|
98 files = {} |
85 for l in open(file).readlines(): |
99 for l in open(file).readlines(): |
86 f, o = l.split('\0') |
100 f, o = l.split('\0') |
|
101 files[f] = o |
|
102 for f in files: |
|
103 o = files[f] |
87 opener(f, "a").truncate(int(o)) |
104 opener(f, "a").truncate(int(o)) |
88 os.unlink(file) |
105 os.unlink(file) |
89 |
106 |