if create:
fl |= bd.DB_CREATE
self.cf = self._opendb("cf", bd.DB_HASH, fl)
self.ob = self._opendb("ob", bd.DB_HASH, fl)
if create:
fl |= bd.DB_CREATE
self.cf = self._opendb("cf", bd.DB_HASH, fl)
self.ob = self._opendb("ob", bd.DB_HASH, fl)
- def _opendb(self, dnm, typ, fl, init=None):
+ @txnfun(lambda self: self.env)
+ def _opendb(self, dnm, typ, fl, init=None, *, tx):
- while True:
- try:
- ret.open(self.fnm, dnm, typ, fl, self.mode)
- except deadlock:
- continue
- return ret
+ ret.open(self.fnm, dnm, typ, fl, self.mode, txn=tx.tx)
+ return ret
def _nextseq(self, *, tx):
if self.cf.has_key(b"seq", txn=tx.tx):
seq = struct.unpack(">Q", self.cf.get(b"seq", txn=tx.tx))[0]
def _nextseq(self, *, tx):
if self.cf.has_key(b"seq", txn=tx.tx):
seq = struct.unpack(">Q", self.cf.get(b"seq", txn=tx.tx))[0]
self.cf.put(b"seq", struct.pack(">Q", seq + 1), txn=tx.tx)
return seq
self.cf.put(b"seq", struct.pack(">Q", seq + 1), txn=tx.tx)
return seq
def add(self, ob, *, tx):
seq = self._nextseq(tx=tx)
self.ob.put(struct.pack(">Q", seq), ob, txn=tx.tx, flags=bd.DB_NOOVERWRITE)
return seq
def add(self, ob, *, tx):
seq = self._nextseq(tx=tx)
self.ob.put(struct.pack(">Q", seq), ob, txn=tx.tx, flags=bd.DB_NOOVERWRITE)
return seq
def replace(self, id, ob, *, tx):
key = struct.pack(">Q", id)
if not self.ob.has_key(key, txn=tx.tx):
raise KeyError(id)
self.ob.put(key, ob, txn=tx.tx)
def replace(self, id, ob, *, tx):
key = struct.pack(">Q", id)
if not self.ob.has_key(key, txn=tx.tx):
raise KeyError(id)
self.ob.put(key, ob, txn=tx.tx)
def get(self, id, *, tx):
ret = self.ob.get(struct.pack(">Q", id), None)
if ret is None:
raise KeyError(id)
return ret
def get(self, id, *, tx):
ret = self.ob.get(struct.pack(">Q", id), None)
if ret is None:
raise KeyError(id)
return ret
def remove(self, id, *, tx):
key = struct.pack(">Q", id)
if not self.ob.has_key(key, txn=tx.tx):
def remove(self, id, *, tx):
key = struct.pack(">Q", id)
if not self.ob.has_key(key, txn=tx.tx):