Registed datastore environments with atexit.
[didex.git] / didex / store.py
index 43c1348..a9bf0cd 100644 (file)
@@ -1,4 +1,4 @@
-import threading, pickle
+import threading, pickle, inspect, atexit
 from . import db, index, cache
 from .db import txnfun
 
@@ -22,11 +22,13 @@ class environment(object):
                 if self.path is None:
                     self.path = self.getpath()
                 self.bk = db.environment(self.path, recover=self.recover)
+                atexit.register(self.close)
             return self.bk
 
     def close(self):
         with self.lk:
             if self.bk is not None:
+                atexit.unregister(self.close)
                 self.bk.close()
                 self.bk = None
 
@@ -35,12 +37,13 @@ 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))
+        for st in inspect.getmro(t):
+            for nm, val in st.__dict__.items():
+                if isinstance(val, storedesc):
+                    ret.append((nm, val))
         t.__didex_attr = ret
     return ret