Fixed index opening thread-safety by including it in local transaction.
[didex.git] / didex / values.py
index ecb78dd..a4473f0 100644 (file)
@@ -31,14 +31,14 @@ class base(storedesc):
         self.idx = None
         self.lk = threading.Lock()
 
-    def index(self):
+    def index(self, tx):
         with self.lk:
             if self.idx is None:
-                self.idx = self.indextype(self.store.db(), self.name, self.typ)
+                self.idx = self.indextype(self.store.db(), self.name, self.typ, tx=tx)
             return self.idx
 
     def get(self, **kwargs):
-        return cursor(self.index().get(**kwargs), self.store)
+        return cursor(self.index(None).get(**kwargs), self.store)
 
     def get1(self, *, check=False, default=KeyError, **kwargs):
         with self.get(**kwargs) as cursor:
@@ -84,18 +84,18 @@ class simple(descbase):
 
     def register(self, id, obj, tx):
         val = self.__get__(obj, None)
-        self.index().put(val, id, tx=tx)
+        self.index(tx).put(val, id, tx=tx)
         tx.postcommit(lambda: setattr(obj, self.iattr, val))
 
     def unregister(self, id, obj, tx):
-        self.index().remove(getattr(obj, self.iattr), id, tx=tx)
+        self.index(tx).remove(getattr(obj, self.iattr), id, tx=tx)
         tx.postcommit(lambda: delattr(obj, self.iattr))
 
     def update(self, id, obj, tx):
         val = self.__get__(obj, None)
         ival = getattr(obj, self.iattr)
         if val != ival:
-            idx = self.index()
+            idx = self.index(tx)
             idx.remove(ival, id, tx=tx)
             idx.put(val, id, tx=tx)
             tx.postcommit(lambda: setattr(obj, self.iattr, val))
@@ -106,13 +106,13 @@ class multi(descbase):
 
     def register(self, id, obj, tx):
         vals = frozenset(self.__get__(obj, None))
-        idx = self.index()
+        idx = self.index(tx)
         for val in vals:
             idx.put(val, id, tx=tx)
         tx.postcommit(lambda: setattr(obj, self.iattr, vals))
 
     def unregister(self, id, obj, tx):
-        idx = self.index()
+        idx = self.index(tx)
         for val in getattr(obj, self.iattr):
             idx.remove(val, id, tx=tx)
         tx.postcommit(lambda: delattr(obj, self.iattr))
@@ -121,7 +121,7 @@ class multi(descbase):
         vals = frozenset(self.__get__(obj, None))
         ivals = getattr(obj, self.iattr)
         if vals != ivals:
-            idx = self.index()
+            idx = self.index(tx)
             for val in ivals - vals:
                 idx.remove(val, id, tx=tx)
             for val in vals - ivals:
@@ -147,18 +147,18 @@ class compound(base):
 
     def register(self, id, obj, tx):
         val = tuple(part.__get__(obj, None) for part in self.parts)
-        self.index().put(val, id, tx=tx)
+        self.index(tx).put(val, id, tx=tx)
         tx.postcommit(lambda: setattr(obj, self.iattr, val))
 
     def unregister(self, id, obj, tx):
-        self.index().remove(getattr(obj, self.iattr), id, tx=tx)
+        self.index(tx).remove(getattr(obj, self.iattr), id, tx=tx)
         tx.postcommit(lambda: delattr(obj, self.iattr))
 
     def update(self, id, obj, tx):
         val = tuple(part.__get__(obj, None) for part in self.parts)
         ival = getattr(obj, self.iattr)
         if val != ival:
-            idx = self.index()
+            idx = self.index(tx)
             idx.remove(ival, id, tx=tx)
             idx.put(val, id, tx=tx)
             tx.postcommit(lambda: setattr(obj, self.iattr, val))