annotate roundup/backends/back_metakit.py @ 1780:d2801a2b0a77

Initial implementation (half-baked) at new Tracker instance. Cleaned up caching API / comments in backends. Fixes to docs.
author Richard Jones <richard@users.sourceforge.net>
date Thu, 04 Sep 2003 00:47:01 +0000
parents ab7760caf6ff
children a3b1b1dcf639
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1751
diff changeset
1 # $Id: back_metakit.py,v 1.49 2003-09-04 00:47:01 richard Exp $
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
2 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
3 Metakit backend for Roundup, originally by Gordon McMillan.
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
4
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
5 Notes by Richard:
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
6
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
7 This backend has some behaviour specific to metakit:
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
8
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
9 - there's no concept of an explicit "unset" in metakit, so all types
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
10 have some "unset" value:
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
11
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
12 ========= ===== ====================================================
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
13 Type Value Action when fetching from mk
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
14 ========= ===== ====================================================
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
15 Strings '' convert to None
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
16 Date 0 (seconds since 1970-01-01.00:00:00) convert to None
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
17 Interval '' convert to None
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
18 Number 0 ambiguious :( - do nothing
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
19 Boolean 0 ambiguious :( - do nothing
1563
e2a8ce4d2317 Class.find() may now find unset Links [SF#700620]
Richard Jones <richard@users.sourceforge.net>
parents: 1561
diff changeset
20 Link 0 convert to None
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
21 Multilink [] actually, mk can handle this one ;)
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
22 Passowrd '' convert to None
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
23 ========= ===== ====================================================
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
24
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
25 The get/set routines handle these values accordingly by converting
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
26 to/from None where they can. The Number/Boolean types are not able
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
27 to handle an "unset" at all, so they default the "unset" to 0.
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
28
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
29 - probably a bunch of stuff that I'm not aware of yet because I haven't
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
30 fully read through the source. One of these days....
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
31 '''
916
76b783c69976 Session storage in the hyperdb was horribly, horribly inefficient.
Richard Jones <richard@users.sourceforge.net>
parents: 892
diff changeset
32 from roundup import hyperdb, date, password, roundupdb, security
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
33 import metakit
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
34 from sessions import Sessions, OneTimeKeys
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
35 import re, marshal, os, sys, weakref, time, calendar
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
36 from roundup import indexer
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
37 import locking
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
38 from roundup.date import Range
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
39
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
40 _dbs = {}
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
41
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
42 def Database(config, journaltag=None):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
43 ''' Only have a single instance of the Database class for each instance
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
44 '''
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
45 db = _dbs.get(config.DATABASE, None)
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
46 if db is None or db._db is None:
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
47 db = _Database(config, journaltag)
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
48 _dbs[config.DATABASE] = db
930
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
49 else:
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
50 db.journaltag = journaltag
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
51 try:
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
52 delattr(db, 'curuserid')
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
53 except AttributeError:
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
54 pass
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
55 return db
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
56
1417
472c21af7f69 fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents: 1392
diff changeset
57 class _Database(hyperdb.Database, roundupdb.Database):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
58 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
59 self.config = config
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
60 self.journaltag = journaltag
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
61 self.classes = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
62 self.dirty = 0
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
63 self.lockfile = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
64 self._db = self.__open()
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
65 self.indexer = Indexer(self.config.DATABASE, self._db)
916
76b783c69976 Session storage in the hyperdb was horribly, horribly inefficient.
Richard Jones <richard@users.sourceforge.net>
parents: 892
diff changeset
66 self.sessions = Sessions(self.config)
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
67 self.otks = OneTimeKeys(self.config)
916
76b783c69976 Session storage in the hyperdb was horribly, horribly inefficient.
Richard Jones <richard@users.sourceforge.net>
parents: 892
diff changeset
68 self.security = security.Security(self)
76b783c69976 Session storage in the hyperdb was horribly, horribly inefficient.
Richard Jones <richard@users.sourceforge.net>
parents: 892
diff changeset
69
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
70 os.umask(0002)
1131
92e92ae58494 add close() methods where they are missing!
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
71
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
72 def post_init(self):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
73 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
74 self.reindex()
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
75
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
76 def reindex(self):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
77 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
78 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
79 klass.index(nodeid)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
80 self.indexer.save_index()
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
81
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
82 # --- defined in ping's spec
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
83 def __getattr__(self, classname):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
84 if classname == 'curuserid':
1176
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
85 if self.journaltag is None:
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
86 return None
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
87
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
88 # try to set the curuserid from the journaltag
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
89 try:
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
90 x = int(self.classes['user'].lookup(self.journaltag))
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
91 self.curuserid = x
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
92 except KeyError:
1176
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
93 if self.journaltag == 'admin':
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
94 self.curuserid = x = 1
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
95 else:
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
96 x = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
97 return x
926
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
98 elif classname == 'transactions':
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
99 return self.dirty
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
100 # fall back on the classes
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
101 return self.getclass(classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
102 def getclass(self, classname):
1145
81941abedb0a nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents: 1143
diff changeset
103 try:
81941abedb0a nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents: 1143
diff changeset
104 return self.classes[classname]
81941abedb0a nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents: 1143
diff changeset
105 except KeyError:
81941abedb0a nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents: 1143
diff changeset
106 raise KeyError, 'There is no class called "%s"'%classname
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
107 def getclasses(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
108 return self.classes.keys()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
109 # --- end of ping's spec
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
110
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
111 # --- exposed methods
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
112 def commit(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
113 if self.dirty:
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
114 self._db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
115 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
116 cl._commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
117 self.indexer.save_index()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
118 self.dirty = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
119 def rollback(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
120 if self.dirty:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
121 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
122 cl._rollback()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
123 self._db.rollback()
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
124 self._db = None
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
125 self._db = metakit.storage(self.dbnm, 1)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
126 self.hist = self._db.view('history')
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
127 self.tables = self._db.view('tables')
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
128 self.indexer.rollback()
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
129 self.indexer.datadb = self._db
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
130 self.dirty = 0
1232
c6a844d48176 Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1179
diff changeset
131 def clearCache(self):
c6a844d48176 Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1179
diff changeset
132 for cl in self.classes.values():
c6a844d48176 Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1179
diff changeset
133 cl._commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
134 def clear(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
135 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
136 cl._clear()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
137 def hasnode(self, classname, nodeid):
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
138 return self.getclass(classname).hasnode(nodeid)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
139 def pack(self, pack_before):
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
140 mindate = int(calendar.timegm(pack_before.get_tuple()))
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
141 i = 0
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
142 while i < len(self.hist):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
143 if self.hist[i].date < mindate and self.hist[i].action != _CREATE:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
144 self.hist.delete(i)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
145 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
146 i = i + 1
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
147 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
148 self.classes[cl.classname] = cl
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
149 if self.tables.find(name=cl.classname) < 0:
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
150 self.tables.append(name=cl.classname)
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
151 def addjournal(self, tablenm, nodeid, action, params, creator=None,
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
152 creation=None):
1179
9b013302c582 Remove some nasty debugging code.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1177
diff changeset
153 tblid = self.tables.find(name=tablenm)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
154 if tblid == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
155 tblid = self.tables.append(name=tablenm)
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
156 if creator is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
157 creator = self.curuserid
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
158 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
159 try:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
160 creator = int(creator)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
161 except TypeError:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
162 creator = int(self.getclass('user').lookup(creator))
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
163 if creation is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
164 creation = int(time.time())
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
165 elif isinstance(creation, date.Date):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
166 creation = int(calendar.timegm(creation.get_tuple()))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
167 # 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
168 self.hist.append(tableid=tblid,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
169 nodeid=int(nodeid),
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
170 date=creation,
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
171 action=action,
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
172 user = creator,
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
173 params = marshal.dumps(params))
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
174 def getjournal(self, tablenm, nodeid):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
175 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
176 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
177 if tblid == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
178 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
179 q = self.hist.select(tableid=tblid, nodeid=int(nodeid))
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
180 if len(q) == 0:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
181 raise IndexError, "no history for id %s in %s" % (nodeid, tablenm)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
182 i = 0
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
183 #userclass = self.getclass('user')
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
184 for row in q:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
185 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
186 params = marshal.loads(row.params)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
187 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
188 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
189 params = {}
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
190 #usernm = userclass.get(str(row.user), 'username')
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
191 dt = date.Date(time.gmtime(row.date))
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
192 #rslt.append((nodeid, dt, usernm, _actionnames[row.action], params))
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
193 rslt.append((nodeid, dt, str(row.user), _actionnames[row.action],
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
194 params))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
195 return rslt
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
196
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
197 def destroyjournal(self, tablenm, nodeid):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
198 nodeid = int(nodeid)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
199 tblid = self.tables.find(name=tablenm)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
200 if tblid == -1:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
201 return
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
202 i = 0
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
203 hist = self.hist
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
204 while i < len(hist):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
205 if hist[i].tableid == tblid and hist[i].nodeid == nodeid:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
206 hist.delete(i)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
207 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
208 i = i + 1
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
209 self.dirty = 1
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
210
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
211 def close(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
212 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
213 cl.db = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
214 self._db = None
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
215 if self.lockfile is not None:
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
216 locking.release_lock(self.lockfile)
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
217 if _dbs.has_key(self.config.DATABASE):
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
218 del _dbs[self.config.DATABASE]
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
219 if self.lockfile is not None:
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
220 self.lockfile.close()
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
221 self.lockfile = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
222 self.classes = {}
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
223 self.indexer = None
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
224
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
225 # --- internal
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
226 def __open(self):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
227 ''' Open the metakit database
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
228 '''
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
229 # make the database dir if it doesn't exist
1232
c6a844d48176 Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1179
diff changeset
230 if not os.path.exists(self.config.DATABASE):
c6a844d48176 Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1179
diff changeset
231 os.makedirs(self.config.DATABASE)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
232
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
233 # figure the file names
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
234 self.dbnm = db = os.path.join(self.config.DATABASE, 'tracker.mk4')
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
235 lockfilenm = db[:-3]+'lck'
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
236
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
237 # get the database lock
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
238 self.lockfile = locking.acquire_lock(lockfilenm)
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
239 self.lockfile.write(str(os.getpid()))
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
240 self.lockfile.flush()
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
241
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
242 # see if the schema has changed since last db access
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
243 self.fastopen = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
244 if os.path.exists(db):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
245 dbtm = os.path.getmtime(db)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
246 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
247 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
248 if schemamod:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
249 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
250 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
251 if schematm < dbtm:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
252 # 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
253 self.fastopen = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
254 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
255 # 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
256 self.fastopen = 1
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
257
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
258 # open the db
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
259 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
260 hist = db.view('history')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
261 tables = db.view('tables')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
262 if not self.fastopen:
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
263 # create the database if it's brand new
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
264 if not hist.structure():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
265 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
266 if not tables.structure():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
267 tables = db.getas('tables[name:S]')
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
268 db.commit()
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
269
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
270 # we now have an open, initialised database
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
271 self.tables = tables
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
272 self.hist = hist
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
273 return db
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
274
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
275 def setid(self, classname, maxid):
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
276 ''' No-op in metakit
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
277 '''
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
278 pass
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
279
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
280 _STRINGTYPE = type('')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
281 _LISTTYPE = type([])
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
282 _CREATE, _SET, _RETIRE, _LINK, _UNLINK, _RESTORE = range(6)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
283
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
284 _actionnames = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
285 _CREATE : 'create',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
286 _SET : 'set',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
287 _RETIRE : 'retire',
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
288 _RESTORE : 'restore',
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
289 _LINK : 'link',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
290 _UNLINK : 'unlink',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
291 }
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
292
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
293 _marker = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
294
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
295 _ALLOWSETTINGPRIVATEPROPS = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
296
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
297 class Class:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
298 privateprops = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
299 def __init__(self, db, classname, **properties):
918
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
300 #self.db = weakref.proxy(db)
fd95d395060f Lock the database, which means another round of making sure there's only one.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 916
diff changeset
301 self.db = db
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
302 self.classname = classname
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
303 self.keyname = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
304 self.ruprops = properties
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
305 self.privateprops = { 'id' : hyperdb.String(),
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
306 'activity' : hyperdb.Date(),
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
307 'creation' : hyperdb.Date(),
1176
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
308 'creator' : hyperdb.Link('user') }
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
309
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
310 # event -> list of callables
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
311 self.auditors = {'create': [], 'set': [], 'retire': [], 'restore': []}
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
312 self.reactors = {'create': [], 'set': [], 'retire': [], 'restore': []}
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
313
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
314 view = self.__getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
315 self.maxid = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
316 if view:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
317 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
318 self.uncommitted = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
319 self.rbactions = []
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
320
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
321 # people reach inside!!
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
322 self.properties = self.ruprops
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
323 self.db.addclass(self)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
324 self.idcache = {}
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
325
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
326 # 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
327 self.do_journal = 1
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
328
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
329 def enableJournalling(self):
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
330 '''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
331 '''
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
332 self.do_journal = 1
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
333
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
334 def disableJournalling(self):
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
335 '''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
336 '''
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
337 self.do_journal = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
338
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
339 # --- the roundup.Class methods
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
340 def audit(self, event, detector):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
341 l = self.auditors[event]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
342 if detector not in l:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
343 self.auditors[event].append(detector)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
344 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
345 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
346 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
347 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
348 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
349 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
350 def react(self, event, detector):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
351 l = self.reactors[event]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
352 if detector not in l:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
353 self.reactors[event].append(detector)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
354
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
355 # --- the hyperdb.Class methods
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
356 def create(self, **propvalues):
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
357 self.fireAuditors('create', None, propvalues)
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
358 newid = self.create_inner(**propvalues)
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
359 # self.set() (called in self.create_inner()) does reactors)
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
360 return newid
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
361
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
362 def create_inner(self, **propvalues):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
363 rowdict = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
364 rowdict['id'] = newid = self.maxid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
365 self.maxid += 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
366 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
367 propvalues['#ISNEW'] = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
368 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
369 self.set(str(newid), **propvalues)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
370 except Exception:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
371 self.maxid -= 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
372 raise
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
373 return str(newid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
374
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
375 def get(self, nodeid, propname, default=_marker, cache=1):
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1751
diff changeset
376 '''
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1751
diff changeset
377 'cache' exists for backwards compatibility, and is not used.
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1751
diff changeset
378 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
379
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
380 view = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
381 id = int(nodeid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
382 if cache == 0:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
383 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
384 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
385 return oldnode[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
386 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
387 if ndx is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
388 ndx = view.find(id=id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
389 if ndx < 0:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
390 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
391 self.idcache[id] = ndx
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
392 try:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
393 raw = getattr(view[ndx], propname)
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
394 except AttributeError:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
395 raise KeyError, propname
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
396 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
397 if rutyp is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
398 rutyp = self.privateprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
399 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
400 if converter:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
401 raw = converter(raw)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
402 return raw
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
403
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
404 def set(self, nodeid, **propvalues):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
405 isnew = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
406 if propvalues.has_key('#ISNEW'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
407 isnew = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
408 del propvalues['#ISNEW']
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
409 if not isnew:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
410 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
411 if not propvalues:
930
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
412 return propvalues
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
413 if propvalues.has_key('id'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
414 raise KeyError, '"id" is reserved'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
415 if self.db.journaltag is None:
1176
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
416 raise hyperdb.DatabaseError, 'Database open read-only'
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
417 view = self.getview(1)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
418
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
419 # 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
420 id = int(nodeid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
421 ndx = view.find(id=id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
422 if ndx < 0:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
423 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
424 row = view[ndx]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
425 if row._isdel:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
426 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
427 oldnode = self.uncommitted.setdefault(id, {})
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
428 changes = {}
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
429
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
430 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
431 # 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
432 # ... 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
433 # the writeable properties.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
434 if _ALLOWSETTINGPRIVATEPROPS:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
435 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
436 if not prop:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
437 prop = self.privateprops[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
438 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
439 prop = self.ruprops[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
440 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
441 # 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
442 # doing anything
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
443 oldvalue = converter(getattr(row, key))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
444 if value == oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
445 del propvalues[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
446 continue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
447
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
448 # 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
449 if key == self.keyname:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
450 iv = self.getindexview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
451 ndx = iv.find(k=value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
452 if ndx == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
453 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
454 if not isnew:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
455 ndx = iv.find(k=oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
456 if ndx > -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
457 iv.delete(ndx)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
458 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
459 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
460
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
461 # 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
462 if isinstance(prop, hyperdb.Link):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
463 link_class = prop.classname
927
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
464 # must be a string or None
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
465 if value is not None and not isinstance(value, type('')):
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
466 raise ValueError, 'property "%s" link value be a string'%(
1176
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
467 key)
930
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
468 # Roundup sets to "unselected" by passing None
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
469 if value is None:
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
470 value = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
471 # 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
472 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
473 int(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
474 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
475 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
476 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
477 except (TypeError, KeyError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
478 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
479 key, value, prop.classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
480
927
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
481 if (value is not None and
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
482 not self.db.getclass(link_class).hasnode(value)):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
483 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
484
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
485 setattr(row, key, int(value))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
486 changes[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
487
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
488 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
489 # 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
490 if oldvalue:
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
491 self.db.addjournal(link_class, oldvalue, _UNLINK,
927
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
492 (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
493
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
494 # 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
495 if value:
927
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
496 self.db.addjournal(link_class, value, _LINK,
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
497 (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
498
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
499 elif isinstance(prop, hyperdb.Multilink):
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
500 if value is not None and type(value) != _LISTTYPE:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
501 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
502 link_class = prop.classname
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
503 l = []
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
504 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
505 value = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
506 for entry in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
507 if type(entry) != _STRINGTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
508 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
509 'must be a string'%key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
510 # 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
511 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
512 int(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
513 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
514 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
515 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
516 except (TypeError, KeyError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
517 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
518 key, entry, prop.classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
519 l.append(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
520 propvalues[key] = value = l
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 # handle removals
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
523 rmvd = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
524 for id in oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
525 if id not in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
526 rmvd.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
527 # 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
528 if self.do_journal and prop.do_journal:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
529 self.db.addjournal(link_class, id, _UNLINK,
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
530 (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
531
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
532 # handle additions
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
533 adds = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
534 for id in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
535 if id not in oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
536 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
537 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
538 link_class, id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
539 adds.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
540 # 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
541 if self.do_journal and prop.do_journal:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
542 self.db.addjournal(link_class, id, _LINK,
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
543 (self.classname, str(row.id), key))
1385
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
544
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
545 # perform the modifications on the actual property value
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
546 sv = getattr(row, key)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
547 i = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
548 while i < len(sv):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
549 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
550 sv.delete(i)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
551 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
552 i += 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
553 for id in adds:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
554 sv.append(fid=int(id))
1385
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
555
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
556 # figure the journal entry
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
557 l = []
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
558 if adds:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
559 l.append(('+', adds))
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
560 if rmvd:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
561 l.append(('-', rmvd))
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
562 if l:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
563 changes[key] = tuple(l)
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
564 #changes[key] = oldvalue
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
565
930
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
566 if not rmvd and not adds:
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
567 del propvalues[key]
1389
7f9bd5b1e798 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 1385
diff changeset
568
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
569 elif isinstance(prop, hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
570 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
571 raise TypeError, 'new property "%s" not a string'%key
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
572 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
573 value = ''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
574 setattr(row, key, value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
575 changes[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
576 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
577 propvalues[key] = os.path.basename(value)
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
578 if prop.indexme:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
579 self.db.indexer.add_text((self.classname, nodeid, key),
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
580 value, 'text/plain')
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
581
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
582 elif isinstance(prop, hyperdb.Password):
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
583 if value is not None and not isinstance(value, password.Password):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
584 raise TypeError, 'new property "%s" not a Password'% key
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
585 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
586 value = ''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
587 setattr(row, key, str(value))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
588 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
589 propvalues[key] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
590
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
591 elif isinstance(prop, hyperdb.Date):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
592 if value is not None and not isinstance(value, date.Date):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
593 raise TypeError, 'new property "%s" not a Date'% key
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
594 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
595 setattr(row, key, 0)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
596 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
597 setattr(row, key, int(calendar.timegm(value.get_tuple())))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
598 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
599 propvalues[key] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
600
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
601 elif isinstance(prop, hyperdb.Interval):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
602 if value is not None and not isinstance(value, date.Interval):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
603 raise TypeError, 'new property "%s" not an Interval'% key
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
604 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
605 setattr(row, key, '')
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
606 else:
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
607 # kedder: we should store interval values serialized
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
608 setattr(row, key, value.serialise())
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
609 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
610 propvalues[key] = str(value)
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
611
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
612 elif isinstance(prop, hyperdb.Number):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
613 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
614 value = 0
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
615 try:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
616 v = int(value)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
617 except ValueError:
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
618 raise TypeError, "%s (%s) is not numeric"%(key, repr(value))
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
619 setattr(row, key, v)
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
620 changes[key] = oldvalue
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
621 propvalues[key] = value
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
622
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
623 elif isinstance(prop, hyperdb.Boolean):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
624 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
625 bv = 0
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
626 elif value not in (0,1):
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
627 raise TypeError, "%s (%s) is not boolean"%(key, repr(value))
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
628 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
629 bv = value
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
630 setattr(row, key, bv)
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
631 changes[key] = oldvalue
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
632 propvalues[key] = value
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
633
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
634 oldnode[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
635
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
636 # nothing to do?
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
637 if not propvalues:
930
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
638 return propvalues
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
639 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
640 row.activity = int(time.time())
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
641 if isnew:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
642 if not row.creation:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
643 row.creation = int(time.time())
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
644 if not row.creator:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
645 row.creator = self.db.curuserid
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
646
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
647 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
648 if self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
649 if isnew:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
650 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
651 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
652 else:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
653 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
654 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
655
930
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
656 return propvalues
3c344e942055 Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 927
diff changeset
657
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
658 def retire(self, nodeid):
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
659 if self.db.journaltag is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
660 raise hyperdb.DatabaseError, 'Database open read-only'
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
661 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
662 view = self.getview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
663 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
664 if ndx < 0:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
665 raise KeyError, "nodeid %s not found" % nodeid
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
666
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
667 row = view[ndx]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
668 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
669 oldval = oldvalues['_isdel'] = row._isdel
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
670 row._isdel = 1
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
671
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
672 if self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
673 self.db.addjournal(self.classname, nodeid, _RETIRE, {})
926
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
674 if self.keyname:
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
675 iv = self.getindexview(1)
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
676 ndx = iv.find(k=getattr(row, self.keyname),i=row.id)
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
677 if ndx > -1:
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
678 iv.delete(ndx)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
679 self.db.dirty = 1
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
680 self.fireReactors('retire', nodeid, None)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
681
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
682 def restore(self, nodeid):
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
683 '''Restpre a retired node.
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
684
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
685 Make node available for all operations like it was before retirement.
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
686 '''
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
687 if self.db.journaltag is None:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
688 raise hyperdb.DatabaseError, 'Database open read-only'
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
689
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
690 # check if key property was overrided
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
691 key = self.getkey()
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
692 keyvalue = self.get(nodeid, key)
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
693 try:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
694 id = self.lookup(keyvalue)
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
695 except KeyError:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
696 pass
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
697 else:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
698 raise KeyError, "Key property (%s) of retired node clashes with \
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
699 existing one (%s)" % (key, keyvalue)
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
700 # Now we can safely restore node
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
701 self.fireAuditors('restore', nodeid, None)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
702 view = self.getview(1)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
703 ndx = view.find(id=int(nodeid))
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
704 if ndx < 0:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
705 raise KeyError, "nodeid %s not found" % nodeid
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
706
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
707 row = view[ndx]
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
708 oldvalues = self.uncommitted.setdefault(row.id, {})
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
709 oldval = oldvalues['_isdel'] = row._isdel
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
710 row._isdel = 0
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
711
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
712 if self.do_journal:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
713 self.db.addjournal(self.classname, nodeid, _RESTORE, {})
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
714 if self.keyname:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
715 iv = self.getindexview(1)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
716 ndx = iv.find(k=getattr(row, self.keyname),i=row.id)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
717 if ndx > -1:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
718 iv.delete(ndx)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
719 self.db.dirty = 1
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
720 self.fireReactors('restore', nodeid, None)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
721
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
722 def is_retired(self, nodeid):
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
723 view = self.getview(1)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
724 # node must exist & not be retired
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
725 id = int(nodeid)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
726 ndx = view.find(id=id)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
727 if ndx < 0:
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
728 raise IndexError, "%s has no node %s" % (self.classname, nodeid)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
729 row = view[ndx]
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
730 return row._isdel
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
731
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
732 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
733 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
734 raise ValueError, 'Journalling is disabled for this class'
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
735 return self.db.getjournal(self.classname, nodeid)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
736
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
737 def setkey(self, propname):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
738 if self.keyname:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
739 if propname == self.keyname:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
740 return
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
741 raise ValueError, "%s already indexed on %s"%(self.classname,
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
742 self.keyname)
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
743 prop = self.properties.get(propname, None)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
744 if prop is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
745 prop = self.privateprops.get(propname, None)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
746 if prop is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
747 raise KeyError, "no property %s" % propname
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
748 if not isinstance(prop, hyperdb.String):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
749 raise TypeError, "%s is not a String" % propname
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
750
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
751 # first setkey for this run
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
752 self.keyname = propname
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
753 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
754 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
755 return
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
756
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
757 # very first setkey ever
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
758 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
759 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
760 iv = iv.ordered(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
761 for row in self.getview():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
762 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
763 self.db.commit()
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
764
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
765 def getkey(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
766 return self.keyname
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
767
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
768 def lookup(self, keyvalue):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
769 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
770 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
771 iv = self.getindexview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
772 if iv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
773 ndx = iv.find(k=keyvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
774 if ndx > -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
775 return str(iv[ndx].i)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
776 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
777 view = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
778 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
779 if ndx > -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
780 return str(view[ndx].id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
781 raise KeyError, keyvalue
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
782
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
783 def destroy(self, id):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
784 view = self.getview(1)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
785 ndx = view.find(id=int(id))
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
786 if ndx > -1:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
787 if self.keyname:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
788 keyvalue = getattr(view[ndx], self.keyname)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
789 iv = self.getindexview(1)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
790 if iv:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
791 ivndx = iv.find(k=keyvalue)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
792 if ivndx > -1:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
793 iv.delete(ivndx)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
794 view.delete(ndx)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
795 self.db.destroyjournal(self.classname, id)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
796 self.db.dirty = 1
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
797
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
798 def find(self, **propspec):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
799 """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
800
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
801 '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
802 '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
803 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
804 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
805
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
806 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
807 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
808 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
809 issues:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
810
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
811 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
812
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
813 """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
814 propspec = propspec.items()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
815 for propname, nodeid in propspec:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
816 # check the prop is OK
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
817 prop = self.ruprops[propname]
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
818 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
819 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
820 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
821
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
822 vws = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
823 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
824 if type(ids) is _STRINGTYPE:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
825 ids = {int(ids):1}
1563
e2a8ce4d2317 Class.find() may now find unset Links [SF#700620]
Richard Jones <richard@users.sourceforge.net>
parents: 1561
diff changeset
826 elif ids is None:
e2a8ce4d2317 Class.find() may now find unset Links [SF#700620]
Richard Jones <richard@users.sourceforge.net>
parents: 1561
diff changeset
827 ids = {0:1}
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
828 else:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
829 d = {}
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
830 for id in ids.keys():
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
831 d[int(id)] = 1
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
832 ids = d
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
833 prop = self.ruprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
834 view = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
835 if isinstance(prop, hyperdb.Multilink):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
836 def ff(row, nm=propname, ids=ids):
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
837 sv = getattr(row, nm)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
838 for sr in sv:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
839 if ids.has_key(sr.fid):
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
840 return 1
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
841 return 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
842 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
843 def ff(row, nm=propname, ids=ids):
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
844 return ids.has_key(getattr(row, nm))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
845 ndxview = view.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
846 vws.append(ndxview.unique())
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
847
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
848 # handle the empty match case
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
849 if not vws:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
850 return []
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
851
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
852 ndxview = vws[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
853 for v in vws[1:]:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
854 ndxview = ndxview.union(v)
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
855 view = self.getview().remapwith(ndxview)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
856 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
857 for row in view:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
858 rslt.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
859 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
860
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
861
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
862 def list(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
863 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
864 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
865 l.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
866 return l
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
867
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
868 def getnodeids(self):
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
869 l = []
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
870 for row in self.getview():
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
871 l.append(str(row.id))
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
872 return l
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
873
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
874 def count(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
875 return len(self.getview())
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
876
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
877 def getprops(self, protected=1):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
878 # 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
879 allprops = self.ruprops.copy()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
880 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
881 allprops.update(self.privateprops)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
882 return allprops
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
883
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
884 def addprop(self, **properties):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
885 for key in properties.keys():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
886 if self.ruprops.has_key(key):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
887 raise ValueError, "%s is already a property of %s"%(key,
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
888 self.classname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
889 self.ruprops.update(properties)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
890 # Class structure has changed
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
891 self.db.fastopen = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
892 view = self.__getview()
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
893 self.db.commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
894 # ---- end of ping's spec
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
895
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1243
diff changeset
896 def filter(self, search_matches, filterspec, sort=(None,None),
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1243
diff changeset
897 group=(None,None)):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
898 # 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
899 # filterspec is a dict {propname:value}
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
900 # sort and group are (dir, prop) where dir is '+', '-' or None
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
901 # and prop is a prop name or None
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
902
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
903 timezone = self.db.getUserTimezone()
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
904
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
905 where = {'_isdel':0}
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
906 wherehigh = {}
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
907 mlcriteria = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
908 regexes = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
909 orcriteria = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
910 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
911 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
912 if prop is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
913 prop = self.privateprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
914 if isinstance(prop, hyperdb.Multilink):
1561
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
915 if value in ('-1', ['-1']):
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
916 value = []
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
917 elif type(value) is not _LISTTYPE:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
918 value = [value]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
919 # transform keys to ids
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
920 u = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
921 for item in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
922 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
923 item = int(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
924 except (TypeError, ValueError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
925 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
926 if item == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
927 item = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
928 u.append(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
929 mlcriteria[propname] = u
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
930 elif isinstance(prop, hyperdb.Link):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
931 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
932 value = [value]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
933 # transform keys to ids
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
934 u = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
935 for item in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
936 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
937 item = int(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
938 except (TypeError, ValueError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
939 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
940 if item == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
941 item = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
942 u.append(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
943 if len(u) == 1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
944 where[propname] = u[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
945 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
946 orcriteria[propname] = u
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
947 elif isinstance(prop, hyperdb.String):
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
948 if type(value) is not type([]):
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
949 value = [value]
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
950 m = []
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
951 for v in value:
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
952 # simple glob searching
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
953 v = re.sub(r'([\|\{\}\\\.\+\[\]\(\)])', r'\\\1', v)
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
954 v = v.replace('?', '.')
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
955 v = v.replace('*', '.*?')
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
956 m.append(v)
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
957 regexes[propname] = re.compile('(%s)'%('|'.join(m)), re.I)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
958 elif propname == 'id':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
959 where[propname] = int(value)
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
960 elif isinstance(prop, hyperdb.Boolean):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
961 if type(value) is _STRINGTYPE:
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
962 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
963 else:
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
964 bv = value
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
965 where[propname] = bv
1351
d1bfb479e527 fixed searching on date / interval fields [SF#658157]
Richard Jones <richard@users.sourceforge.net>
parents: 1333
diff changeset
966 elif isinstance(prop, hyperdb.Date):
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
967 try:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
968 # Try to filter on range of dates
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
969 date_rng = Range(value, date.Date, offset=timezone)
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
970 if date_rng.from_value:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
971 t = date_rng.from_value.get_tuple()
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
972 where[propname] = int(calendar.timegm(t))
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
973 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
974 # use minimum possible value to exclude items without
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
975 # 'prop' property
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
976 where[propname] = 0
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
977 if date_rng.to_value:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
978 t = date_rng.to_value.get_tuple()
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
979 wherehigh[propname] = int(calendar.timegm(t))
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
980 else:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
981 wherehigh[propname] = None
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
982 except ValueError:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
983 # If range creation fails - ignore that search parameter
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
984 pass
1351
d1bfb479e527 fixed searching on date / interval fields [SF#658157]
Richard Jones <richard@users.sourceforge.net>
parents: 1333
diff changeset
985 elif isinstance(prop, hyperdb.Interval):
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
986 try:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
987 # Try to filter on range of intervals
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
988 date_rng = Range(value, date.Interval)
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
989 if date_rng.from_value:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
990 #t = date_rng.from_value.get_tuple()
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
991 where[propname] = date_rng.from_value.serialise()
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
992 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
993 # use minimum possible value to exclude items without
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
994 # 'prop' property
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
995 where[propname] = '-99999999999999'
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
996 if date_rng.to_value:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
997 #t = date_rng.to_value.get_tuple()
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
998 wherehigh[propname] = date_rng.to_value.serialise()
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
999 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1000 wherehigh[propname] = None
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1001 except ValueError:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1002 # If range creation fails - ignore that search parameter
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1003 pass
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1004 elif isinstance(prop, hyperdb.Number):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1005 where[propname] = int(value)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1006 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1007 where[propname] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1008 v = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1009 #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
1010 if where:
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1011 where_higherbound = where.copy()
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1012 where_higherbound.update(wherehigh)
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1013 v = v.select(where, where_higherbound)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1014 #print "filter where at %s" % time.time()
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1015
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1016 if mlcriteria:
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1017 # multilink - if any of the nodeids required by the
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1018 # filterspec aren't in this node's property, then skip it
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1019 def ff(row, ml=mlcriteria):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1020 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
1021 sv = getattr(row, propname)
1561
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1022 if not values and sv:
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1023 return 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1024 for id in values:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1025 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
1026 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1027 return 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1028 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1029 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1030
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1031 #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
1032
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1033 if orcriteria:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1034 def ff(row, crit=orcriteria):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1035 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
1036 val = getattr(row, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1037 if val not in allowed:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1038 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1039 return 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1040
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1041 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1042 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1043
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1044 #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
1045 if regexes:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1046 def ff(row, r=regexes):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1047 for propname, regex in r.items():
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1048 val = str(getattr(row, propname))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1049 if not regex.search(val):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1050 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1051 return 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1052
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1053 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1054 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1055 #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
1056
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1057 if sort or group:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1058 sortspec = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1059 rev = []
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1060 for dir, propname in group, sort:
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1061 if propname is None: continue
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1062 isreversed = 0
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1063 if dir == '-':
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1064 isreversed = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1065 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1066 prop = getattr(v, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1067 except AttributeError:
926
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1068 print "MK has no property %s" % propname
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1069 continue
926
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1070 propclass = self.ruprops.get(propname, None)
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1071 if propclass is None:
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1072 propclass = self.privateprops.get(propname, None)
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1073 if propclass is None:
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1074 print "Schema has no property %s" % propname
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1075 continue
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1076 if isinstance(propclass, hyperdb.Link):
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1077 linkclass = self.db.getclass(propclass.classname)
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1078 lv = linkclass.getview()
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1079 lv = lv.rename('id', propname)
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1080 v = v.join(lv, prop, 1)
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1081 if linkclass.getprops().has_key('order'):
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1082 propname = 'order'
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1083 else:
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1084 propname = linkclass.labelprop()
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1085 prop = getattr(v, propname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1086 if isreversed:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1087 rev.append(prop)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1088 sortspec.append(prop)
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
1089 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
1090 #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
1091
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1092 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1093 for row in v:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1094 id = str(row.id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1095 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
1096 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
1097 rslt.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1098 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1099 rslt.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1100 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1101
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1102 def hasnode(self, nodeid):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1103 return int(nodeid) < self.maxid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1104
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1105 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
1106 ''' 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
1107
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1108 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
1109 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
1110 1. key property
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1111 2. "name" property
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1112 3. "title" property
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1113 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
1114 '''
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1115 k = self.getkey()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1116 if k:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1117 return k
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1118 props = self.getprops()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1119 if props.has_key('name'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1120 return 'name'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1121 elif props.has_key('title'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1122 return 'title'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1123 if default_to_id:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1124 return 'id'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1125 props = props.keys()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1126 props.sort()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1127 return props[0]
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1128
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1129 def stringFind(self, **requirements):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1130 """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
1131 properties in a caseless search.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1132
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1133 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
1134
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1135 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
1136 """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1137 for propname in requirements.keys():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1138 prop = self.properties[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1139 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
1140 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
1141 requirements[propname] = requirements[propname].lower()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1142 requirements['_isdel'] = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1143
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1144 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1145 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
1146 l.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1147 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1148
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1149 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
1150 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
1151
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1152 def index(self, nodeid):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1153 ''' 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
1154 # 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
1155 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
1156 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
1157 # 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
1158 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
1159 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
1160
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1161 def export_list(self, propnames, nodeid):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1162 ''' Export a node - generate a list of CSV-able data in the order
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1163 specified by propnames for the given node.
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1164 '''
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1165 properties = self.getprops()
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1166 l = []
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1167 for prop in propnames:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1168 proptype = properties[prop]
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1169 value = self.get(nodeid, prop)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1170 # "marshal" data where needed
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1171 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1172 pass
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1173 elif isinstance(proptype, hyperdb.Date):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1174 value = value.get_tuple()
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1175 elif isinstance(proptype, hyperdb.Interval):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1176 value = value.get_tuple()
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1177 elif isinstance(proptype, hyperdb.Password):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1178 value = str(value)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1179 l.append(repr(value))
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1180
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1181 # append retired flag
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1182 l.append(self.is_retired(nodeid))
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1183
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1184 return l
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1185
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1186 def import_list(self, propnames, proplist):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1187 ''' Import a node - all information including "id" is present and
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1188 should not be sanity checked. Triggers are not triggered. The
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1189 journal should be initialised using the "creator" and "creation"
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1190 information.
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1191
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1192 Return the nodeid of the node imported.
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1193 '''
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1194 if self.db.journaltag is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1195 raise hyperdb.DatabaseError, 'Database open read-only'
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1196 properties = self.getprops()
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1197
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1198 d = {}
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1199 view = self.getview(1)
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1200 for i in range(len(propnames)):
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1201 value = eval(proplist[i])
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1202 if not value:
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1203 continue
1496
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1204
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1205 propname = propnames[i]
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1206 if propname == 'id':
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1207 newid = value = int(value)
1496
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1208 elif propname == 'is retired':
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1209 # is the item retired?
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1210 if int(value):
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1211 d['_isdel'] = 1
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1212 continue
1751
ab7760caf6ff Importing wasn't setting None values explicitly when it should have been
Richard Jones <richard@users.sourceforge.net>
parents: 1631
diff changeset
1213 elif value is None:
ab7760caf6ff Importing wasn't setting None values explicitly when it should have been
Richard Jones <richard@users.sourceforge.net>
parents: 1631
diff changeset
1214 d[propname] = None
ab7760caf6ff Importing wasn't setting None values explicitly when it should have been
Richard Jones <richard@users.sourceforge.net>
parents: 1631
diff changeset
1215 continue
1496
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1216
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1217 prop = properties[propname]
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1218 if isinstance(prop, hyperdb.Date):
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1219 value = int(calendar.timegm(value))
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1220 elif isinstance(prop, hyperdb.Interval):
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1221 value = date.Interval(value).serialise()
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1222 elif isinstance(prop, hyperdb.Number):
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1223 value = int(value)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1224 elif isinstance(prop, hyperdb.Boolean):
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1225 value = int(value)
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1226 elif isinstance(prop, hyperdb.Link) and value:
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1227 value = int(value)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1228 elif isinstance(prop, hyperdb.Multilink):
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1229 # we handle multilinks separately
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1230 continue
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1231 d[propname] = value
1496
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1232
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1233 # possibly make a new node
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1234 if not d.has_key('id'):
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1235 d['id'] = newid = self.maxid
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1236 self.maxid += 1
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1237
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1238 # save off the node
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1239 view.append(d)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1240
1496
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1241 # fix up multilinks
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1242 ndx = view.find(id=newid)
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1243 row = view[ndx]
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1244 for i in range(len(propnames)):
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1245 value = eval(proplist[i])
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1246 propname = propnames[i]
1496
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1247 if propname == 'is retired':
e6ac4e074acb relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents: 1484
diff changeset
1248 continue
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1249 prop = properties[propname]
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1250 if not isinstance(prop, hyperdb.Multilink):
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1251 continue
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1252 sv = getattr(row, propname)
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1253 for entry in value:
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1254 sv.append(int(entry))
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1255
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1256 self.db.dirty = 1
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1257 creator = d.get('creator', 0)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1258 creation = d.get('creation', 0)
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1259 self.db.addjournal(self.classname, str(newid), _CREATE, {}, creator,
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1260 creation)
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1261 return newid
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1262
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1263 # --- used by Database
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1264 def _commit(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1265 """ 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
1266 interested subclasses may override """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1267 self.uncommitted = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1268 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1269 self.idcache = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1270 def _rollback(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1271 """ 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
1272 interested subclasses may override """
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1273 for action in self.rbactions:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1274 action()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1275 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1276 self.uncommitted = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1277 self.idcache = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1278 def _clear(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1279 view = self.getview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1280 if len(view):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1281 view[:] = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1282 self.db.dirty = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1283 iv = self.getindexview(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1284 if iv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1285 iv[:] = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1286 def rollbackaction(self, action):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1287 """ 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
1288 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
1289 self.rbactions.append(action)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1290 # --- internal
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1291 def __getview(self):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1292 ''' Find the interface for a specific Class in the hyperdb.
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1293
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1294 This method checks to see whether the schema has changed and
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1295 re-works the underlying metakit structure if it has.
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1296 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1297 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
1298 view = db.view(self.classname)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1299 mkprops = view.structure()
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1300
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1301 # if we have structure in the database, and the structure hasn't
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1302 # changed
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1303 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
1304 return view.ordered(1)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1305
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1306 # is the definition the same?
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1307 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
1308 for mkprop in mkprops:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1309 if mkprop.name == nm:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1310 break
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1311 else:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1312 mkprop = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1313 if mkprop is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1314 break
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1315 if _typmap[rutyp.__class__] != mkprop.type:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1316 break
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1317 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1318 return view.ordered(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1319 # 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
1320 # 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
1321 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
1322 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
1323 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
1324 mktyp = _typmap[rutyp.__class__]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1325 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
1326 if mktyp == 'V':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1327 s[-1] += ('[fid:I]')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1328 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
1329 v = self.db._db.getas(','.join(s))
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1330 self.db.commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1331 return v.ordered(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1332 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
1333 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
1334 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
1335 return self.db._db.view("_%s" % self.classname).ordered(1)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1336
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1337 def _fetchML(sv):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1338 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1339 for row in sv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1340 if row.fid:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1341 l.append(str(row.fid))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1342 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1343
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1344 def _fetchPW(s):
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1345 ''' Convert to a password.Password unless the password is '' which is
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1346 our sentinel for "unset".
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1347 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1348 if s == '':
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1349 return None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1350 p = password.Password()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1351 p.unpack(s)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1352 return p
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1353
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1354 def _fetchLink(n):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1355 ''' Return None if the link is 0 - otherwise strify it.
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1356 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1357 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
1358
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1359 def _fetchDate(n):
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1360 ''' Convert the timestamp to a date.Date instance - unless it's 0 which
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1361 is our sentinel for "unset".
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1362 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1363 if n == 0:
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1364 return None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1365 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
1366
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1367 def _fetchInterval(n):
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1368 ''' Convert to a date.Interval unless the interval is '' which is our
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1369 sentinel for "unset".
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1370 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1371 if n == '':
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1372 return None
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1373 return date.Interval(n)
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1374
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1375 _converters = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1376 hyperdb.Date : _fetchDate,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1377 hyperdb.Link : _fetchLink,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1378 hyperdb.Multilink : _fetchML,
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1379 hyperdb.Interval : _fetchInterval,
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1380 hyperdb.Password : _fetchPW,
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1381 hyperdb.Boolean : lambda n: n,
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1382 hyperdb.Number : lambda n: n,
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1383 hyperdb.String : lambda s: s and str(s) or None,
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1384 }
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1385
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1386 class FileName(hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1387 isfilename = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1388
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1389 _typmap = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1390 FileName : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1391 hyperdb.String : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1392 hyperdb.Date : 'I',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1393 hyperdb.Link : 'I',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1394 hyperdb.Multilink : 'V',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1395 hyperdb.Interval : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1396 hyperdb.Password : 'S',
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1397 hyperdb.Boolean : 'I',
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1398 hyperdb.Number : 'I',
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1399 }
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1431
diff changeset
1400 class FileClass(Class, hyperdb.FileClass):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1401 ''' like Class but with a content property
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1402 '''
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1403 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
1404 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
1405 properties['content'] = FileName()
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1406 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
1407 properties['type'] = hyperdb.String()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1408 Class.__init__(self, db, classname, **properties)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1409
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1410 def get(self, nodeid, propname, default=_marker, cache=1):
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1751
diff changeset
1411 x = Class.get(self, nodeid, propname, default)
1417
472c21af7f69 fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents: 1392
diff changeset
1412 poss_msg = 'Possibly an access right configuration problem.'
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1413 if propname == 'content':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1414 if x.startswith('file:'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1415 fnm = x[5:]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1416 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1417 x = open(fnm, 'rb').read()
1417
472c21af7f69 fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents: 1392
diff changeset
1418 except IOError, (strerror):
472c21af7f69 fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents: 1392
diff changeset
1419 # XXX by catching this we donot see an error in the log.
472c21af7f69 fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents: 1392
diff changeset
1420 return 'ERROR reading file: %s%s\n%s\n%s'%(
472c21af7f69 fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents: 1392
diff changeset
1421 self.classname, nodeid, poss_msg, strerror)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1422 return x
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1423
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1424 def create(self, **propvalues):
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1425 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
1426 content = propvalues['content']
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1427 del propvalues['content']
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1428 newid = Class.create_inner(self, **propvalues)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1429 if not content:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1430 return newid
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1431 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
1432 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
1433 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
1434 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
1435 os.makedirs(d)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1436 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
1437 open(nm, 'wb').write(content)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1438 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
1439 mimetype = propvalues.get('type', self.default_mime_type)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1440 self.db.indexer.add_text((self.classname, newid, 'content'), content,
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1441 mimetype)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1442 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
1443 action1(fnm)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1444 self.rollbackaction(undo)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1445 return newid
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1446
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1447 def index(self, nodeid):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1448 Class.index(self, nodeid)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1449 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
1450 if not mimetype:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1451 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
1452 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
1453 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
1454
859
eb924e614934 Fixes for the metakit backend
Richard Jones <richard@users.sourceforge.net>
parents: 854
diff changeset
1455 class IssueClass(Class, roundupdb.IssueClass):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1456 ''' The newly-created class automatically includes the "messages",
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1457 "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
1458 dictionary attempts to specify any of these properties or a
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1459 "creation" or "activity" property, a ValueError is raised.
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1460 '''
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1461 def __init__(self, db, classname, **properties):
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1462 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
1463 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
1464 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
1465 properties['messages'] = hyperdb.Multilink("msg")
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1466 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
1467 properties['files'] = hyperdb.Multilink("file")
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1468 if not properties.has_key('nosy'):
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1469 # note: journalling is turned off as it really just wastes
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1470 # space. this behaviour may be overridden in an instance
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1471 properties['nosy'] = hyperdb.Multilink("user", do_journal="no")
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1472 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
1473 properties['superseder'] = hyperdb.Multilink(classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1474 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
1475
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1476 CURVERSION = 2
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1477
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1478 class Indexer(indexer.Indexer):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1479 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
1480 def __init__(self, path, datadb):
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1481 self.path = os.path.join(path, 'index.mk4')
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1482 self.db = metakit.storage(self.path, 1)
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1483 self.datadb = datadb
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1484 self.reindex = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1485 v = self.db.view('version')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1486 if not v.structure():
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1487 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
1488 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1489 v.append(vers=CURVERSION)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1490 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1491 elif v[0].vers != CURVERSION:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1492 v[0].vers = CURVERSION
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1493 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1494 if self.reindex:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1495 self.db.getas('ids[tblid:I,nodeid:I,propid:I,ignore:I]')
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1496 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
1497 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1498 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1499 self.changed = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1500 self.propcache = {}
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1501
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1502 def force_reindex(self):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1503 v = self.db.view('ids')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1504 v[:] = []
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1505 v = self.db.view('index')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1506 v[:] = []
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1507 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1508 self.reindex = 1
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1509
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1510 def should_reindex(self):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1511 return self.reindex
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1512
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1513 def _getprops(self, classname):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1514 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
1515 if props is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1516 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
1517 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
1518 self.propcache[classname] = props
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1519 return props
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1520
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1521 def _getpropid(self, classname, propname):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1522 return self._getprops(classname).index(propname)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1523
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1524 def _getpropname(self, classname, propid):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1525 return self._getprops(classname)[propid]
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
1526
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1527 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
1528 if mime_type != 'text/plain':
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1529 return
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1530 classname, nodeid, property = identifier
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1531 tbls = self.datadb.view('tables')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1532 tblid = tbls.find(name=classname)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1533 if tblid < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1534 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
1535 nodeid = int(nodeid)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1536 propid = self._getpropid(classname, property)
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1537 ids = self.db.view('ids')
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1538 oldpos = ids.find(tblid=tblid,nodeid=nodeid,propid=propid,ignore=0)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1539 if oldpos > -1:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1540 ids[oldpos].ignore = 1
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1541 self.changed = 1
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1542 pos = ids.append(tblid=tblid,nodeid=nodeid,propid=propid)
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1543
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1544 wordlist = re.findall(r'\b\w{2,25}\b', text.upper())
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1545 words = {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1546 for word in wordlist:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1547 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
1548 words[word] = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1549 words = words.keys()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1550
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1551 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
1552 for word in words:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1553 ndx = index.find(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1554 if ndx < 0:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1555 index.append(word=word)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1556 ndx = index.find(word=word)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1557 index[ndx].hits.append(pos=pos)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1558 self.changed = 1
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
1559
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1560 def find(self, wordlist):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1561 hits = None
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1562 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
1563 for word in wordlist:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1564 word = word.upper()
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1565 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
1566 continue
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1567 ndx = index.find(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1568 if ndx < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1569 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1570 if hits is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1571 hits = index[ndx].hits
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1572 else:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1573 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
1574 if len(hits) == 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1575 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1576 if hits is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1577 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1578 rslt = {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1579 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
1580 tbls = self.datadb.view('tables')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1581 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
1582 hit = ids[i]
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1583 if not hit.ignore:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1584 classname = tbls[hit.tblid].name
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1585 nodeid = str(hit.nodeid)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1586 property = self._getpropname(classname, hit.propid)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1587 rslt[i] = (classname, nodeid, property)
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1588 return rslt
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1589
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1590 def save_index(self):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1591 if self.changed:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1592 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1593 self.changed = 0
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1594
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1595 def rollback(self):
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1596 if self.changed:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1597 self.db.rollback()
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1598 self.db = metakit.storage(self.path, 1)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1599 self.changed = 0
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1600

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