data = {} set_pickle_by_oid = data.__setitem__ get_pickle_by_oid = data.__getitem__ class HTML5Storage(object): __name__ = "HTML5Storage" def __init__(self): self._oid = id("new-randomish-number") self._to_store = {} def getName(self): return self.__name__ def getSize(self): return len(`self._to_store`) def getTid(self, oid): return 0 def history(self, oid, size=None): return [] def isReadOnly(self): return False def lastTransaction(self): return '0'*8 def __len__(self): return len(self._to_store) def load(self, oid, version=''): try: return get_pickle_by_oid(oid), '0'*8 except: raise KeyError#raise ZODB.POSException.POSKeyError(oid) def loadBefore(self, oid, tid): raise NotImplementedError def loadSerial(self, oid, serial): return self.load(oid) def new_oid(self): self.oid += 1 def pack(self, t, references, gc=True): # Packing isn't supported raise NotImplementedError def registerDB(self, db): pass def sortKey(self): return self.__name__ def store(self, oid, serial, data, version, transaction): self._to_store[oid] = data return '0'*8 def tpc_abort(self, transaction): self._to_store = {} def tpc_begin(self, transaction, tid=None): self._to_store = {} def tpc_finish(self, transaction, func = lambda tid: None): for oid in self._to_store: set_pickle_by_oid(oid, self._to_store[oid]) self._to_store = {} def tpc_transaction(self): return None def tpc_vote(self, transaction): pass def dodgy_encode(string): return ("x".join(map(str,map(ord, string)))) def dump_db(): s = "ZODB|{" for key, value in data.items(): s += ' '.join([`dodgy_encode(key)`, ':', `value`.replace("\\","\\\\")]) s += "}|" return s.replace("'", "\"") def load_db(val): for key, value in val.items(): try: key = ''.join(map(chr, map(int, key.split("x")))) except: continue # irrelevant item, skip value = eval('"""%s"""'%value) data[key] = value from ZODB.DB import DB storage = HTML5Storage() db = DB(storage) conn = db.open() root = conn.root() import transaction oldcommit = transaction.commit def newcommit(): res = oldcommit() print dump_db() return res transaction.commit = newcommit