Skip to content

Commit

Permalink
forgot to add a file again...
Browse files Browse the repository at this point in the history
  • Loading branch information
Jim Fulton committed Jul 4, 2016
1 parent eec4981 commit 0a2670a
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions src/ZODB/multicommitadapter.py
@@ -0,0 +1,65 @@
"""Adapt non-IMultiCommitStorage storages to IMultiCommitStorage
"""

import zope.interface

from .ConflictResolution import ResolvedSerial

class MultiCommitAdapter:

def __init__(self, storage):
self._storage = storage
ifaces = zope.interface.providedBy(storage)
zope.interface.alsoProvides(self, ifaces)
self._resolved = set()

def __getattr__(self, name):
v = getattr(self._storage, name)
self.__dict__[name] = v
return v

def tpc_begin(self, *args):
self._storage.tpc_begin(*args)
self._resolved = set()

def store(self, oid, *args):
if self._storage.store(oid, *args) == ResolvedSerial:
self._resolved.add(oid)

def storeBlob(self, oid, *args):
s = self._storage.storeBlob(oid, *args)
if s:
if isinstance(s, bytes):
s = ((oid, s), )

for oid, serial in s:
if s == ResolvedSerial:
self._resolved.add(oid)

def undo(self, transaction_id, transaction):
r = self._storage.undo(transaction_id, transaction)
if r:
self._resolved.update(set(r[1]))

def tpc_vote(self, *args):
s = self._storage.tpc_vote(*args)
for (oid, serial) in (s or ()):
if serial == ResolvedSerial:
self._resolved.add(oid)

return list(self._resolved)

def tpc_finish(self, transaction, f=lambda tid: None):

t = []

def func(tid):
t.append(tid)
f(tid)

self._storage.tpc_finish(transaction, func)

return t[0]

def __len__(self):
return len(self._storage)

0 comments on commit 0a2670a

Please sign in to comment.