203 # For now, we are unable to do proper backup and restore of custom vfs |
203 # For now, we are unable to do proper backup and restore of custom vfs |
204 # but for bookmarks that are handled outside this mechanism. |
204 # but for bookmarks that are handled outside this mechanism. |
205 assert vfs is None or filenames == ('bookmarks',) |
205 assert vfs is None or filenames == ('bookmarks',) |
206 self._filegenerators[genid] = (order, filenames, genfunc, vfs) |
206 self._filegenerators[genid] = (order, filenames, genfunc, vfs) |
207 |
207 |
208 @active |
208 def _generatefiles(self): |
209 def find(self, file): |
|
210 if file in self.map: |
|
211 return self.entries[self.map[file]] |
|
212 if file in self.backupmap: |
|
213 return self.backupentries[self.backupmap[file]] |
|
214 return None |
|
215 |
|
216 @active |
|
217 def replace(self, file, offset, data=None): |
|
218 ''' |
|
219 replace can only replace already committed entries |
|
220 that are not pending in the queue |
|
221 ''' |
|
222 |
|
223 if file not in self.map: |
|
224 raise KeyError(file) |
|
225 index = self.map[file] |
|
226 self.entries[index] = (file, offset, data) |
|
227 self.file.write("%s\0%d\n" % (file, offset)) |
|
228 self.file.flush() |
|
229 |
|
230 @active |
|
231 def nest(self): |
|
232 self.count += 1 |
|
233 self.usages += 1 |
|
234 return self |
|
235 |
|
236 def release(self): |
|
237 if self.count > 0: |
|
238 self.usages -= 1 |
|
239 # if the transaction scopes are left without being closed, fail |
|
240 if self.count > 0 and self.usages == 0: |
|
241 self._abort() |
|
242 |
|
243 def running(self): |
|
244 return self.count > 0 |
|
245 |
|
246 @active |
|
247 def close(self): |
|
248 '''commit the transaction''' |
|
249 # write files registered for generation |
209 # write files registered for generation |
250 for entry in sorted(self._filegenerators.values()): |
210 for entry in sorted(self._filegenerators.values()): |
251 order, filenames, genfunc, vfs = entry |
211 order, filenames, genfunc, vfs = entry |
252 if vfs is None: |
212 if vfs is None: |
253 vfs = self.opener |
213 vfs = self.opener |
263 genfunc(*files) |
223 genfunc(*files) |
264 finally: |
224 finally: |
265 for f in files: |
225 for f in files: |
266 f.close() |
226 f.close() |
267 |
227 |
|
228 @active |
|
229 def find(self, file): |
|
230 if file in self.map: |
|
231 return self.entries[self.map[file]] |
|
232 if file in self.backupmap: |
|
233 return self.backupentries[self.backupmap[file]] |
|
234 return None |
|
235 |
|
236 @active |
|
237 def replace(self, file, offset, data=None): |
|
238 ''' |
|
239 replace can only replace already committed entries |
|
240 that are not pending in the queue |
|
241 ''' |
|
242 |
|
243 if file not in self.map: |
|
244 raise KeyError(file) |
|
245 index = self.map[file] |
|
246 self.entries[index] = (file, offset, data) |
|
247 self.file.write("%s\0%d\n" % (file, offset)) |
|
248 self.file.flush() |
|
249 |
|
250 @active |
|
251 def nest(self): |
|
252 self.count += 1 |
|
253 self.usages += 1 |
|
254 return self |
|
255 |
|
256 def release(self): |
|
257 if self.count > 0: |
|
258 self.usages -= 1 |
|
259 # if the transaction scopes are left without being closed, fail |
|
260 if self.count > 0 and self.usages == 0: |
|
261 self._abort() |
|
262 |
|
263 def running(self): |
|
264 return self.count > 0 |
|
265 |
|
266 @active |
|
267 def close(self): |
|
268 '''commit the transaction''' |
|
269 self._generatefiles() |
268 if self.count == 1 and self.onclose is not None: |
270 if self.count == 1 and self.onclose is not None: |
269 self.onclose() |
271 self.onclose() |
270 |
272 |
271 self.count -= 1 |
273 self.count -= 1 |
272 if self.count != 0: |
274 if self.count != 0: |