index eeb93dbb5380be389127bb53d72d7f1476b14dac..c8e220d8cfdbbafe927eb65854264e25580665ad 100755 (executable)
self._db = metakit.storage(self.dbnm, 1)
self.hist = self._db.view('history')
self.tables = self._db.view('tables')
+ self.indexer.rollback()
self.indexer.datadb = self._db
self.dirty = 0
+ def clearCache(self):
+ for cl in self.classes.values():
+ cl._commit()
def clear(self):
for cl in self.classes.values():
cl._clear()
# --- internal
def __open(self):
+ if not os.path.exists(self.config.DATABASE):
+ os.makedirs(self.config.DATABASE)
self.dbnm = db = os.path.join(self.config.DATABASE, 'tracker.mk4')
lockfilenm = db[:-3]+'lck'
self.lockfile = locking.acquire_lock(lockfilenm)
changes[key] = oldvalue
if hasattr(prop, 'isfilename') and prop.isfilename:
propvalues[key] = os.path.basename(value)
- if prop.indexme and value is not None:
+ if prop.indexme:
self.db.indexer.add_text((self.classname, nodeid, key),
value, 'text/plain')
vws = []
for propname, ids in propspec:
if type(ids) is _STRINGTYPE:
- ids = {ids:1}
+ ids = {int(ids):1}
+ else:
+ d = {}
+ for id in ids.keys():
+ d[int(id)] = 1
+ ids = d
prop = self.ruprops[propname]
view = self.getview()
if isinstance(prop, hyperdb.Multilink):
- view = view.flatten(getattr(view, propname))
def ff(row, nm=propname, ids=ids):
- return ids.has_key(str(row.fid))
+ sv = getattr(row, nm)
+ for sr in sv:
+ if ids.has_key(sr.fid):
+ return 1
+ return 0
else:
def ff(row, nm=propname, ids=ids):
- return ids.has_key(str(getattr(row, nm)))
+ return ids.has_key(getattr(row, nm))
ndxview = view.filter(ff)
vws.append(ndxview.unique())
ndxview = vws[0]
for v in vws[1:]:
ndxview = ndxview.union(v)
- view = view.remapwith(ndxview)
+ view = self.getview().remapwith(ndxview)
rslt = []
for row in view:
rslt.append(str(row.id))
view = self.__getview()
self.db.commit()
# ---- end of ping's spec
- def filter(self, search_matches, filterspec, sort, group):
+ def filter(self, search_matches, filterspec, sort=(None,None),
+ group=(None,None)):
# search_matches is None or a set (dict of {nodeid: {propname:[nodeid,...]}})
# filterspec is a dict {propname:value}
- # sort and group are lists of propnames
# sort and group are (dir, prop) where dir is '+', '-' or None
# and prop is a prop name or None
properties['superseder'] = hyperdb.Multilink(classname)
Class.__init__(self, db, classname, **properties)
-CURVERSION = 1
+CURVERSION = 2
class Indexer(indexer.Indexer):
disallows = {'THE':1, 'THIS':1, 'ZZZ':1, 'THAT':1, 'WITH':1}
def __init__(self, path, datadb):
- self.db = metakit.storage(os.path.join(path, 'index.mk4'), 1)
+ self.path = os.path.join(path, 'index.mk4')
+ self.db = metakit.storage(self.path, 1)
self.datadb = datadb
self.reindex = 0
v = self.db.view('version')
v[0].vers = CURVERSION
self.reindex = 1
if self.reindex:
- self.db.getas('ids[tblid:I,nodeid:I,propid:I]')
+ self.db.getas('ids[tblid:I,nodeid:I,propid:I,ignore:I]')
self.db.getas('index[word:S,hits[pos:I]]')
self.db.commit()
self.reindex = 1
raise KeyError, "unknown class %r"%classname
nodeid = int(nodeid)
propid = self._getpropid(classname, property)
- pos = self.db.view('ids').append(tblid=tblid,nodeid=nodeid,propid=propid)
+ ids = self.db.view('ids')
+ oldpos = ids.find(tblid=tblid,nodeid=nodeid,propid=propid,ignore=0)
+ if oldpos > -1:
+ ids[oldpos].ignore = 1
+ self.changed = 1
+ pos = ids.append(tblid=tblid,nodeid=nodeid,propid=propid)
- wordlist = re.findall(r'\b\w{3,25}\b', text)
+ wordlist = re.findall(r'\b\w{2,25}\b', text.upper())
words = {}
for word in wordlist:
- word = word.upper()
if not self.disallows.has_key(word):
words[word] = 1
words = words.keys()
for word in words:
ndx = index.find(word=word)
if ndx < 0:
- ndx = index.append(word=word)
- hits = index[ndx].hits
- if len(hits)==0 or hits.find(pos=pos) < 0:
- hits.append(pos=pos)
- self.changed = 1
+ index.append(word=word)
+ ndx = index.find(word=word)
+ index[ndx].hits.append(pos=pos)
+ self.changed = 1
def find(self, wordlist):
hits = None
index = self.db.view('index').ordered(1)
for word in wordlist:
+ word = word.upper()
if not 2 < len(word) < 26:
continue
ndx = index.find(word=word)
tbls = self.datadb.view('tables')
for i in range(len(ids)):
hit = ids[i]
- classname = tbls[hit.tblid].name
- nodeid = str(hit.nodeid)
- property = self._getpropname(classname, hit.propid)
- rslt[i] = (classname, nodeid, property)
+ if not hit.ignore:
+ classname = tbls[hit.tblid].name
+ nodeid = str(hit.nodeid)
+ property = self._getpropname(classname, hit.propid)
+ rslt[i] = (classname, nodeid, property)
return rslt
def save_index(self):
if self.changed:
self.db.commit()
self.changed = 0
+ def rollback(self):
+ if self.changed:
+ self.db.rollback()
+ self.db = metakit.storage(self.path, 1)
+ self.changed = 0