Index: third_party/twisted_8_1/twisted/persisted/journal/base.py |
diff --git a/third_party/twisted_8_1/twisted/persisted/journal/base.py b/third_party/twisted_8_1/twisted/persisted/journal/base.py |
deleted file mode 100644 |
index 196a47cec2cdf10e0ae61186540cb4107f581666..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/persisted/journal/base.py |
+++ /dev/null |
@@ -1,226 +0,0 @@ |
-# -*- test-case-name: twisted.test.test_journal -*- |
-# |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-# |
- |
- |
-"""Basic classes and interfaces for journal.""" |
- |
-from __future__ import nested_scopes |
- |
-# system imports |
-import os, time |
- |
-try: |
- import cPickle as pickle |
-except ImportError: |
- import pickle |
- |
-# twisted imports |
-from zope.interface import implements, Interface |
- |
- |
-class Journal: |
- """All commands to the system get routed through here. |
- |
- Subclasses should implement the actual snapshotting capability. |
- """ |
- |
- def __init__(self, log, journaledService): |
- self.log = log |
- self.journaledService = journaledService |
- self.latestIndex = self.log.getCurrentIndex() |
- |
- def updateFromLog(self): |
- """Run all commands from log that haven't been run yet. |
- |
- This method should be run on startup to ensure the snapshot |
- is up-to-date. |
- """ |
- snapshotIndex = self.getLastSnapshot() |
- if snapshotIndex < self.latestIndex: |
- for cmdtime, command in self.log.getCommandsSince(snapshotIndex + 1): |
- command.execute(self.journaledService, cmdtime) |
- |
- def executeCommand(self, command): |
- """Log and execute a command.""" |
- runTime = time.time() |
- d = self.log.logCommand(command, runTime) |
- d.addCallback(self._reallyExecute, command, runTime) |
- return d |
- |
- def _reallyExecute(self, index, command, runTime): |
- """Callback called when logging command is done.""" |
- result = command.execute(self.journaledService, runTime) |
- self.latestIndex = index |
- return result |
- |
- def getLastSnapshot(self): |
- """Return command index of the last snapshot taken.""" |
- raise NotImplementedError |
- |
- def sync(self, *args, **kwargs): |
- """Save journal to disk, returns Deferred of finish status. |
- |
- Subclasses may choose whatever signature is appropriate, or may |
- not implement this at all. |
- """ |
- raise NotImplementedError |
- |
- |
- |
-class MemoryJournal(Journal): |
- """Prevayler-like journal that dumps from memory to disk.""" |
- |
- def __init__(self, log, journaledService, path, loadedCallback): |
- self.path = path |
- if os.path.exists(path): |
- try: |
- self.lastSync, obj = pickle.load(open(path, "rb")) |
- except (IOError, OSError, pickle.UnpicklingError): |
- self.lastSync, obj = 0, None |
- loadedCallback(obj) |
- else: |
- self.lastSync = 0 |
- loadedCallback(None) |
- Journal.__init__(self, log, journaledService) |
- |
- def getLastSnapshot(self): |
- return self.lastSync |
- |
- def sync(self, obj): |
- # make this more reliable at some point |
- f = open(self.path, "wb") |
- pickle.dump((self.latestIndex, obj), f, 1) |
- f.close() |
- self.lastSync = self.latestIndex |
- |
- |
-class ICommand(Interface): |
- """A serializable command which interacts with a journaled service.""" |
- |
- def execute(journaledService, runTime): |
- """Run the command and return result.""" |
- |
- |
-class ICommandLog(Interface): |
- """Interface for command log.""" |
- |
- def logCommand(command, runTime): |
- """Add a command and its run time to the log. |
- |
- @return: Deferred of command index. |
- """ |
- |
- def getCurrentIndex(): |
- """Return index of last command that was logged.""" |
- |
- def getCommandsSince(index): |
- """Return commands who's index >= the given one. |
- |
- @return: list of (time, command) tuples, sorted with ascending times. |
- """ |
- |
- |
-class LoadingService: |
- """Base class for journalled service used with Wrappables.""" |
- |
- def loadObject(self, objType, objId): |
- """Return object of specified type and id.""" |
- raise NotImplementedError |
- |
- |
-class Wrappable: |
- """Base class for objects used with LoadingService.""" |
- |
- objectType = None # override in base class |
- |
- def getUid(self): |
- """Return uid for loading with LoadingService.loadObject""" |
- raise NotImplementedError |
- |
- |
-class WrapperCommand: |
- |
- implements(ICommand) |
- |
- def __init__(self, methodName, obj, args=(), kwargs={}): |
- self.obj = obj |
- self.objId = obj.getUid() |
- self.objType = obj.objectType |
- self.methodName = methodName |
- self.args = args |
- self.kwargs = kwargs |
- |
- def execute(self, svc, commandTime): |
- if not hasattr(self, "obj"): |
- obj = svc.loadObject(self.objType, self.objId) |
- else: |
- obj = self.obj |
- return getattr(obj, self.methodName)(*self.args, **self.kwargs) |
- |
- def __getstate__(self): |
- d = self.__dict__.copy() |
- del d["obj"] |
- return d |
- |
- |
-def command(methodName, cmdClass=WrapperCommand): |
- """Wrap a method so it gets turned into command automatically. |
- |
- For use with Wrappables. |
- |
- Usage:: |
- |
- | class Foo(Wrappable): |
- | objectType = "foo" |
- | def getUid(self): |
- | return self.id |
- | def _bar(self, x): |
- | return x + 1 |
- | |
- | bar = command('_bar') |
- |
- The resulting callable will have signature identical to wrapped |
- function, except that it expects journal as first argument, and |
- returns a Deferred. |
- """ |
- def wrapper(obj, journal, *args, **kwargs): |
- return journal.executeCommand(cmdClass(methodName, obj, args, kwargs)) |
- return wrapper |
- |
- |
-class ServiceWrapperCommand: |
- |
- implements(ICommand) |
- |
- def __init__(self, methodName, args=(), kwargs={}): |
- self.methodName = methodName |
- self.args = args |
- self.kwargs = kwargs |
- |
- def execute(self, svc, commandTime): |
- return getattr(svc, self.methodName)(*self.args, **self.kwargs) |
- |
- def __repr__(self): |
- return "<ServiceWrapperCommand: %s, %s, %s>" % (self.methodName, self.args, self.kwargs) |
- |
- def __cmp__(self, other): |
- if hasattr(other, "__dict__"): |
- return cmp(self.__dict__, other.__dict__) |
- else: |
- return 0 |
- |
- |
-def serviceCommand(methodName, cmdClass=ServiceWrapperCommand): |
- """Wrap methods into commands for a journalled service. |
- |
- The resulting callable will have signature identical to wrapped |
- function, except that it expects journal as first argument, and |
- returns a Deferred. |
- """ |
- def wrapper(obj, journal, *args, **kwargs): |
- return journal.executeCommand(cmdClass(methodName, args, kwargs)) |
- return wrapper |