Fixed storedescs to work properly on derived types.
[didex.git] / didex / store.py
index 8008ee5..55dc71e 100644 (file)
@@ -1,8 +1,8 @@
-import threading, pickle
+import threading, pickle, inspect
 from . import db, index, cache
 from .db import txnfun
 
-__all__ = ["environment", "store", "autostore"]
+__all__ = ["environment", "datastore", "autostore"]
 
 class environment(object):
     def __init__(self, *, path=None, getpath=None, recover=False):
@@ -35,16 +35,17 @@ class storedesc(object):
 
 def storedescs(obj):
     t = type(obj)
-    ret = getattr(t, "__didex_attr", None)
+    ret = t.__dict__.get("__didex_attr")
     if ret is None:
         ret = []
-        for nm, val in t.__dict__.items():
-            if isinstance(val, storedesc):
-                ret.append((nm, val))
-        t.__didex_attr = ret
+        for st in inspect.getmro(t):
+            for nm, val in st.__dict__.items():
+                if isinstance(val, storedesc):
+                    ret.append((nm, val))
+        t.__dict__["__didex_attr"] = ret
     return ret
 
-class store(object):
+class datastore(object):
     def __init__(self, name, *, env=None, path=".", ncache=None):
         self.name = name
         self.lk = threading.Lock()
@@ -107,6 +108,7 @@ class autotype(type):
     def __call__(self, *args, **kwargs):
         new = super().__call__(*args, **kwargs)
         new.id = self.store.register(new)
+        self.store.update(new.id, vfy=new) # This doesn't feel too nice.
         return new
 
 class autostore(object, metaclass=autotype):