X-Git-Url: http://dolda2000.com/gitweb/?p=didex.git;a=blobdiff_plain;f=didex%2Fvalues.py;fp=didex%2Fvalues.py;h=ddb8285206cbf26e65e5b636b09a0b39fad04342;hp=bff26e7c4eae145fc71268695eaf7bcc2861dcf5;hb=e38ebdef74ec4b11c9ab70677f1c8896ca8ab634;hpb=9ef33548b36d539eac18cc28a4fc6835ff2d6ee6 diff --git a/didex/values.py b/didex/values.py index bff26e7..ddb8285 100644 --- a/didex/values.py +++ b/didex/values.py @@ -65,8 +65,7 @@ class descbase(base): def __init__(self, store, indextype, name, datatype, default): super().__init__(store, indextype, name, datatype) self.default = default - self.mattr = "__idx_%s_new" % name - self.iattr = "__idx_%s_cur" % name + self.mattr = "__ival_%s" % name def __get__(self, obj, cls): if obj is None: return self @@ -85,20 +84,24 @@ class simple(descbase): def register(self, id, obj, tx): val = self.__get__(obj, None) self.index(tx).put(val, id, tx=tx) - tx.postcommit(lambda: setattr(obj, self.iattr, val)) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val)) def unregister(self, id, obj, tx): - self.index(tx).remove(getattr(obj, self.iattr), id, tx=tx) - tx.postcommit(lambda: delattr(obj, self.iattr)) + self.index(tx).remove(self.store.icache[obj, self], id, tx=tx) + tx.postcommit(lambda: self.store.icache.__delitem__((obj, self))) def update(self, id, obj, tx): val = self.__get__(obj, None) - ival = getattr(obj, self.iattr) + ival = self.store.icache[obj, self] if val != ival: idx = self.index(tx) idx.remove(ival, id, tx=tx) idx.put(val, id, tx=tx) - tx.postcommit(lambda: setattr(obj, self.iattr, val)) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val)) + + def loaded(self, id, obj, tx): + val = self.__get__(obj, None) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val)) class multi(descbase): def __init__(self, store, indextype, name, datatype): @@ -109,30 +112,33 @@ class multi(descbase): idx = self.index(tx) for val in vals: idx.put(val, id, tx=tx) - tx.postcommit(lambda: setattr(obj, self.iattr, vals)) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), vals)) def unregister(self, id, obj, tx): idx = self.index(tx) - for val in getattr(obj, self.iattr): + for val in self.store.icache[obj, self]: idx.remove(val, id, tx=tx) - tx.postcommit(lambda: delattr(obj, self.iattr)) + tx.postcommit(lambda: self.store.icache.__delitem__((obj, self))) def update(self, id, obj, tx): vals = frozenset(self.__get__(obj, None)) - ivals = getattr(obj, self.iattr) + ivals = self.store.icache[obj, self] if vals != ivals: idx = self.index(tx) for val in ivals - vals: idx.remove(val, id, tx=tx) for val in vals - ivals: idx.put(val, id, tx=tx) - tx.postcommit(lambda: setattr(obj, self.iattr, vals)) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val)) + + def loaded(self, id, obj, tx): + vals = frozenset(self.__get__(obj, None)) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val)) class compound(base): def __init__(self, indextype, name, *parts): super().__init__(parts[0].store, indextype, name, index.compound(*(part.typ for part in parts))) self.parts = parts - self.iattr = "__idx_%s_cur" % name def minim(self, *parts): return self.typ.minim(*parts) @@ -148,20 +154,24 @@ class compound(base): def register(self, id, obj, tx): val = tuple(part.__get__(obj, None) for part in self.parts) self.index(tx).put(val, id, tx=tx) - tx.postcommit(lambda: setattr(obj, self.iattr, val)) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val)) def unregister(self, id, obj, tx): - self.index(tx).remove(getattr(obj, self.iattr), id, tx=tx) - tx.postcommit(lambda: delattr(obj, self.iattr)) + self.index(tx).remove(self.store.icache[obj, self], id, tx=tx) + tx.postcommit(lambda: self.store.icache.__delitem__((obj, self))) def update(self, id, obj, tx): val = tuple(part.__get__(obj, None) for part in self.parts) - ival = getattr(obj, self.iattr) + ival = self.store.icache[obj, self] if val != ival: idx = self.index(tx) idx.remove(ival, id, tx=tx) idx.put(val, id, tx=tx) - tx.postcommit(lambda: setattr(obj, self.iattr, val)) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val)) + + def loaded(self, id, obj, tx): + val = tuple(part.__get__(obj, None) for part in self.parts) + tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val)) class idlink(object): def __init__(self, name, atype):