def __init__(self, name='Demo Storage', base=None, quota=None): BaseStorage.__init__(self, name, base) # We use a BTree because the items are sorted! self._data = OOBTree.OOBTree() self._index = {} self._vindex = {} self._base = base self._size = 0 self._quota = quota self._ltid = None self._clear_temp() if base is not None and base.versions(): raise POSException.StorageError( "Demo base storage has version data")
def store(self, oid, serial, data, version, transaction): if transaction is not self._transaction: raise POSException.StorageTransactionError(self, transaction) self._lock_acquire() try: old = self._index.get(oid, None) if old is None: # Hm, nothing here, check the base version: if self._base: try: p, tid = self._base.load(oid, '') except KeyError: pass else: old = oid, None, None, p, tid nv=None if old: oid, pre, vdata, p, tid = old if vdata: if vdata[0] != version: raise POSException.VersionLockError(oid) nv=vdata[1] else: nv=old if serial != tid: raise POSException.ConflictError( oid=oid, serials=(tid, serial), data=data) r = [oid, old, version and (version, nv) or None, data, self._tid] self._tindex.append(r) s=self._tsize s=s+72+(data and (16+len(data)) or 4) if version: s=s+32+len(version) if self._quota is not None and s > self._quota: raise POSException.StorageError( '''<b>Quota Exceeded</b><br> The maximum quota for this demonstration storage has been exceeded.<br>Have a nice day.''') finally: self._lock_release() return self._tid