Fixed index opening thread-safety by including it in local transaction.
[didex.git] / didex / db.py
index 7435166..539fc85 100644 (file)
@@ -94,6 +94,15 @@ class txn(object):
     def postcommit(self, fun):
         self.pcommit.add(fun)
 
+def dloopfun(fun):
+    def wrapper(self, *args, **kwargs):
+        while True:
+            try:
+                return fun(self, *args, **kwargs)
+            except deadlock:
+                continue
+    return wrapper
+
 def txnfun(envfun):
     def fxf(fun):
         def wrapper(self, *args, tx=None, **kwargs):
@@ -116,21 +125,18 @@ class database(object):
         self.env = env
         self.mode = mode
         self.fnm = name
-        fl = bd.DB_THREAD | bd.DB_AUTO_COMMIT
+        fl = bd.DB_THREAD
         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.env)
+    def _opendb(self, dnm, typ, fl, init=None, *, tx):
         ret = bd.DB(self.env.env)
         if init: init(ret)
-        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
 
     @txnfun(lambda self: self.env.env)
     def _nextseq(self, *, tx):