annotate roundup/backends/back_metakit.py @ 892:44eb237a8b3e

An indexer that uses Metakit for storage. Undo the dynamic re-open madness (now always RW). Various bug fixes.
author Gordon B. McMillan <gmcm@users.sourceforge.net>
date Sat, 20 Jul 2002 19:27:51 +0000
parents de3da99a7c02
children 76b783c69976
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1 from roundup import hyperdb, date, password, roundupdb
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
2 import metakit
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
3 import re, marshal, os, sys, weakref, time, calendar
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
4 from roundup import indexer
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
5
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
6 class Database(hyperdb.Database):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
7 def __init__(self, config, journaltag=None):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
8 self.config = config
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
9 self.journaltag = journaltag
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
10 self.classes = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
11 self._classes = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
12 self.dirty = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
13 self._db = self.__open()
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
14 self.indexer = Indexer(self.config.DATABASE, self._db)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
15 os.umask(0002)
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
16 def post_init(self):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
17 if self.indexer.should_reindex():
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
18 self.reindex()
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
19
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
20 def reindex(self):
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
21 print "Reindexing!!!"
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
22 for klass in self.classes.values():
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
23 for nodeid in klass.list():
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
24 klass.index(nodeid)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
25 self.indexer.save_index()
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
26
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
27
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
28 # --- defined in ping's spec
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
29 def __getattr__(self, classname):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
30 if classname == 'curuserid':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
31 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
32 self.curuserid = x = int(self.classes['user'].lookup(self.journaltag))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
33 except KeyError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
34 x = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
35 return x
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
36 return self.getclass(classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
37 def getclass(self, classname):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
38 return self.classes[classname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
39 def getclasses(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
40 return self.classes.keys()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
41 # --- end of ping's spec
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
42 # --- exposed methods
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
43 def commit(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
44 if self.dirty:
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
45 self._db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
46 for cl in self.classes.values():
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
47 cl._commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
48 self.indexer.save_index()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
49 self.dirty = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
50 def rollback(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
51 if self.dirty:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
52 for cl in self.classes.values():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
53 cl._rollback()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
54 self._db.rollback()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
55 self.dirty = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
56 def clear(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
57 for cl in self.classes.values():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
58 cl._clear()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
59 def hasnode(self, classname, nodeid):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
60 return self.getclass(clasname).hasnode(nodeid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
61 def pack(self, pack_before):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
62 pass
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
63 def addclass(self, cl):
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
64 self.classes[cl.classname] = cl
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
65 if self.tables.find(name=cl.classname) < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
66 self.tables.append(name=cl.classname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
67 def addjournal(self, tablenm, nodeid, action, params):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
68 tblid = self.tables.find(name=tablenm)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
69 if tblid == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
70 tblid = self.tables.append(name=tablenm)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
71 # tableid:I,nodeid:I,date:I,user:I,action:I,params:B
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
72 self.hist.append(tableid=tblid,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
73 nodeid=int(nodeid),
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
74 date=int(time.time()),
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
75 action=action,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
76 user = self.curuserid,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
77 params = marshal.dumps(params))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
78 def gethistory(self, tablenm, nodeid):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
79 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
80 tblid = self.tables.find(name=tablenm)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
81 if tblid == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
82 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
83 q = self.hist.select(tableid=tblid, nodeid=int(nodeid))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
84 i = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
85 userclass = self.getclass('user')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
86 for row in q:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
87 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
88 params = marshal.loads(row.params)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
89 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
90 print "history couldn't unmarshal %r" % row.params
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
91 params = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
92 usernm = userclass.get(str(row.user), 'username')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
93 dt = date.Date(time.gmtime(row.date))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
94 rslt.append((i, dt, usernm, _actionnames[row.action], params))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
95 i += 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
96 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
97
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
98 def close(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
99 for cl in self.classes.values():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
100 cl.db = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
101 self._db = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
102 self.classes = {}
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
103 self.indexer = None
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
104
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
105 # --- internal
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
106 def __open(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
107 self.dbnm = db = os.path.join(self.config.DATABASE, 'tracker.mk4')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
108 self.fastopen = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
109 if os.path.exists(db):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
110 dbtm = os.path.getmtime(db)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
111 pkgnm = self.config.__name__.split('.')[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
112 schemamod = sys.modules.get(pkgnm+'.dbinit', None)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
113 if schemamod:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
114 if os.path.exists(schemamod.__file__):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
115 schematm = os.path.getmtime(schemamod.__file__)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
116 if schematm < dbtm:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
117 # found schema mod - it's older than the db
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
118 self.fastopen = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
119 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
120 # can't find schemamod - must be frozen
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
121 self.fastopen = 1
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
122 db = metakit.storage(db, 1)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
123 hist = db.view('history')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
124 tables = db.view('tables')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
125 if not self.fastopen:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
126 if not hist.structure():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
127 hist = db.getas('history[tableid:I,nodeid:I,date:I,user:I,action:I,params:B]')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
128 if not tables.structure():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
129 tables = db.getas('tables[name:S]')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
130 self.tables = tables
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
131 self.hist = hist
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
132 return db
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
133
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
134 _STRINGTYPE = type('')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
135 _LISTTYPE = type([])
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
136 _CREATE, _SET, _RETIRE, _LINK, _UNLINK = range(5)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
137
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
138 _actionnames = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
139 _CREATE : 'create',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
140 _SET : 'set',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
141 _RETIRE : 'retire',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
142 _LINK : 'link',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
143 _UNLINK : 'unlink',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
144 }
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
145
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
146 _marker = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
147
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
148 _ALLOWSETTINGPRIVATEPROPS = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
149
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
150 class Class:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
151 privateprops = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
152 def __init__(self, db, classname, **properties):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
153 self.db = weakref.proxy(db)
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
154 self.classname = classname
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
155 self.keyname = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
156 self.ruprops = properties
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
157 self.privateprops = { 'id' : hyperdb.String(),
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
158 'activity' : hyperdb.Date(),
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
159 'creation' : hyperdb.Date(),
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
160 'creator' : hyperdb.Link('user') }
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
161 self.auditors = {'create': [], 'set': [], 'retire': []} # event -> list of callables
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
162 self.reactors = {'create': [], 'set': [], 'retire': []} # ditto
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
163 view = self.__getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
164 self.maxid = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
165 if view:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
166 self.maxid = view[-1].id + 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
167 self.uncommitted = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
168 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
169 # people reach inside!!
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
170 self.properties = self.ruprops
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
171 self.db.addclass(self)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
172 self.idcache = {}
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
173
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
174 # default is to journal changes
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
175 self.do_journal = 1
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
176
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
177 def enableJournalling(self):
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
178 '''Turn journalling on for this class
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
179 '''
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
180 self.do_journal = 1
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
181
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
182 def disableJournalling(self):
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
183 '''Turn journalling off for this class
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
184 '''
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
185 self.do_journal = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
186
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
187 # --- the roundup.Class methods
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
188 def audit(self, event, detector):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
189 l = self.auditors[event]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
190 if detector not in l:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
191 self.auditors[event].append(detector)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
192 def fireAuditors(self, action, nodeid, newvalues):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
193 for audit in self.auditors[action]:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
194 audit(self.db, self, nodeid, newvalues)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
195 def fireReactors(self, action, nodeid, oldvalues):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
196 for react in self.reactors[action]:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
197 react(self.db, self, nodeid, oldvalues)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
198 def react(self, event, detector):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
199 l = self.reactors[event]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
200 if detector not in l:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
201 self.reactors[event].append(detector)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
202 # --- the hyperdb.Class methods
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
203 def create(self, **propvalues):
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
204 self.fireAuditors('create', None, propvalues)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
205 rowdict = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
206 rowdict['id'] = newid = self.maxid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
207 self.maxid += 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
208 ndx = self.getview(1).append(rowdict)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
209 propvalues['#ISNEW'] = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
210 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
211 self.set(str(newid), **propvalues)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
212 except Exception:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
213 self.maxid -= 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
214 raise
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
215 return str(newid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
216
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
217 def get(self, nodeid, propname, default=_marker, cache=1):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
218 # default and cache aren't in the spec
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
219 # cache=0 means "original value"
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
220
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
221 view = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
222 id = int(nodeid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
223 if cache == 0:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
224 oldnode = self.uncommitted.get(id, None)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
225 if oldnode and oldnode.has_key(propname):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
226 return oldnode[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
227 ndx = self.idcache.get(id, None)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
228 if ndx is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
229 ndx = view.find(id=id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
230 if ndx < 0:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
231 raise IndexError, "%s has no node %s" % (self.classname, nodeid)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
232 self.idcache[id] = ndx
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
233 try:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
234 raw = getattr(view[ndx], propname)
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
235 except AttributeError:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
236 raise KeyError, propname
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
237 rutyp = self.ruprops.get(propname, None)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
238 if rutyp is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
239 rutyp = self.privateprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
240 converter = _converters.get(rutyp.__class__, None)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
241 if converter:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
242 raw = converter(raw)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
243 return raw
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
244
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
245 def set(self, nodeid, **propvalues):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
246 isnew = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
247 if propvalues.has_key('#ISNEW'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
248 isnew = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
249 del propvalues['#ISNEW']
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
250 if not isnew:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
251 self.fireAuditors('set', nodeid, propvalues)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
252 if not propvalues:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
253 return
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
254 if propvalues.has_key('id'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
255 raise KeyError, '"id" is reserved'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
256 if self.db.journaltag is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
257 raise DatabaseError, 'Database open read-only'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
258 view = self.getview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
259 # node must exist & not be retired
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
260 id = int(nodeid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
261 ndx = view.find(id=id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
262 if ndx < 0:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
263 raise IndexError, "%s has no node %s" % (self.classname, nodeid)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
264 row = view[ndx]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
265 if row._isdel:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
266 raise IndexError, "%s has no node %s" % (self.classname, nodeid)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
267 oldnode = self.uncommitted.setdefault(id, {})
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
268 changes = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
269
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
270 for key, value in propvalues.items():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
271 # this will raise the KeyError if the property isn't valid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
272 # ... we don't use getprops() here because we only care about
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
273 # the writeable properties.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
274 if _ALLOWSETTINGPRIVATEPROPS:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
275 prop = self.ruprops.get(key, None)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
276 if not prop:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
277 prop = self.privateprops[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
278 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
279 prop = self.ruprops[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
280 converter = _converters.get(prop.__class__, lambda v: v)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
281 # if the value's the same as the existing value, no sense in
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
282 # doing anything
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
283 oldvalue = converter(getattr(row, key))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
284 if value == oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
285 del propvalues[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
286 continue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
287
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
288 # check to make sure we're not duplicating an existing key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
289 if key == self.keyname:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
290 iv = self.getindexview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
291 ndx = iv.find(k=value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
292 if ndx == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
293 iv.append(k=value, i=row.id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
294 if not isnew:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
295 ndx = iv.find(k=oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
296 if ndx > -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
297 iv.delete(ndx)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
298 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
299 raise ValueError, 'node with key "%s" exists'%value
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
300
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
301 # do stuff based on the prop type
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
302 if isinstance(prop, hyperdb.Link):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
303 link_class = prop.classname
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
304 # if it isn't a number, it's a key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
305 if type(value) != _STRINGTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
306 raise ValueError, 'link value must be String'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
307 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
308 int(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
309 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
310 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
311 value = self.db.getclass(link_class).lookup(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
312 except (TypeError, KeyError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
313 raise IndexError, 'new property "%s": %s not a %s'%(
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
314 key, value, prop.classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
315
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
316 if not self.db.getclass(link_class).hasnode(value):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
317 raise IndexError, '%s has no node %s'%(link_class, value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
318
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
319 setattr(row, key, int(value))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
320 changes[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
321
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
322 if self.do_journal and prop.do_journal:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
323 # register the unlink with the old linked node
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
324 if oldvalue:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
325 self.db.addjournal(link_class, value, _UNLINK, (self.classname, str(row.id), key))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
326
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
327 # register the link with the newly linked node
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
328 if value:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
329 self.db.addjournal(link_class, value, _LINK, (self.classname, str(row.id), key))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
330
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
331 elif isinstance(prop, hyperdb.Multilink):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
332 if type(value) != _LISTTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
333 raise TypeError, 'new property "%s" not a list of ids'%key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
334 link_class = prop.classname
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
335 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
336 for entry in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
337 if type(entry) != _STRINGTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
338 raise ValueError, 'new property "%s" link value ' \
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
339 'must be a string'%key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
340 # if it isn't a number, it's a key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
341 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
342 int(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
343 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
344 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
345 entry = self.db.getclass(link_class).lookup(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
346 except (TypeError, KeyError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
347 raise IndexError, 'new property "%s": %s not a %s'%(
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
348 key, entry, prop.classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
349 l.append(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
350 propvalues[key] = value = l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
351
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
352 # handle removals
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
353 rmvd = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
354 for id in oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
355 if id not in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
356 rmvd.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
357 # register the unlink with the old linked node
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
358 if self.do_journal and prop.do_journal:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
359 self.db.addjournal(link_class, id, _UNLINK, (self.classname, str(row.id), key))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
360
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
361 # handle additions
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
362 adds = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
363 for id in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
364 if id not in oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
365 if not self.db.getclass(link_class).hasnode(id):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
366 raise IndexError, '%s has no node %s'%(
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
367 link_class, id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
368 adds.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
369 # register the link with the newly linked node
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
370 if self.do_journal and prop.do_journal:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
371 self.db.addjournal(link_class, id, _LINK, (self.classname, str(row.id), key))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
372
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
373 sv = getattr(row, key)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
374 i = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
375 while i < len(sv):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
376 if str(sv[i].fid) in rmvd:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
377 sv.delete(i)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
378 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
379 i += 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
380 for id in adds:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
381 sv.append(fid=int(id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
382 changes[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
383
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
384
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
385 elif isinstance(prop, hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
386 if value is not None and type(value) != _STRINGTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
387 raise TypeError, 'new property "%s" not a string'%key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
388 setattr(row, key, value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
389 changes[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
390 if hasattr(prop, 'isfilename') and prop.isfilename:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
391 propvalues[key] = os.path.basename(value)
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
392 if prop.indexme:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
393 self.db.indexer.add_text((self.classname, nodeid, key), value, 'text/plain')
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
394
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
395 elif isinstance(prop, hyperdb.Password):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
396 if not isinstance(value, password.Password):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
397 raise TypeError, 'new property "%s" not a Password'% key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
398 setattr(row, key, str(value))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
399 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
400 propvalues[key] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
401
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
402 elif value is not None and isinstance(prop, hyperdb.Date):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
403 if not isinstance(value, date.Date):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
404 raise TypeError, 'new property "%s" not a Date'% key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
405 setattr(row, key, int(calendar.timegm(value.get_tuple())))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
406 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
407 propvalues[key] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
408
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
409 elif value is not None and isinstance(prop, hyperdb.Interval):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
410 if not isinstance(value, date.Interval):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
411 raise TypeError, 'new property "%s" not an Interval'% key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
412 setattr(row, key, str(value))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
413 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
414 propvalues[key] = str(value)
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
415
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
416 elif value is not None and isinstance(prop, hyperdb.Number):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
417 setattr(row, key, int(value))
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
418 changes[key] = oldvalue
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
419 propvalues[key] = value
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
420
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
421 elif value is not None and isinstance(prop, hyperdb.Boolean):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
422 bv = value != 0
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
423 setattr(row, key, bv)
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
424 changes[key] = oldvalue
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
425 propvalues[key] = value
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
426
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
427 oldnode[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
428
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
429 # nothing to do?
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
430 if not propvalues:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
431 return
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
432 if not propvalues.has_key('activity'):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
433 row.activity = int(time.time())
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
434 if isnew:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
435 if not row.creation:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
436 row.creation = int(time.time())
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
437 if not row.creator:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
438 row.creator = self.db.curuserid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
439
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
440 self.db.dirty = 1
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
441 if self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
442 if isnew:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
443 self.db.addjournal(self.classname, nodeid, _CREATE, {})
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
444 self.fireReactors('create', nodeid, None)
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
445 else:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
446 self.db.addjournal(self.classname, nodeid, _SET, changes)
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
447 self.fireReactors('set', nodeid, oldnode)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
448
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
449 def retire(self, nodeid):
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
450 self.fireAuditors('retire', nodeid, None)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
451 view = self.getview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
452 ndx = view.find(id=int(nodeid))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
453 if ndx < 0:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
454 raise KeyError, "nodeid %s not found" % nodeid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
455 row = view[ndx]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
456 oldvalues = self.uncommitted.setdefault(row.id, {})
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
457 oldval = oldvalues['_isdel'] = row._isdel
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
458 row._isdel = 1
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
459 if self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
460 self.db.addjournal(self.classname, nodeid, _RETIRE, {})
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
461 iv = self.getindexview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
462 ndx = iv.find(k=getattr(row, self.keyname),i=row.id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
463 if ndx > -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
464 iv.delete(ndx)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
465 self.db.dirty = 1
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
466 self.fireReactors('retire', nodeid, None)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
467 def history(self, nodeid):
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
468 if not self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
469 raise ValueError, 'Journalling is disabled for this class'
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
470 return self.db.gethistory(self.classname, nodeid)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
471 def setkey(self, propname):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
472 if self.keyname:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
473 if propname == self.keyname:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
474 return
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
475 raise ValueError, "%s already indexed on %s" % (self.classname, self.keyname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
476 # first setkey for this run
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
477 self.keyname = propname
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
478 iv = self.db._db.view('_%s' % self.classname)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
479 if self.db.fastopen and iv.structure():
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
480 return
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
481 # very first setkey ever
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
482 self.db.dirty = 1
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
483 iv = self.db._db.getas('_%s[k:S,i:I]' % self.classname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
484 iv = iv.ordered(1)
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
485 # print "setkey building index"
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
486 for row in self.getview():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
487 iv.append(k=getattr(row, propname), i=row.id)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
488 self.db.commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
489 def getkey(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
490 return self.keyname
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
491 def lookup(self, keyvalue):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
492 if type(keyvalue) is not _STRINGTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
493 raise TypeError, "%r is not a string" % keyvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
494 iv = self.getindexview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
495 if iv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
496 ndx = iv.find(k=keyvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
497 if ndx > -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
498 return str(iv[ndx].i)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
499 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
500 view = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
501 ndx = view.find({self.keyname:keyvalue, '_isdel':0})
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
502 if ndx > -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
503 return str(view[ndx].id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
504 raise KeyError, keyvalue
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
505
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
506 def destroy(self, keyvalue):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
507 #TODO clean this up once Richard's said how it should work
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
508 iv = self.getindexview()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
509 if iv:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
510 ndx = iv.find(k=keyvalue)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
511 if ndx > -1:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
512 id = iv[ndx].i
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
513 iv.delete(ndx)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
514 view = self.getview()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
515 ndx = view.find(id=id)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
516 if ndx > -1:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
517 view.delete(ndx)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
518
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
519 def find(self, **propspec):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
520 """Get the ids of nodes in this class which link to the given nodes.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
521
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
522 'propspec' consists of keyword args propname={nodeid:1,}
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
523 'propname' must be the name of a property in this class, or a
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
524 KeyError is raised. That property must be a Link or
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
525 Multilink property, or a TypeError is raised.
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
526
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
527 Any node in this class whose propname property links to any of the
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
528 nodeids will be returned. Used by the full text indexing, which knows
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
529 that "foo" occurs in msg1, msg3 and file7; so we have hits on these
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
530 issues:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
531
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
532 db.issue.find(messages={'1':1,'3':1}, files={'7':1})
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
533
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
534 """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
535 propspec = propspec.items()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
536 for propname, nodeid in propspec:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
537 # check the prop is OK
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
538 prop = self.ruprops[propname]
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
539 if (not isinstance(prop, hyperdb.Link) and
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
540 not isinstance(prop, hyperdb.Multilink)):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
541 raise TypeError, "'%s' not a Link/Multilink property"%propname
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
542
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
543 vws = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
544 for propname, ids in propspec:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
545 if type(ids) is _STRINGTYPE:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
546 ids = {ids:1}
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
547 prop = self.ruprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
548 view = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
549 if isinstance(prop, hyperdb.Multilink):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
550 view = view.flatten(getattr(view, propname))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
551 def ff(row, nm=propname, ids=ids):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
552 return ids.has_key(str(row.fid))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
553 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
554 def ff(row, nm=propname, ids=ids):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
555 return ids.has_key(str(getattr(row, nm)))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
556 ndxview = view.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
557 vws.append(ndxview.unique())
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
558
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
559 # handle the empty match case
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
560 if not vws:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
561 return []
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
562
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
563 ndxview = vws[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
564 for v in vws[1:]:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
565 ndxview = ndxview.union(v)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
566 view = view.remapwith(ndxview)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
567 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
568 for row in view:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
569 rslt.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
570 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
571
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
572
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
573 def list(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
574 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
575 for row in self.getview().select(_isdel=0):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
576 l.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
577 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
578 def count(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
579 return len(self.getview())
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
580 def getprops(self, protected=1):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
581 # protected is not in ping's spec
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
582 allprops = self.ruprops.copy()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
583 if protected and self.privateprops is not None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
584 allprops.update(self.privateprops)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
585 return allprops
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
586 def addprop(self, **properties):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
587 for key in properties.keys():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
588 if self.ruprops.has_key(key):
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
589 raise ValueError, "%s is already a property of %s" % (key, self.classname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
590 self.ruprops.update(properties)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
591 self.db.fastopen = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
592 view = self.__getview()
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
593 self.db.commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
594 # ---- end of ping's spec
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
595 def filter(self, search_matches, filterspec, sort, group):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
596 # search_matches is None or a set (dict of {nodeid: {propname:[nodeid,...]}})
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
597 # filterspec is a dict {propname:value}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
598 # sort and group are lists of propnames
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
599
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
600 where = {'_isdel':0}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
601 mlcriteria = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
602 regexes = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
603 orcriteria = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
604 for propname, value in filterspec.items():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
605 prop = self.ruprops.get(propname, None)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
606 if prop is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
607 prop = self.privateprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
608 if isinstance(prop, hyperdb.Multilink):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
609 if type(value) is not _LISTTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
610 value = [value]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
611 # transform keys to ids
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
612 u = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
613 for item in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
614 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
615 item = int(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
616 except (TypeError, ValueError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
617 item = int(self.db.getclass(prop.classname).lookup(item))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
618 if item == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
619 item = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
620 u.append(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
621 mlcriteria[propname] = u
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
622 elif isinstance(prop, hyperdb.Link):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
623 if type(value) is not _LISTTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
624 value = [value]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
625 # transform keys to ids
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
626 u = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
627 for item in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
628 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
629 item = int(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
630 except (TypeError, ValueError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
631 item = int(self.db.getclass(prop.classname).lookup(item))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
632 if item == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
633 item = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
634 u.append(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
635 if len(u) == 1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
636 where[propname] = u[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
637 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
638 orcriteria[propname] = u
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
639 elif isinstance(prop, hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
640 # simple glob searching
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
641 v = re.sub(r'([\|\{\}\\\.\+\[\]\(\)])', r'\\\1', value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
642 v = v.replace('?', '.')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
643 v = v.replace('*', '.*?')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
644 regexes[propname] = re.compile(v, re.I)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
645 elif propname == 'id':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
646 where[propname] = int(value)
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
647 elif isinstance(prop, hyperdb.Boolean):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
648 if type(value) is _STRINGTYPE:
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
649 bv = value.lower() in ('yes', 'true', 'on', '1')
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
650 else:
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
651 bv = value
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
652 where[propname] = bv
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
653 elif isinstance(prop, hyperdb.Number):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
654 where[propname] = int(value)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
655 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
656 where[propname] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
657 v = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
658 #print "filter start at %s" % time.time()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
659 if where:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
660 v = v.select(where)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
661 #print "filter where at %s" % time.time()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
662
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
663 if mlcriteria:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
664 # multilink - if any of the nodeids required by the
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
665 # filterspec aren't in this node's property, then skip
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
666 # it
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
667 def ff(row, ml=mlcriteria):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
668 for propname, values in ml.items():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
669 sv = getattr(row, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
670 for id in values:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
671 if sv.find(fid=id) == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
672 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
673 return 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
674 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
675 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
676
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
677 #print "filter mlcrit at %s" % time.time()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
678
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
679 if orcriteria:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
680 def ff(row, crit=orcriteria):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
681 for propname, allowed in crit.items():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
682 val = getattr(row, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
683 if val not in allowed:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
684 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
685 return 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
686
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
687 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
688 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
689
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
690 #print "filter orcrit at %s" % time.time()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
691 if regexes:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
692 def ff(row, r=regexes):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
693 for propname, regex in r.items():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
694 val = getattr(row, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
695 if not regex.search(val):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
696 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
697 return 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
698
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
699 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
700 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
701 #print "filter regexs at %s" % time.time()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
702
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
703 if sort or group:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
704 sortspec = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
705 rev = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
706 for propname in group + sort:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
707 isreversed = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
708 if propname[0] == '-':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
709 propname = propname[1:]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
710 isreversed = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
711 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
712 prop = getattr(v, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
713 except AttributeError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
714 continue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
715 if isreversed:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
716 rev.append(prop)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
717 sortspec.append(prop)
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
718 v = v.sortrev(sortspec, rev)[:] #XXX Metakit bug
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
719 #print "filter sort at %s" % time.time()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
720
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
721 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
722 for row in v:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
723 id = str(row.id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
724 if search_matches is not None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
725 if search_matches.has_key(id):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
726 rslt.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
727 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
728 rslt.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
729 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
730
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
731 def hasnode(self, nodeid):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
732 return int(nodeid) < self.maxid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
733
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
734 def labelprop(self, default_to_id=0):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
735 ''' Return the property name for a label for the given node.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
736
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
737 This method attempts to generate a consistent label for the node.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
738 It tries the following in order:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
739 1. key property
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
740 2. "name" property
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
741 3. "title" property
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
742 4. first property from the sorted property name list
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
743 '''
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
744 k = self.getkey()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
745 if k:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
746 return k
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
747 props = self.getprops()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
748 if props.has_key('name'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
749 return 'name'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
750 elif props.has_key('title'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
751 return 'title'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
752 if default_to_id:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
753 return 'id'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
754 props = props.keys()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
755 props.sort()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
756 return props[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
757 def stringFind(self, **requirements):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
758 """Locate a particular node by matching a set of its String
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
759 properties in a caseless search.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
760
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
761 If the property is not a String property, a TypeError is raised.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
762
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
763 The return is a list of the id of all nodes that match.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
764 """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
765 for propname in requirements.keys():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
766 prop = self.properties[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
767 if isinstance(not prop, hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
768 raise TypeError, "'%s' not a String property"%propname
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
769 requirements[propname] = requirements[propname].lower()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
770 requirements['_isdel'] = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
771
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
772 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
773 for row in self.getview().select(requirements):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
774 l.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
775 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
776
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
777 def addjournal(self, nodeid, action, params):
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
778 self.db.addjournal(self.classname, nodeid, action, params)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
779
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
780 def index(self, nodeid):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
781 ''' Add (or refresh) the node to search indexes '''
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
782 # find all the String properties that have indexme
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
783 for prop, propclass in self.getprops().items():
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
784 if isinstance(propclass, hyperdb.String) and propclass.indexme:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
785 # index them under (classname, nodeid, property)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
786 self.db.indexer.add_text((self.classname, nodeid, prop),
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
787 str(self.get(nodeid, prop)))
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
788
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
789 # --- used by Database
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
790 def _commit(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
791 """ called post commit of the DB.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
792 interested subclasses may override """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
793 self.uncommitted = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
794 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
795 self.idcache = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
796 def _rollback(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
797 """ called pre rollback of the DB.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
798 interested subclasses may override """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
799 for action in self.rbactions:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
800 action()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
801 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
802 self.uncommitted = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
803 self.idcache = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
804 def _clear(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
805 view = self.getview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
806 if len(view):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
807 view[:] = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
808 self.db.dirty = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
809 iv = self.getindexview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
810 if iv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
811 iv[:] = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
812 def rollbackaction(self, action):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
813 """ call this to register a callback called on rollback
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
814 callback is removed on end of transaction """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
815 self.rbactions.append(action)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
816 # --- internal
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
817 def __getview(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
818 db = self.db._db
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
819 view = db.view(self.classname)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
820 mkprops = view.structure()
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
821 if mkprops and self.db.fastopen:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
822 return view.ordered(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
823 # is the definition the same?
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
824 for nm, rutyp in self.ruprops.items():
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
825 for mkprop in mkprops:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
826 if mkprop.name == nm:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
827 break
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
828 else:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
829 mkprop = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
830 if mkprop is None:
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
831 print "%s missing prop %s (%s)" % (self.classname, nm, rutyp.__class__.__name__)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
832 break
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
833 if _typmap[rutyp.__class__] != mkprop.type:
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
834 print "%s - prop %s (%s) has wrong mktyp (%s)" % (self.classname, nm, rutyp.__class__.__name__, mkprop.type)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
835 break
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
836 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
837 return view.ordered(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
838 # need to create or restructure the mk view
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
839 # id comes first, so MK will order it for us
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
840 self.db.dirty = 1
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
841 s = ["%s[id:I" % self.classname]
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
842 for nm, rutyp in self.ruprops.items():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
843 mktyp = _typmap[rutyp.__class__]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
844 s.append('%s:%s' % (nm, mktyp))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
845 if mktyp == 'V':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
846 s[-1] += ('[fid:I]')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
847 s.append('_isdel:I,activity:I,creation:I,creator:I]')
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
848 v = self.db._db.getas(','.join(s))
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
849 self.db.commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
850 return v.ordered(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
851 def getview(self, RW=0):
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
852 return self.db._db.view(self.classname).ordered(1)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
853 def getindexview(self, RW=0):
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
854 return self.db._db.view("_%s" % self.classname).ordered(1)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
855
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
856 def _fetchML(sv):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
857 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
858 for row in sv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
859 if row.fid:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
860 l.append(str(row.fid))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
861 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
862
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
863 def _fetchPW(s):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
864 p = password.Password()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
865 p.unpack(s)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
866 return p
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
867
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
868 def _fetchLink(n):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
869 return n and str(n) or None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
870
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
871 def _fetchDate(n):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
872 return date.Date(time.gmtime(n))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
873
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
874 _converters = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
875 hyperdb.Date : _fetchDate,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
876 hyperdb.Link : _fetchLink,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
877 hyperdb.Multilink : _fetchML,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
878 hyperdb.Interval : date.Interval,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
879 hyperdb.Password : _fetchPW,
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
880 hyperdb.Boolean : lambda n: n,
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
881 hyperdb.Number : lambda n: n,
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
882 hyperdb.String : str,
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
883 }
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
884
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
885 class FileName(hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
886 isfilename = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
887
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
888 _typmap = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
889 FileName : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
890 hyperdb.String : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
891 hyperdb.Date : 'I',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
892 hyperdb.Link : 'I',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
893 hyperdb.Multilink : 'V',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
894 hyperdb.Interval : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
895 hyperdb.Password : 'S',
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
896 hyperdb.Boolean : 'I',
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
897 hyperdb.Number : 'I',
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
898 }
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
899 class FileClass(Class):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
900 ' like Class but with a content property '
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
901 default_mime_type = 'text/plain'
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
902 def __init__(self, db, classname, **properties):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
903 properties['content'] = FileName()
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
904 if not properties.has_key('type'):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
905 properties['type'] = hyperdb.String()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
906 Class.__init__(self, db, classname, **properties)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
907 def get(self, nodeid, propname, default=_marker, cache=1):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
908 x = Class.get(self, nodeid, propname, default, cache)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
909 if propname == 'content':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
910 if x.startswith('file:'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
911 fnm = x[5:]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
912 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
913 x = open(fnm, 'rb').read()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
914 except Exception, e:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
915 x = repr(e)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
916 return x
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
917 def create(self, **propvalues):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
918 content = propvalues['content']
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
919 del propvalues['content']
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
920 newid = Class.create(self, **propvalues)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
921 if not content:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
922 return newid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
923 if content.startswith('/tracker/download.php?'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
924 self.set(newid, content='http://sourceforge.net'+content)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
925 return newid
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
926 nm = bnm = '%s%s' % (self.classname, newid)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
927 sd = str(int(int(newid) / 1000))
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
928 d = os.path.join(self.db.config.DATABASE, 'files', self.classname, sd)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
929 if not os.path.exists(d):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
930 os.makedirs(d)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
931 nm = os.path.join(d, nm)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
932 open(nm, 'wb').write(content)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
933 self.set(newid, content = 'file:'+nm)
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
934 mimetype = propvalues.get('type', self.default_mime_type)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
935 self.db.indexer.add_text((self.classname, newid, 'content'), content, mimetype)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
936 def undo(fnm=nm, action1=os.remove, indexer=self.db.indexer):
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
937 action1(fnm)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
938 self.rollbackaction(undo)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
939 return newid
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
940 def index(self, nodeid):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
941 Class.index(self, nodeid)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
942 mimetype = self.get(nodeid, 'type')
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
943 if not mimetype:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
944 mimetype = self.default_mime_type
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
945 self.db.indexer.add_text((self.classname, nodeid, 'content'),
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
946 self.get(nodeid, 'content'), mimetype)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
947
859
eb924e614934 Fixes for the metakit backend
Richard Jones <richard@users.sourceforge.net>
parents: 854
diff changeset
948 class IssueClass(Class, roundupdb.IssueClass):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
949 # Overridden methods:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
950 def __init__(self, db, classname, **properties):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
951 """The newly-created class automatically includes the "messages",
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
952 "files", "nosy", and "superseder" properties. If the 'properties'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
953 dictionary attempts to specify any of these properties or a
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
954 "creation" or "activity" property, a ValueError is raised."""
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
955 if not properties.has_key('title'):
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
956 properties['title'] = hyperdb.String(indexme='yes')
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
957 if not properties.has_key('messages'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
958 properties['messages'] = hyperdb.Multilink("msg")
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
959 if not properties.has_key('files'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
960 properties['files'] = hyperdb.Multilink("file")
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
961 if not properties.has_key('nosy'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
962 properties['nosy'] = hyperdb.Multilink("user")
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
963 if not properties.has_key('superseder'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
964 properties['superseder'] = hyperdb.Multilink(classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
965 Class.__init__(self, db, classname, **properties)
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
966
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
967 CURVERSION = 1
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
968
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
969 class Indexer(indexer.Indexer):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
970 disallows = {'THE':1, 'THIS':1, 'ZZZ':1, 'THAT':1, 'WITH':1}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
971 def __init__(self, path, datadb):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
972 self.db = metakit.storage(os.path.join(path, 'index.mk4'), 1)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
973 self.datadb = datadb
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
974 self.reindex = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
975 v = self.db.view('version')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
976 if not v.structure():
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
977 v = self.db.getas('version[vers:I]')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
978 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
979 v.append(vers=CURVERSION)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
980 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
981 elif v[0].vers != CURVERSION:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
982 v[0].vers = CURVERSION
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
983 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
984 if self.reindex:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
985 self.db.getas('ids[tblid:I,nodeid:I,propid:I]')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
986 self.db.getas('index[word:S,hits[pos:I]]')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
987 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
988 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
989 self.changed = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
990 self.propcache = {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
991 def force_reindex(self):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
992 v = self.db.view('ids')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
993 v[:] = []
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
994 v = self.db.view('index')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
995 v[:] = []
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
996 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
997 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
998 def should_reindex(self):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
999 return self.reindex
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1000 def _getprops(self, classname):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1001 props = self.propcache.get(classname, None)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1002 if props is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1003 props = self.datadb.view(classname).structure()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1004 props = [prop.name for prop in props]
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1005 self.propcache[classname] = props
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1006 return props
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1007 def _getpropid(self, classname, propname):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1008 return self._getprops(classname).index(propname)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1009 def _getpropname(self, classname, propid):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1010 return self._getprops(classname)[propid]
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1011 def add_text(self, identifier, text, mime_type='text/plain'):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1012 if mime_type != 'text/plain':
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1013 return
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1014 classname, nodeid, property = identifier
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1015 tbls = self.datadb.view('tables')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1016 tblid = tbls.find(name=classname)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1017 if tblid < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1018 raise KeyError, "unknown class %r"%classname
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1019 nodeid = int(nodeid)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1020 propid = self._getpropid(classname, property)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1021 pos = self.db.view('ids').append(tblid=tblid,nodeid=nodeid,propid=propid)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1022
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1023 wordlist = re.findall(r'\b\w{3,25}\b', text)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1024 words = {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1025 for word in wordlist:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1026 word = word.upper()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1027 if not self.disallows.has_key(word):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1028 words[word] = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1029 words = words.keys()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1030
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1031 index = self.db.view('index').ordered(1)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1032 for word in words:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1033 ndx = index.find(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1034 if ndx < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1035 ndx = index.append(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1036 hits = index[ndx].hits
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1037 if len(hits)==0 or hits.find(pos=pos) < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1038 hits.append(pos=pos)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1039 self.changed = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1040 def find(self, wordlist):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1041 hits = None
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1042 index = self.db.view('index').ordered(1)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1043 for word in wordlist:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1044 if not 2 < len(word) < 26:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1045 continue
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1046 ndx = index.find(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1047 if ndx < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1048 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1049 if hits is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1050 hits = index[ndx].hits
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1051 else:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1052 hits = hits.intersect(index[ndx].hits)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1053 if len(hits) == 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1054 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1055 if hits is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1056 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1057 rslt = {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1058 ids = self.db.view('ids').remapwith(hits)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1059 tbls = self.datadb.view('tables')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1060 for i in range(len(ids)):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1061 hit = ids[i]
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1062 classname = tbls[hit.tblid].name
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1063 nodeid = str(hit.nodeid)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1064 property = self._getpropname(classname, hit.propid)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1065 rslt[i] = (classname, nodeid, property)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1066 return rslt
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1067 def save_index(self):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1068 if self.changed:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1069 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1070 self.changed = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1071
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1072
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1073
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1074

Roundup Issue Tracker: http://roundup-tracker.org/