[ZODB-Dev] Undo alternatives

Jim Fulton jim at zope.com
Thu Dec 24 09:37:22 EST 2009

As I mentioned in another message, undo is staying, but, as many also
mentioned in that thread, undo often doesn't work due to conflicts. I
thought I'd mention some alternatives:

- Time travel

  ZODB has a number of facilities for time travel:

  - Object history

    There's an API for looking at changes over time. For simple
    objects, recovering from a misshap can often be as simple as
    copying state from an old revision. Zope 2 has (or had) a built
    in view for this.

  - Time traveling database connections

    In ZODB 3.9, the database open method grew a optional 'at' and
    'before' keyword arguments to open a connection with a view of the
    database as of a particular point in time.

  - zc.beforestorage

    This is a storage wrapper that provides a read-only unchanging
    view of a database as of a particular time.  (We use it with
    DemoStorage for staging new releases with customer data without
    having to copy customer databases.)

- Truncation

  Although there isn't an API, truncating a file-storage database as
  of a particular time is pretty easy:

  >>> import ZODB.FileStorage, ZODB.TimeStamp
  >>> tid = repr(ZODB.TimeStamp.TimeStamp(y, m, d, h, min, s))
  >>> it = ZODB.FileStorage.FileIterator(path, tid)
  >>> f = open(path, 'r+b')
  >>> f.seek(it._pos)
  >>> f.truncate()

  This is certainly easier and more precise than restoring from a

  Maybe FileStorage should get an API for this.  I'm working on a
  storage implementation based on Berkeley DB and it has a truncate
  function, mainly because truncation isn't so easy for this
  implementation and I need it for some benchmarking I'm doing.


Jim Fulton

More information about the ZODB-Dev mailing list