annotate roundup/backends/back_metakit.py @ 2623:4e1030d49cea

fix: Option defaults were applied as strings... ...not converted to internal representation; add Option methods str2value and value2str for value conversion from and to the strings kept in .ini file; options MAIL_USERNAME, MAIL_TLS_KEYFILE and MAIL_TLS_CERTFILE default to empty strings: NODEFAULT value is a configuration error, and for these options it is ok to keep them unset.
author Alexander Smishlajev <a1s@users.sourceforge.net>
date Sun, 25 Jul 2004 14:36:50 +0000
parents 5ccd99777869
children a9e1fff1e793
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2603
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1 # $Id: back_metakit.py,v 1.81 2004-07-20 23:24:26 richard Exp $
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
2 '''Metakit backend for Roundup, originally by Gordon McMillan.
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
3
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
4 Known Current Bugs:
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
5
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
6 - You can't change a class' key properly. This shouldn't be too hard to fix.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
7 - Some unit tests are overridden.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
8
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
9 Notes by Richard:
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
10
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
11 This backend has some behaviour specific to metakit:
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
12
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
13 - there's no concept of an explicit "unset" in metakit, so all types
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
14 have some "unset" value:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
15
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
16 ========= ===== ======================================================
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
17 Type Value Action when fetching from mk
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
18 ========= ===== ======================================================
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
19 Strings '' convert to None
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
20 Date 0 (seconds since 1970-01-01.00:00:00) convert to None
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
21 Interval '' convert to None
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
22 Number 0 ambiguious :( - do nothing (see BACKWARDS_COMPATIBLE)
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
23 Boolean 0 ambiguious :( - do nothing (see BACKWARDS_COMPATABILE)
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
24 Link 0 convert to None
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
25 Multilink [] actually, mk can handle this one ;)
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
26 Password '' convert to None
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
27 ========= ===== ======================================================
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
28
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
29 The get/set routines handle these values accordingly by converting
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
30 to/from None where they can. The Number/Boolean types are not able
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
31 to handle an "unset" at all, so they default the "unset" to 0.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
32 - Metakit relies in reference counting to close the database, there is
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
33 no explicit close call. This can cause issues if a metakit
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
34 database is referenced multiple times, one might not actually be
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
35 closing the db.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
36 - probably a bunch of stuff that I'm not aware of yet because I haven't
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
37 fully read through the source. One of these days....
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
38 '''
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
39 __docformat__ = 'restructuredtext'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
40 # Enable this flag to break backwards compatibility (i.e. can't read old
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
41 # databases) but comply with more roundup features, like adding NULL support.
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2093
diff changeset
42 BACKWARDS_COMPATIBLE = 1
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
43
916
76b783c69976 Session storage in the hyperdb was horribly, horribly inefficient.
Richard Jones <richard@users.sourceforge.net>
parents: 892
diff changeset
44 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
45 import metakit
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents: 2076
diff changeset
46 from sessions_dbm import Sessions, OneTimeKeys
2498
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
47 import re, marshal, os, sys, time, calendar, shutil
2089
93f03c6714d8 A few big changes in this commit:
Richard Jones <richard@users.sourceforge.net>
parents: 2082
diff changeset
48 from indexer_dbm import Indexer
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
49 import locking
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
50 from roundup.date import Range
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
51 from blobfiles import files_in_dir
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
52
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
53 # view modes for opening
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
54 # XXX FIXME BPK -> these don't do anything, they are ignored
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
55 # should we just get rid of them for simplicities sake?
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
56 READ = 0
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
57 READWRITE = 1
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
58
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
59 # general metakit error
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
60 class MKBackendError(Exception):
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
61 pass
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
62
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 _dbs = {}
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
64
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
65 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
66 ''' 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
67 '''
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
68 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
69 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
70 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
71 _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
72 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
73 db.journaltag = journaltag
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
74 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
75
1417
472c21af7f69 fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents: 1392
diff changeset
76 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
77 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
78 self.config = config
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
79 self.journaltag = journaltag
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
80 self.classes = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
81 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
82 self.lockfile = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
83 self._db = self.__open()
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
84 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
85 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
86
2603
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
87 self.stats = {'cache_hits': 0, 'cache_misses': 0, 'get_items': 0,
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
88 'filtering': 0}
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
89
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
90 os.umask(0002)
1131
92e92ae58494 add close() methods where they are missing!
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
91
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
92 def post_init(self):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
93 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
94 self.reindex()
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
95
1840
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1800
diff changeset
96 def refresh_database(self):
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1800
diff changeset
97 # XXX handle refresh
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1800
diff changeset
98 self.reindex()
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1800
diff changeset
99
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
100 def reindex(self):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
101 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
102 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
103 klass.index(nodeid)
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
104 self.indexer.save_index()
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
105
2082
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents: 2076
diff changeset
106 def getSessionManager(self):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents: 2076
diff changeset
107 return Sessions(self)
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents: 2076
diff changeset
108
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents: 2076
diff changeset
109 def getOTKManager(self):
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents: 2076
diff changeset
110 return OneTimeKeys(self)
c091cacdc505 Finished implementation of session and one-time-key stores for RDBMS backends.
Richard Jones <richard@users.sourceforge.net>
parents: 2076
diff changeset
111
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
112 # --- defined in ping's spec
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
113 def __getattr__(self, classname):
1800
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1780
diff changeset
114 if classname == 'transactions':
926
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
115 return self.dirty
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
116 # fall back on the classes
1990
18e08b0806cb fix to metakit from Brian Kelley
Richard Jones <richard@users.sourceforge.net>
parents: 1950
diff changeset
117 try:
18e08b0806cb fix to metakit from Brian Kelley
Richard Jones <richard@users.sourceforge.net>
parents: 1950
diff changeset
118 return self.getclass(classname)
18e08b0806cb fix to metakit from Brian Kelley
Richard Jones <richard@users.sourceforge.net>
parents: 1950
diff changeset
119 except KeyError, msg:
18e08b0806cb fix to metakit from Brian Kelley
Richard Jones <richard@users.sourceforge.net>
parents: 1950
diff changeset
120 # KeyError's not appropriate here
18e08b0806cb fix to metakit from Brian Kelley
Richard Jones <richard@users.sourceforge.net>
parents: 1950
diff changeset
121 raise AttributeError, str(msg)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
122 def getclass(self, classname):
1145
81941abedb0a nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents: 1143
diff changeset
123 try:
81941abedb0a nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents: 1143
diff changeset
124 return self.classes[classname]
81941abedb0a nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents: 1143
diff changeset
125 except KeyError:
81941abedb0a nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents: 1143
diff changeset
126 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
127 def getclasses(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
128 return self.classes.keys()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
129 # --- 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
130
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
131 # --- exposed methods
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
132 def commit(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
133 '''commit all changes to the database'''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
134 if self.dirty:
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
135 self._db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
136 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
137 cl._commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
138 self.indexer.save_index()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
139 self.dirty = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
140 def rollback(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
141 '''roll back all changes since the last commit'''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
142 if self.dirty:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
143 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
144 cl._rollback()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
145 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
146 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
147 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
148 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
149 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
150 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
151 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
152 self.dirty = 0
1232
c6a844d48176 Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1179
diff changeset
153 def clearCache(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
154 '''clear the internal cache by committing all pending database changes'''
1232
c6a844d48176 Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1179
diff changeset
155 for cl in self.classes.values():
c6a844d48176 Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1179
diff changeset
156 cl._commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
157 def clear(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
158 '''clear the internal cache but don't commit any changes'''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
159 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
160 cl._clear()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
161 def hasnode(self, classname, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
162 '''does a particular class contain a 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
163 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
164 def pack(self, pack_before):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
165 ''' Delete all journal entries except "create" before 'pack_before'.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
166 '''
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
167 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
168 i = 0
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
169 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
170 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
171 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
172 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
173 i = i + 1
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
174 def addclass(self, cl):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
175 ''' Add a Class to the hyperdatabase.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
176 '''
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
177 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
178 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
179 self.tables.append(name=cl.classname)
2076
2a4309450202 security fixes and doc updates
Richard Jones <richard@users.sourceforge.net>
parents: 2040
diff changeset
180
2a4309450202 security fixes and doc updates
Richard Jones <richard@users.sourceforge.net>
parents: 2040
diff changeset
181 # add default Edit and View permissions
2a4309450202 security fixes and doc updates
Richard Jones <richard@users.sourceforge.net>
parents: 2040
diff changeset
182 self.security.addPermission(name="Edit", klass=cl.classname,
2a4309450202 security fixes and doc updates
Richard Jones <richard@users.sourceforge.net>
parents: 2040
diff changeset
183 description="User is allowed to edit "+cl.classname)
2a4309450202 security fixes and doc updates
Richard Jones <richard@users.sourceforge.net>
parents: 2040
diff changeset
184 self.security.addPermission(name="View", klass=cl.classname,
2a4309450202 security fixes and doc updates
Richard Jones <richard@users.sourceforge.net>
parents: 2040
diff changeset
185 description="User is allowed to access "+cl.classname)
2a4309450202 security fixes and doc updates
Richard Jones <richard@users.sourceforge.net>
parents: 2040
diff changeset
186
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
187 def addjournal(self, tablenm, nodeid, action, params, creator=None,
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
188 creation=None):
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
189 ''' Journal the Action
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
190 'action' may be:
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
191
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
192 'create' or 'set' -- 'params' is a dictionary of property values
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
193 'link' or 'unlink' -- 'params' is (classname, nodeid, propname)
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
194 'retire' -- 'params' is None
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
195 '''
1179
9b013302c582 Remove some nasty debugging code.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1177
diff changeset
196 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
197 if tblid == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
198 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
199 if creator is None:
1912
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
200 creator = int(self.getuid())
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
201 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
202 try:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
203 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
204 except TypeError:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
205 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
206 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
207 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
208 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
209 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
210 # 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
211 self.hist.append(tableid=tblid,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
212 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
213 date=creation,
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
214 action=action,
2398
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
215 user=creator,
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
216 params=marshal.dumps(params))
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
217
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
218 def setjournal(self, tablenm, nodeid, journal):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
219 '''Set the journal to the "journal" list.'''
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
220 tblid = self.tables.find(name=tablenm)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
221 if tblid == -1:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
222 tblid = self.tables.append(name=tablenm)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
223 for nodeid, date, user, action, params in journal:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
224 # tableid:I,nodeid:I,date:I,user:I,action:I,params:B
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
225 self.hist.append(tableid=tblid,
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
226 nodeid=int(nodeid),
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
227 date=date,
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
228 action=action,
2398
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
229 user=int(user),
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
230 params=marshal.dumps(params))
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
231
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
232 def getjournal(self, tablenm, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
233 ''' get the journal for id
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
234 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
235 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
236 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
237 if tblid == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
238 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
239 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
240 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
241 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
242 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
243 #userclass = self.getclass('user')
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
244 for row in q:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
245 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
246 params = marshal.loads(row.params)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
247 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
248 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
249 params = {}
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
250 #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
251 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
252 #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
253 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
254 params))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
255 return rslt
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
256
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
257 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
258 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
259 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
260 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
261 return
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
262 i = 0
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
263 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
264 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
265 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
266 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
267 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
268 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
269 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
270
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
271 def close(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
272 ''' Close off the connection.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
273 '''
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
274 # de-reference count the metakit databases,
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
275 # as this is the only way they will be closed
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
276 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
277 cl.db = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
278 self._db = None
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
279 if self.lockfile is not None:
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
280 locking.release_lock(self.lockfile)
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
281 if _dbs.has_key(self.config.DATABASE):
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
282 del _dbs[self.config.DATABASE]
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
283 if self.lockfile is not None:
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
284 self.lockfile.close()
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
285 self.lockfile = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
286 self.classes = {}
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
287
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
288 # force the indexer to close
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
289 self.indexer.close()
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
290 self.indexer = None
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
291
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
292 # --- internal
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
293 def __open(self):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
294 ''' Open the metakit database
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
295 '''
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
296 # 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
297 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
298 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
299
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
300 # figure the file names
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
301 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
302 lockfilenm = db[:-3]+'lck'
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
303
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
304 # 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
305 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
306 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
307 self.lockfile.flush()
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
308
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
309 # 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
310 self.fastopen = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
311 if os.path.exists(db):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
312 dbtm = os.path.getmtime(db)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
313 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
314 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
315 if schemamod:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
316 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
317 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
318 if schematm < dbtm:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
319 # 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
320 self.fastopen = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
321 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
322 # 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
323 self.fastopen = 1
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
324
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
325 # open the db
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
326 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
327 hist = db.view('history')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
328 tables = db.view('tables')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
329 if not self.fastopen:
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
330 # 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
331 if not hist.structure():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
332 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
333 if not tables.structure():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
334 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
335 db.commit()
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
336
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
337 # 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
338 self.tables = tables
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
339 self.hist = hist
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
340 return db
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
341
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
342 def setid(self, classname, maxid):
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
343 ''' No-op in metakit
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
344 '''
2325
91a31cf8791a setid now works so import/export is now enabled in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2175
diff changeset
345 cls = self.getclass(classname)
91a31cf8791a setid now works so import/export is now enabled in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2175
diff changeset
346 cls.setid(int(maxid))
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
347
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
348 def numfiles(self):
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
349 '''Get number of files in storage, even across subdirectories.
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
350 '''
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
351 files_dir = os.path.join(self.config.DATABASE, 'files')
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
352 return files_in_dir(files_dir)
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
353
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
354 _STRINGTYPE = type('')
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
355 _LISTTYPE = type([])
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
356 _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
357
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
358 _actionnames = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
359 _CREATE : 'create',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
360 _SET : 'set',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
361 _RETIRE : 'retire',
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
362 _RESTORE : 'restore',
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
363 _LINK : 'link',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
364 _UNLINK : 'unlink',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
365 }
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
366
2398
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
367 _names_to_actionnames = {
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
368 'create': _CREATE,
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
369 'set': _SET,
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
370 'retire': _RETIRE,
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
371 'restore': _RESTORE,
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
372 'link': _LINK,
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
373 'unlink': _UNLINK,
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
374 }
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
375
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
376 _marker = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
377
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
378 _ALLOWSETTINGPRIVATEPROPS = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
379
1950
1eba6b6ca159 fix more metakit dumbness
Richard Jones <richard@users.sourceforge.net>
parents: 1920
diff changeset
380 class Class(hyperdb.Class):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
381 ''' The handle to a particular class of nodes in a hyperdatabase.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
382
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
383 All methods except __repr__ and getnode must be implemented by a
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
384 concrete backend Class of which this is one.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
385 '''
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
386
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
387 privateprops = None
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
388 def __init__(self, db, classname, **properties):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
389 if (properties.has_key('creation') or properties.has_key('activity')
2090
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
390 or properties.has_key('creator') or properties.has_key('actor')):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
391 raise ValueError, '"creation", "activity" and "creator" are '\
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
392 'reserved'
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
393 if hasattr(db, classname):
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
394 raise ValueError, "Class %s already exists"%classname
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
395
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
396 self.db = db
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
397 self.classname = classname
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
398 self.key = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
399 self.ruprops = properties
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
400 self.privateprops = { 'id' : hyperdb.String(),
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
401 'activity' : hyperdb.Date(),
2090
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
402 'actor' : hyperdb.Link('user'),
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
403 'creation' : hyperdb.Date(),
1176
bd3b57859c37 On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents: 1175
diff changeset
404 'creator' : hyperdb.Link('user') }
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
405
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
406 # event -> list of callables
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
407 self.auditors = {'create': [], 'set': [], 'retire': [], 'restore': []}
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
408 self.reactors = {'create': [], 'set': [], 'retire': [], 'restore': []}
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
409
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
410 view = self.__getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
411 self.maxid = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
412 if view:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
413 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
414 self.uncommitted = {}
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
415 self.comactions = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
416 self.rbactions = []
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
417
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
418 # people reach inside!!
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
419 self.properties = self.ruprops
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
420 self.db.addclass(self)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
421 self.idcache = {}
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
422
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
423 # 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
424 self.do_journal = 1
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
425
2325
91a31cf8791a setid now works so import/export is now enabled in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2175
diff changeset
426 def setid(self, maxid):
91a31cf8791a setid now works so import/export is now enabled in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2175
diff changeset
427 self.maxid = maxid + 1
91a31cf8791a setid now works so import/export is now enabled in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2175
diff changeset
428
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
429 def enableJournalling(self):
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
430 '''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
431 '''
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
432 self.do_journal = 1
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
433
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
434 def disableJournalling(self):
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
435 '''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
436 '''
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
437 self.do_journal = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
438
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
439 #
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
440 # Detector/reactor interface
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
441 #
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
442 def audit(self, event, detector):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
443 '''Register a detector
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
444 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
445 l = self.auditors[event]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
446 if detector not in l:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
447 self.auditors[event].append(detector)
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
448
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
449 def fireAuditors(self, action, nodeid, newvalues):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
450 '''Fire all registered auditors.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
451 '''
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
452 for audit in self.auditors[action]:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
453 audit(self.db, self, nodeid, newvalues)
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
454
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
455 def react(self, event, detector):
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
456 '''Register a reactor
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
457 '''
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
458 l = self.reactors[event]
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
459 if detector not in l:
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
460 self.reactors[event].append(detector)
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
461
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
462 def fireReactors(self, action, nodeid, oldvalues):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
463 '''Fire all registered reactors.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
464 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
465 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
466 react(self.db, self, nodeid, oldvalues)
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
467
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
468 # --- the hyperdb.Class methods
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
469 def create(self, **propvalues):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
470 ''' Create a new node of this class and return its id.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
471
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
472 The keyword arguments in 'propvalues' map property names to values.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
473
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
474 The values of arguments must be acceptable for the types of their
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
475 corresponding properties or a TypeError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
476
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
477 If this class has a key property, it must be present and its value
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
478 must not collide with other key strings or a ValueError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
479
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
480 Any other properties on this class that are missing from the
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
481 'propvalues' dictionary are set to None.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
482
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
483 If an id in a link or multilink property does not refer to a valid
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
484 node, an IndexError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
485 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
486 if not propvalues:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
487 raise ValueError, "Need something to create!"
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
488 self.fireAuditors('create', None, propvalues)
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
489 newid = self.create_inner(**propvalues)
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
490 self.fireReactors('create', newid, None)
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
491 return newid
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
492
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
493 def create_inner(self, **propvalues):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
494 ''' Called by create, in-between the audit and react calls.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
495 '''
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
496 rowdict = {}
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
497 rowdict['id'] = newid = self.maxid
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
498 self.maxid += 1
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
499 ndx = self.getview(READWRITE).append(rowdict)
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
500 propvalues['#ISNEW'] = 1
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
501 try:
2498
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
502 self.set_inner(str(newid), **propvalues)
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
503 except Exception:
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
504 self.maxid -= 1
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
505 raise
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
506 return str(newid)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
507
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
508 def get(self, nodeid, propname, default=_marker, cache=1):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
509 '''Get the value of a property on an existing node of this class.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
510
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
511 'nodeid' must be the id of an existing node of this class or an
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
512 IndexError is raised. 'propname' must be the name of a property
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
513 of this class or a KeyError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
514
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
515 'cache' exists for backwards compatibility, and is not used.
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1751
diff changeset
516 '''
1995
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
517 view = self.getview()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
518 id = int(nodeid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
519 if cache == 0:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
520 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
521 if oldnode and oldnode.has_key(propname):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
522 raw = oldnode[propname]
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
523 converter = _converters.get(rutyp.__class__, None)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
524 if converter:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
525 return converter(raw)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
526 return raw
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
527 ndx = self.idcache.get(id, None)
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
528
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
529 if ndx is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
530 ndx = view.find(id=id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
531 if ndx < 0:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
532 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
533 self.idcache[id] = ndx
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
534 try:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
535 raw = getattr(view[ndx], propname)
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
536 except AttributeError:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
537 raise KeyError, propname
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
538 rutyp = self.ruprops.get(propname, None)
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
539
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
540 if rutyp is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
541 rutyp = self.privateprops[propname]
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
542
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
543 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
544 if converter:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
545 raw = converter(raw)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
546 return raw
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
547
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
548 def set(self, nodeid, **propvalues):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
549 '''Modify a property on an existing node of this class.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
550
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
551 'nodeid' must be the id of an existing node of this class or an
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
552 IndexError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
553
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
554 Each key in 'propvalues' must be the name of a property of this
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
555 class or a KeyError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
556
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
557 All values in 'propvalues' must be acceptable types for their
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
558 corresponding properties or a TypeError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
559
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
560 If the value of the key property is set, it must not collide with
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
561 other key strings or a ValueError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
562
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
563 If the value of a Link or Multilink property contains an invalid
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
564 node id, a ValueError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
565 '''
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
566 self.fireAuditors('set', nodeid, propvalues)
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
567 propvalues, oldnode = self.set_inner(nodeid, **propvalues)
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
568 self.fireReactors('set', nodeid, oldnode)
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
569
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
570 def set_inner(self, nodeid, **propvalues):
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
571 '''Called outside of auditors'''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
572 isnew = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
573 if propvalues.has_key('#ISNEW'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
574 isnew = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
575 del propvalues['#ISNEW']
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
576
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
577 if propvalues.has_key('id'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
578 raise KeyError, '"id" is reserved'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
579 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
580 raise hyperdb.DatabaseError, 'Database open read-only'
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
581 view = self.getview(READWRITE)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
582
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
583 # 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
584 id = int(nodeid)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
585 ndx = view.find(id=id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
586 if ndx < 0:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
587 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
588 row = view[ndx]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
589 if row._isdel:
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
590 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
591 oldnode = self.uncommitted.setdefault(id, {})
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
592 changes = {}
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
593
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
594 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
595 # 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
596 # ... 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
597 # the writeable properties.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
598 if _ALLOWSETTINGPRIVATEPROPS:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
599 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
600 if not prop:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
601 prop = self.privateprops[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
602 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
603 prop = self.ruprops[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
604 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
605 # 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
606 # doing anything
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
607 oldvalue = converter(getattr(row, key))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
608 if value == oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
609 del propvalues[key]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
610 continue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
611
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
612 # check to make sure we're not duplicating an existing key
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
613 if key == self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
614 iv = self.getindexview(READWRITE)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
615 ndx = iv.find(k=value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
616 if ndx == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
617 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
618 if not isnew:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
619 ndx = iv.find(k=oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
620 if ndx > -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
621 iv.delete(ndx)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
622 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
623 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
624
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
625 # 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
626 if isinstance(prop, hyperdb.Link):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
627 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
628 # 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
629 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
630 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
631 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
632 # 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
633 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
634 value = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
635 # 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
636 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
637 int(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
638 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
639 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
640 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
641 except (TypeError, KeyError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
642 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
643 key, value, prop.classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
644
927
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
645 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
646 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
647 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
648
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
649 setattr(row, key, int(value))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
650 changes[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
651
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
652 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
653 # 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
654 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
655 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
656 (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
657
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
658 # 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
659 if value:
927
51519406b73e web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents: 926
diff changeset
660 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
661 (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
662
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
663 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
664 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
665 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
666 link_class = prop.classname
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
667 l = []
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
668 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
669 value = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
670 for entry in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
671 if type(entry) != _STRINGTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
672 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
673 'must be a string'%key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
674 # 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
675 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
676 int(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
677 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
678 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
679 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
680 except (TypeError, KeyError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
681 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
682 key, entry, prop.classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
683 l.append(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
684 propvalues[key] = value = l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
685
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
686 # handle removals
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
687 rmvd = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
688 for id in oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
689 if id not in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
690 rmvd.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
691 # 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
692 if self.do_journal and prop.do_journal:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
693 self.db.addjournal(link_class, id, _UNLINK,
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
694 (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
695
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
696 # handle additions
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
697 adds = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
698 for id in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
699 if id not in oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
700 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
701 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
702 link_class, id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
703 adds.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
704 # 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
705 if self.do_journal and prop.do_journal:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
706 self.db.addjournal(link_class, id, _LINK,
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
707 (self.classname, str(row.id), key))
1385
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
708
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
709 # 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
710 sv = getattr(row, key)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
711 i = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
712 while i < len(sv):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
713 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
714 sv.delete(i)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
715 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
716 i += 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
717 for id in adds:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
718 sv.append(fid=int(id))
1385
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
719
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
720 # figure the journal entry
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
721 l = []
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
722 if adds:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
723 l.append(('+', adds))
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
724 if rmvd:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
725 l.append(('-', rmvd))
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
726 if l:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
727 changes[key] = tuple(l)
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
728 #changes[key] = oldvalue
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
729
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
730 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
731 del propvalues[key]
1389
7f9bd5b1e798 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 1385
diff changeset
732
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
733 elif isinstance(prop, hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
734 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
735 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
736 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
737 value = ''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
738 setattr(row, key, value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
739 changes[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
740 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
741 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
742 if prop.indexme:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
743 self.db.indexer.add_text((self.classname, nodeid, key),
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
744 value, 'text/plain')
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
745
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
746 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
747 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
748 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
749 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
750 value = ''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
751 setattr(row, key, str(value))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
752 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
753 propvalues[key] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
754
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
755 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
756 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
757 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
758 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
759 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
760 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
761 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
762 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
763 propvalues[key] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
764
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
765 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
766 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
767 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
768 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
769 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
770 else:
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
771 # 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
772 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
773 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
774 propvalues[key] = str(value)
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
775
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
776 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
777 if value is None:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
778 v = 0
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
779 else:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
780 try:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
781 v = int(value)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
782 except ValueError:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
783 raise TypeError, "%s (%s) is not numeric"%(key, repr(value))
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
784 if not BACKWARDS_COMPATIBLE:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
785 if v >=0:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
786 v = v + 1
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
787 setattr(row, key, v)
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
788 changes[key] = oldvalue
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
789 propvalues[key] = value
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
790
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
791 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
792 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
793 bv = 0
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
794 elif value not in (0,1):
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
795 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
796 else:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
797 bv = value
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
798 if not BACKWARDS_COMPATIBLE:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
799 bv += 1
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
800 setattr(row, key, bv)
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
801 changes[key] = oldvalue
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
802 propvalues[key] = value
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
803
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
804 oldnode[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
805
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
806 # nothing to do?
2498
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
807 if not isnew and not propvalues:
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
808 return propvalues, oldnode
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
809 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
810 row.activity = int(time.time())
2090
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
811 if not propvalues.has_key('actor'):
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
812 row.actor = int(self.db.getuid())
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
813 if isnew:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
814 if not row.creation:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
815 row.creation = int(time.time())
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
816 if not row.creator:
1912
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
817 row.creator = int(self.db.getuid())
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
818
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
819 self.db.dirty = 1
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
820
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
821 if self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
822 if isnew:
2104
f376437cd35c more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2103
diff changeset
823 self.db.addjournal(self.classname, nodeid, _CREATE, {})
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
824 else:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
825 self.db.addjournal(self.classname, nodeid, _SET, changes)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
826
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
827 return propvalues, oldnode
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
828
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
829 def retire(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
830 '''Retire a node.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
831
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
832 The properties on the node remain available from the get() method,
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
833 and the node's id is never reused.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
834
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
835 Retired nodes are not returned by the find(), list(), or lookup()
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
836 methods, and other nodes may reuse the values of their key properties.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
837 '''
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
838 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
839 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
840 self.fireAuditors('retire', nodeid, None)
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
841 view = self.getview(READWRITE)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
842 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
843 if ndx < 0:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
844 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
845
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
846 row = view[ndx]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
847 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
848 oldval = oldvalues['_isdel'] = row._isdel
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
849 row._isdel = 1
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
850
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
851 if self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
852 self.db.addjournal(self.classname, nodeid, _RETIRE, {})
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
853 if self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
854 iv = self.getindexview(READWRITE)
1995
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
855 ndx = iv.find(k=getattr(row, self.key))
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
856 # find is broken with multiple attribute lookups
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
857 # on ordered views
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
858 #ndx = iv.find(k=getattr(row, self.key),i=row.id)
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
859 if ndx > -1 and iv[ndx].i == row.id:
926
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
860 iv.delete(ndx)
1995
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
861
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
862 self.db.dirty = 1
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
863 self.fireReactors('retire', nodeid, None)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
864
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
865 def restore(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
866 '''Restore a retired node.
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
867
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
868 Make node available for all operations like it was before retirement.
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
869 '''
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
870 if self.db.journaltag is None:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
871 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
872
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
873 # 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
874 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
875 keyvalue = self.get(nodeid, key)
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
876
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
877 try:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
878 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
879 except KeyError:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
880 pass
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
881 else:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
882 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
883 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
884 # Now we can safely restore node
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
885 self.fireAuditors('restore', nodeid, None)
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
886 view = self.getview(READWRITE)
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
887 ndx = view.find(id=int(nodeid))
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
888 if ndx < 0:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
889 raise KeyError, "nodeid %s not found" % nodeid
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
890
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
891 row = view[ndx]
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
892 oldvalues = self.uncommitted.setdefault(row.id, {})
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
893 oldval = oldvalues['_isdel'] = row._isdel
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
894 row._isdel = 0
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
895
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
896 if self.do_journal:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
897 self.db.addjournal(self.classname, nodeid, _RESTORE, {})
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
898 if self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
899 iv = self.getindexview(READWRITE)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
900 ndx = iv.find(k=getattr(row, self.key),i=row.id)
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
901 if ndx > -1:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
902 iv.delete(ndx)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
903 self.db.dirty = 1
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
904 self.fireReactors('restore', nodeid, None)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
905
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
906 def is_retired(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
907 '''Return true if the node is retired
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
908 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
909 view = self.getview(READWRITE)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
910 # 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
911 id = int(nodeid)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
912 ndx = view.find(id=id)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
913 if ndx < 0:
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
914 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
915 row = view[ndx]
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
916 return row._isdel
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
917
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
918 def history(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
919 '''Retrieve the journal of edits on a particular node.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
920
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
921 'nodeid' must be the id of an existing node of this class or an
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
922 IndexError is raised.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
923
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
924 The returned list contains tuples of the form
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
925
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
926 (nodeid, date, tag, action, params)
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
927
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
928 'date' is a Timestamp object specifying the time of the change and
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
929 'tag' is the journaltag specified when the database was opened.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
930 '''
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
931 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
932 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
933 return self.db.getjournal(self.classname, nodeid)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
934
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
935 def setkey(self, propname):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
936 '''Select a String property of this class to be the key property.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
937
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
938 'propname' must be the name of a String property of this class or
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
939 None, or a TypeError is raised. The values of the key property on
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
940 all existing nodes must be unique or a ValueError is raised.
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
941 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
942 if self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
943 if propname == self.key:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
944 return
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
945 else:
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
946 # drop the old key table
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
947 tablename = "_%s.%s"%(self.classname, self.key)
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
948 self.db._db.getas(tablename)
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
949
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
950 #raise ValueError, "%s already indexed on %s"%(self.classname,
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
951 # self.key)
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
952
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
953 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
954 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
955 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
956 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
957 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
958 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
959 raise TypeError, "%s is not a String" % propname
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
960
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
961 # the way he index on properties is by creating a
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
962 # table named _%(classname)s.%(key)s, if this table
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
963 # exists then everything is okay. If this table
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
964 # doesn't exist, then generate a new table on the
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
965 # key value.
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
966
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
967 # first setkey for this run or key has been changed
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
968 self.key = propname
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
969 tablename = "_%s.%s"%(self.classname, self.key)
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
970
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
971 iv = self.db._db.view(tablename)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
972 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
973 return
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
974
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
975 # very first setkey ever or the key has changed
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
976 self.db.dirty = 1
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
977 iv = self.db._db.getas('_%s[k:S,i:I]' % tablename)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
978 iv = iv.ordered(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
979 for row in self.getview():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
980 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
981 self.db.commit()
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
982
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
983 def getkey(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
984 '''Return the name of the key property for this class or None.'''
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
985 return self.key
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
986
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
987 def lookup(self, keyvalue):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
988 '''Locate a particular node by its key property and return its id.
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
989
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
990 If this class has no key property, a TypeError is raised. If the
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
991 keyvalue matches one of the values for the key property among
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
992 the nodes in this class, the matching node's id is returned;
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
993 otherwise a KeyError is raised.
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
994 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
995 if not self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
996 raise TypeError, 'No key property set for class %s'%self.classname
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
997
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
998 if type(keyvalue) is not _STRINGTYPE:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
999 raise TypeError, '%r is not a string'%keyvalue
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1000
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1001 # XXX FIX ME -> this is a bit convoluted
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1002 # First we search the index view to get the id
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1003 # which is a quicker look up.
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1004 # Then we lookup the row with id=id
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1005 # if the _isdel property of the row is 0, return the
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1006 # string version of the id. (Why string version???)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1007 #
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1008 # Otherwise, just lookup the non-indexed key
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1009 # in the non-index table and check the _isdel property
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1010 iv = self.getindexview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1011 if iv:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1012 # look up the index view for the id,
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1013 # then instead of looking up the keyvalue, lookup the
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1014 # quicker id
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1015 ndx = iv.find(k=keyvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1016 if ndx > -1:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1017 view = self.getview()
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1018 ndx = view.find(id=iv[ndx].i)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1019 if ndx > -1:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1020 row = view[ndx]
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1021 if not row._isdel:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1022 return str(row.id)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1023 else:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1024 # perform the slower query
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1025 view = self.getview()
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1026 ndx = view.find({self.key:keyvalue})
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1027 if ndx > -1:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1028 row = view[ndx]
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1029 if not row._isdel:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1030 return str(row.id)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1031
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1032 raise KeyError, keyvalue
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1033
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1034 def destroy(self, id):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1035 '''Destroy a node.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1036
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1037 WARNING: this method should never be used except in extremely rare
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1038 situations where there could never be links to the node being
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1039 deleted
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1040
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1041 WARNING: use retire() instead
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1042
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1043 WARNING: the properties of this node will not be available ever again
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1044
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1045 WARNING: really, use retire() instead
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1046
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1047 Well, I think that's enough warnings. This method exists mostly to
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1048 support the session storage of the cgi interface.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1049
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1050 The node is completely removed from the hyperdb, including all journal
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1051 entries. It will no longer be available, and will generally break code
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1052 if there are any references to the node.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1053 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1054 view = self.getview(READWRITE)
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1055 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
1056 if ndx > -1:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1057 if self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1058 keyvalue = getattr(view[ndx], self.key)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1059 iv = self.getindexview(READWRITE)
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1060 if iv:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1061 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
1062 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
1063 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
1064 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
1065 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
1066 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
1067
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1068 def find(self, **propspec):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1069 '''Get the ids of nodes in this class which link to the given nodes.
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1070
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1071 'propspec'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1072 consists of keyword args propname={nodeid:1,}
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1073 'propname'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1074 must be the name of a property in this class, or a
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1075 KeyError is raised. That property must be a Link or
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1076 Multilink property, or a TypeError is raised.
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1077
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1078 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
1079 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
1080 that "foo" occurs in msg1, msg3 and file7; so we have hits on these
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1081 issues::
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1082
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1083 db.issue.find(messages={'1':1,'3':1}, files={'7':1})
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1084 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1085 propspec = propspec.items()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1086 for propname, nodeid in propspec:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1087 # check the prop is OK
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1088 prop = self.ruprops[propname]
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1089 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
1090 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
1091 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
1092
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1093 vws = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1094 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
1095 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
1096 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
1097 elif ids is None:
e2a8ce4d2317 Class.find() may now find unset Links [SF#700620]
Richard Jones <richard@users.sourceforge.net>
parents: 1561
diff changeset
1098 ids = {0:1}
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1099 else:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1100 d = {}
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1101 for id in ids.keys():
1912
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1102 if id is None:
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1103 d[0] = 1
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1104 else:
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1105 d[int(id)] = 1
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1106 ids = d
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1107 prop = self.ruprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1108 view = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1109 if isinstance(prop, hyperdb.Multilink):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1110 def ff(row, nm=propname, ids=ids):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1111 if not row._isdel:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1112 sv = getattr(row, nm)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1113 for sr in sv:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1114 if ids.has_key(sr.fid):
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1115 return 1
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1116 return 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1117 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1118 def ff(row, nm=propname, ids=ids):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1119 return not row._isdel and 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
1120 ndxview = view.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1121 vws.append(ndxview.unique())
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1122
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1123 # handle the empty match case
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1124 if not vws:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1125 return []
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1126
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1127 ndxview = vws[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1128 for v in vws[1:]:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1129 ndxview = ndxview.union(v)
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1130 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
1131 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1132 for row in view:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1133 rslt.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1134 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1135
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 def list(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1138 ''' Return a list of the ids of the active nodes in this class.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1139 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1140 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1141 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
1142 l.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1143 return l
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1144
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1145 def getnodeids(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1146 ''' Retrieve all the ids of the nodes for a particular Class.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1147
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1148 Set retired=None to get all nodes. Otherwise it'll get all the
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1149 retired or non-retired nodes, depending on the flag.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1150 '''
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1151 l = []
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1152 for row in self.getview():
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1153 l.append(str(row.id))
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1154 return l
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1155
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1156 def count(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1157 return len(self.getview())
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1158
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1159 def getprops(self, protected=1):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1160 # 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
1161 allprops = self.ruprops.copy()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1162 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
1163 allprops.update(self.privateprops)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1164 return allprops
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1165
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1166 def addprop(self, **properties):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1167 for key in properties.keys():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1168 if self.ruprops.has_key(key):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1169 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
1170 self.classname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1171 self.ruprops.update(properties)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1172 # Class structure has changed
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1173 self.db.fastopen = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1174 view = self.__getview()
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1175 self.db.commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1176 # ---- end of ping's spec
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1177
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1243
diff changeset
1178 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
1179 group=(None,None)):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1180 '''Return a list of the ids of the active nodes in this class that
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1181 match the 'filter' spec, sorted by the group spec and then the
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1182 sort spec
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1183
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1184 "filterspec" is {propname: value(s)}
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1185
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1186 "sort" and "group" are (dir, prop) where dir is '+', '-' or None
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1187 and prop is a prop name or None
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1188
2362
10fc45eea226 fix SearchAction use of Class.filter(), and clarify API docs for same
Richard Jones <richard@users.sourceforge.net>
parents: 2325
diff changeset
1189 "search_matches" is {nodeid: marker} or None
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1190
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1191 The filter must match all properties specificed - but if the
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1192 property value to match is a list, any one of the values in the
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1193 list may match for that property to match.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1194 '''
2603
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1195 if __debug__:
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1196 start_t = time.time()
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1197
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1198 timezone = self.db.getUserTimezone()
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1199
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1200 where = {'_isdel':0}
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1201 wherehigh = {}
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1202 mlcriteria = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1203 regexes = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1204 orcriteria = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1205 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
1206 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
1207 if prop is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1208 prop = self.privateprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1209 if isinstance(prop, hyperdb.Multilink):
1561
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1210 if value in ('-1', ['-1']):
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1211 value = []
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1212 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
1213 value = [value]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1214 # transform keys to ids
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1215 u = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1216 for item in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1217 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1218 item = int(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1219 except (TypeError, ValueError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1220 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
1221 if item == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1222 item = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1223 u.append(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1224 mlcriteria[propname] = u
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1225 elif isinstance(prop, hyperdb.Link):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1226 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
1227 value = [value]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1228 # transform keys to ids
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1229 u = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1230 for item in value:
2603
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1231 if item is None:
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1232 item = -1
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1233 else:
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1234 try:
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1235 item = int(item)
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1236 except (TypeError, ValueError):
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1237 linkcl = self.db.getclass(prop.classname)
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1238 item = int(linkcl.lookup(item))
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1239 if item == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1240 item = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1241 u.append(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1242 if len(u) == 1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1243 where[propname] = u[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1244 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1245 orcriteria[propname] = u
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1246 elif isinstance(prop, hyperdb.String):
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1247 if type(value) is not type([]):
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1248 value = [value]
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1249 m = []
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1250 for v in value:
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1251 # simple glob searching
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1252 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
1253 v = v.replace('?', '.')
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1254 v = v.replace('*', '.*?')
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1255 m.append(v)
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1256 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
1257 elif propname == 'id':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1258 where[propname] = int(value)
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1259 elif isinstance(prop, hyperdb.Boolean):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1260 if type(value) is _STRINGTYPE:
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1261 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
1262 else:
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1263 bv = value
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1264 where[propname] = bv
1351
d1bfb479e527 fixed searching on date / interval fields [SF#658157]
Richard Jones <richard@users.sourceforge.net>
parents: 1333
diff changeset
1265 elif isinstance(prop, hyperdb.Date):
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1266 try:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1267 # 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
1268 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
1269 if date_rng.from_value:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1270 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
1271 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
1272 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1273 # 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
1274 # 'prop' property
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1275 where[propname] = 0
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1276 if date_rng.to_value:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1277 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
1278 wherehigh[propname] = int(calendar.timegm(t))
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1279 else:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1280 wherehigh[propname] = None
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1281 except ValueError:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1282 # 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
1283 pass
1351
d1bfb479e527 fixed searching on date / interval fields [SF#658157]
Richard Jones <richard@users.sourceforge.net>
parents: 1333
diff changeset
1284 elif isinstance(prop, hyperdb.Interval):
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1285 try:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1286 # 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
1287 date_rng = Range(value, date.Interval)
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1288 if date_rng.from_value:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1289 #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
1290 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
1291 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1292 # 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
1293 # 'prop' property
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1294 where[propname] = '-99999999999999'
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1295 if date_rng.to_value:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1296 #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
1297 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
1298 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1299 wherehigh[propname] = None
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1300 except ValueError:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1301 # 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
1302 pass
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1303 elif isinstance(prop, hyperdb.Number):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1304 where[propname] = int(value)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1305 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1306 where[propname] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1307 v = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1308 if where:
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1309 where_higherbound = where.copy()
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1310 where_higherbound.update(wherehigh)
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1311 v = v.select(where, where_higherbound)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1312
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1313 if mlcriteria:
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1314 # multilink - if any of the nodeids required by the
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1315 # 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
1316 def ff(row, ml=mlcriteria):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1317 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
1318 sv = getattr(row, propname)
2601
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1319 if not values and not sv:
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1320 return 1
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1321 for id in values:
2601
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1322 if sv.find(fid=id) != -1:
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1323 return 1
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1324 return 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1325 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1326 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1327
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1328 if orcriteria:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1329 def ff(row, crit=orcriteria):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1330 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
1331 val = getattr(row, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1332 if val not in allowed:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1333 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1334 return 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1335
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1336 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1337 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1338
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1339 if regexes:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1340 def ff(row, r=regexes):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1341 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
1342 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
1343 if not regex.search(val):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1344 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1345 return 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1346
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1347 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1348 v = v.remapwith(iv)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1349
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1350 if sort or group:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1351 sortspec = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1352 rev = []
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1353 for dir, propname in group, sort:
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1354 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
1355 isreversed = 0
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1356 if dir == '-':
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1357 isreversed = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1358 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1359 prop = getattr(v, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1360 except AttributeError:
926
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1361 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
1362 continue
926
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1363 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
1364 if propclass is None:
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1365 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
1366 if propclass is None:
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1367 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
1368 continue
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1369 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
1370 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
1371 lv = linkclass.getview()
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1372 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
1373 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
1374 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
1375 propname = 'order'
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1376 else:
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1377 propname = linkclass.labelprop()
3216c4f06ec4 Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 919
diff changeset
1378 prop = getattr(v, propname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1379 if isreversed:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1380 rev.append(prop)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1381 sortspec.append(prop)
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
1382 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
1383
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1384 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1385 for row in v:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1386 id = str(row.id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1387 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
1388 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
1389 rslt.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1390 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1391 rslt.append(id)
2603
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1392
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1393 if __debug__:
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1394 self.db.stats['filtering'] += (time.time() - start_t)
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1395
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1396 return rslt
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1397
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1398 def hasnode(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1399 '''Determine if the given nodeid actually exists
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1400 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1401 return int(nodeid) < self.maxid
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1402
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1403 def labelprop(self, default_to_id=0):
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1404 '''Return the property name for a label for the given node.
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1405
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1406 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
1407 It tries the following in order:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1408
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1409 1. key property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1410 2. "name" property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1411 3. "title" property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1995
diff changeset
1412 4. first property from the sorted property name list
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1413 '''
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1414 k = self.getkey()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1415 if k:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1416 return k
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1417 props = self.getprops()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1418 if props.has_key('name'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1419 return 'name'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1420 elif props.has_key('title'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1421 return 'title'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1422 if default_to_id:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1423 return 'id'
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1424 props = props.keys()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1425 props.sort()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1426 return props[0]
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1427
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1428 def stringFind(self, **requirements):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1429 '''Locate a particular node by matching a set of its String
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1430 properties in a caseless search.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1431
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1432 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
1433
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1434 The return is a list of the id of all nodes that match.
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1435 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1436 for propname in requirements.keys():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1437 prop = self.properties[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1438 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
1439 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
1440 requirements[propname] = requirements[propname].lower()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1441 requirements['_isdel'] = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1442
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1443 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1444 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
1445 l.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1446 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1447
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1448 def addjournal(self, nodeid, action, params):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1449 '''Add a journal to the given nodeid,
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1450 'action' may be:
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1451
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1452 'create' or 'set' -- 'params' is a dictionary of property values
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1453 'link' or 'unlink' -- 'params' is (classname, nodeid, propname)
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1454 'retire' -- 'params' is None
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1455 '''
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1456 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
1457
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1458 def index(self, nodeid):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1459 ''' 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
1460 # 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
1461 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
1462 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
1463 # 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
1464 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
1465 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
1466
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1467 # --- used by Database
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1468 def _commit(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1469 ''' called post commit of the DB.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1470 interested subclasses may override '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1471 self.uncommitted = {}
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1472 for action in self.comactions:
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1473 action()
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1474 self.comactions = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1475 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1476 self.idcache = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1477 def _rollback(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1478 ''' called pre rollback of the DB.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1479 interested subclasses may override '''
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1480 self.comactions = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1481 for action in self.rbactions:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1482 action()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1483 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1484 self.uncommitted = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1485 self.idcache = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1486 def _clear(self):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1487 view = self.getview(READWRITE)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1488 if len(view):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1489 view[:] = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1490 self.db.dirty = 1
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1491 iv = self.getindexview(READWRITE)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1492 if iv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1493 iv[:] = []
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1494 def commitaction(self, action):
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1495 ''' call this to register a callback called on commit
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1496 callback is removed on end of transaction '''
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1497 self.comactions.append(action)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1498 def rollbackaction(self, action):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1499 ''' call this to register a callback called on rollback
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1500 callback is removed on end of transaction '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1501 self.rbactions.append(action)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1502 # --- internal
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1503 def __getview(self):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1504 ''' 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
1505
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1506 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
1507 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
1508 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1509 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
1510 view = db.view(self.classname)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1511 mkprops = view.structure()
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1512
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1513 # 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
1514 # changed
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1515 # note on view.ordered ->
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1516 # return a metakit view ordered on the id column
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1517 # id is always the first column. This speeds up
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1518 # look-ups on the id column.
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1519
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1520 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
1521 return view.ordered(1)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1522
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1523 # is the definition the same?
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1524 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
1525 for mkprop in mkprops:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1526 if mkprop.name == nm:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1527 break
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1528 else:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1529 mkprop = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1530 if mkprop is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1531 break
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1532 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
1533 break
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1534 else:
2090
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
1535 # make sure we have the 'actor' property too
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
1536 for mkprop in mkprops:
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
1537 if mkprop.name == 'actor':
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
1538 return view.ordered(1)
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
1539
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1540 # The schema has changed. We need to create or restructure the mk view
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1541 # id comes first, so we can use view.ordered(1) so that
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1542 # MK will order it for us to allow binary-search quick lookups on
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1543 # the id column
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1544 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
1545 s = ["%s[id:I" % self.classname]
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1546
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1547 # these columns will always be added, we can't trample them :)
2090
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
1548 _columns = {"id":"I", "_isdel":"I", "activity":"I", "actor": "I",
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
1549 "creation":"I", "creator":"I"}
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1550
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1551 for nm, rutyp in self.ruprops.items():
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1552 mktyp = _typmap[rutyp.__class__].upper()
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1553 if nm in _columns and _columns[nm] != mktyp:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1554 # oops, two columns with the same name and different properties
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1555 raise MKBackendError("column %s for table %sis defined with multiple types"%(nm, self.classname))
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1556 _columns[nm] = mktyp
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1557 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
1558 if mktyp == 'V':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1559 s[-1] += ('[fid:I]')
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1560
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1561 # XXX FIX ME -> in some tests, creation:I becomes creation:S is this
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1562 # okay? Does this need to be supported?
2090
ad1ef1d9f5a1 This is my attempt to include the "actor" property in the metakit backend...
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
1563 s.append('_isdel:I,activity:I,actor:I,creation:I,creator:I]')
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1564 view = self.db._db.getas(','.join(s))
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1565 self.db.commit()
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1566 return view.ordered(1)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1567 def getview(self, RW=0):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1568 # XXX FIX ME -> The RW flag doesn't do anything.
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1569 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
1570 def getindexview(self, RW=0):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1571 # XXX FIX ME -> The RW flag doesn't do anything.
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
1572 tablename = "_%s.%s"%(self.classname, self.key)
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
1573 return self.db._db.view("_%s" % tablename).ordered(1)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1574
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1575 #
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1576 # import / export
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1577 #
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1578 def export_list(self, propnames, nodeid):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1579 ''' Export a node - generate a list of CSV-able data in the order
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1580 specified by propnames for the given node.
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1581 '''
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1582 properties = self.getprops()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1583 l = []
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1584 for prop in propnames:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1585 proptype = properties[prop]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1586 value = self.get(nodeid, prop)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1587 # "marshal" data where needed
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1588 if value is None:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1589 pass
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1590 elif isinstance(proptype, hyperdb.Date):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1591 value = value.get_tuple()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1592 elif isinstance(proptype, hyperdb.Interval):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1593 value = value.get_tuple()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1594 elif isinstance(proptype, hyperdb.Password):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1595 value = str(value)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1596 l.append(repr(value))
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1597
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1598 # append retired flag
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1599 l.append(repr(self.is_retired(nodeid)))
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1600
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1601 return l
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1602
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1603 def import_list(self, propnames, proplist):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1604 ''' Import a node - all information including "id" is present and
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1605 should not be sanity checked. Triggers are not triggered. The
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1606 journal should be initialised using the "creator" and "creation"
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1607 information.
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1608
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1609 Return the nodeid of the node imported.
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1610 '''
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1611 if self.db.journaltag is None:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1612 raise hyperdb.DatabaseError, 'Database open read-only'
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1613 properties = self.getprops()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1614
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1615 d = {}
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1616 view = self.getview(READWRITE)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1617 for i in range(len(propnames)):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1618 value = eval(proplist[i])
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1619 if not value:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1620 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1621
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1622 propname = propnames[i]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1623 if propname == 'id':
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1624 newid = value = int(value)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1625 elif propname == 'is retired':
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1626 # is the item retired?
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1627 if int(value):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1628 d['_isdel'] = 1
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1629 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1630 elif value is None:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1631 d[propname] = None
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1632 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1633
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1634 prop = properties[propname]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1635 if isinstance(prop, hyperdb.Date):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1636 value = int(calendar.timegm(value))
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1637 elif isinstance(prop, hyperdb.Interval):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1638 value = date.Interval(value).serialise()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1639 elif isinstance(prop, hyperdb.Number):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1640 value = int(value)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1641 elif isinstance(prop, hyperdb.Boolean):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1642 value = int(value)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1643 elif isinstance(prop, hyperdb.Link) and value:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1644 value = int(value)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1645 elif isinstance(prop, hyperdb.Multilink):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1646 # we handle multilinks separately
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1647 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1648 d[propname] = value
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1649
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1650 # possibly make a new node
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1651 if not d.has_key('id'):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1652 d['id'] = newid = self.maxid
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1653 self.maxid += 1
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1654
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1655 # save off the node
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1656 view.append(d)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1657
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1658 # fix up multilinks
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1659 ndx = view.find(id=newid)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1660 row = view[ndx]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1661 for i in range(len(propnames)):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1662 value = eval(proplist[i])
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1663 propname = propnames[i]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1664 if propname == 'is retired':
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1665 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1666 prop = properties[propname]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1667 if not isinstance(prop, hyperdb.Multilink):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1668 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1669 sv = getattr(row, propname)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1670 for entry in value:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1671 sv.append((int(entry),))
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1672
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1673 self.db.dirty = 1
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1674 return newid
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1675
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1676 def export_journals(self):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1677 '''Export a class's journal - generate a list of lists of
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1678 CSV-able data:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1679
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1680 nodeid, date, user, action, params
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1681
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1682 No heading here - the columns are fixed.
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1683 '''
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1684 properties = self.getprops()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1685 r = []
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1686 for nodeid in self.getnodeids():
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1687 for nodeid, date, user, action, params in self.history(nodeid):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1688 date = date.get_tuple()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1689 if action == 'set':
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1690 for propname, value in params.items():
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1691 prop = properties[propname]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1692 # make sure the params are eval()'able
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1693 if value is None:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1694 pass
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1695 elif isinstance(prop, Date):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1696 value = value.get_tuple()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1697 elif isinstance(prop, Interval):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1698 value = value.get_tuple()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1699 elif isinstance(prop, Password):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1700 value = str(value)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1701 params[propname] = value
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1702 l = [nodeid, date, user, action, params]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1703 r.append(map(repr, l))
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1704 return r
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1705
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1706 def import_journals(self, entries):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1707 '''Import a class's journal.
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1708
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1709 Uses setjournal() to set the journal for each item.'''
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1710 properties = self.getprops()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1711 d = {}
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1712 for l in entries:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1713 l = map(eval, l)
2398
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
1714 nodeid, jdate, user, action, params = l
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
1715 jdate = int(calendar.timegm(date.Date(jdate).get_tuple()))
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1716 r = d.setdefault(nodeid, [])
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1717 if action == 'set':
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1718 for propname, value in params.items():
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1719 prop = properties[propname]
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1720 if value is None:
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1721 pass
2446
4bab776d540d Importing journals was broken.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2398
diff changeset
1722 elif isinstance(prop, hyperdb.Date):
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1723 value = date.Date(value)
2446
4bab776d540d Importing journals was broken.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2398
diff changeset
1724 elif isinstance(prop, hyperdb.Interval):
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1725 value = date.Interval(value)
2446
4bab776d540d Importing journals was broken.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2398
diff changeset
1726 elif isinstance(prop, hyperdb.Password):
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1727 pwd = password.Password()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1728 pwd.unpack(value)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1729 value = pwd
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1730 params[propname] = value
2398
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
1731 action = _names_to_actionnames[action]
202701d52788 fixed anydbm & metakit import/export ([SF#965216], [SF#964457], [SF#964450])
Richard Jones <richard@users.sourceforge.net>
parents: 2362
diff changeset
1732 r.append((nodeid, jdate, user, action, params))
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1733
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1734 for nodeid, l in d.items():
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1735 self.db.setjournal(self.classname, nodeid, l)
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1736
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1737 def _fetchML(sv):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1738 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1739 for row in sv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1740 if row.fid:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1741 l.append(str(row.fid))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1742 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1743
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1744 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
1745 ''' 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
1746 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
1747 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1748 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
1749 return None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1750 p = password.Password()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1751 p.unpack(s)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1752 return p
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1753
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1754 def _fetchLink(n):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1755 ''' 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
1756 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1757 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
1758
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1759 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
1760 ''' 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
1761 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
1762 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1763 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
1764 return None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1765 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
1766
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1767 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
1768 ''' 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
1769 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
1770 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1771 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
1772 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
1773 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
1774
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1775 # Converters for boolean and numbers to properly
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1776 # return None values.
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1777 # These are in conjunction with the setters above
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1778 # look for hyperdb.Boolean and hyperdb.Number
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1779 if BACKWARDS_COMPATIBLE:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1780 def getBoolean(bool): return bool
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1781 def getNumber(number): return number
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1782 else:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1783 def getBoolean(bool):
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1784 if not bool: res = None
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1785 else: res = bool - 1
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1786 return res
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1787
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1788 def getNumber(number):
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1789 if number == 0: res = None
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1790 elif number < 0: res = number
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1791 else: res = number - 1
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1792 return res
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1793
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1794 _converters = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1795 hyperdb.Date : _fetchDate,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1796 hyperdb.Link : _fetchLink,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1797 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
1798 hyperdb.Interval : _fetchInterval,
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1799 hyperdb.Password : _fetchPW,
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1800 hyperdb.Boolean : getBoolean,
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1801 hyperdb.Number : getNumber,
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1802 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
1803 }
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1804
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1805 class FileName(hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1806 isfilename = 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1807
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1808 _typmap = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1809 FileName : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1810 hyperdb.String : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1811 hyperdb.Date : 'I',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1812 hyperdb.Link : 'I',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1813 hyperdb.Multilink : 'V',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1814 hyperdb.Interval : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1815 hyperdb.Password : 'S',
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1816 hyperdb.Boolean : 'I',
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1817 hyperdb.Number : 'I',
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1818 }
2597
c86b2179085b fix journal export of files to remove content from CSV files
Richard Jones <richard@users.sourceforge.net>
parents: 2512
diff changeset
1819 class FileClass(hyperdb.FileClass, Class):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1820 ''' like Class but with a content property
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1821 '''
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1822 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
1823 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
1824 properties['content'] = FileName()
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1825 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
1826 properties['type'] = hyperdb.String()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1827 Class.__init__(self, db, classname, **properties)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1828
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1829 def gen_filename(self, nodeid):
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1830 nm = '%s%s' % (self.classname, nodeid)
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1831 sd = str(int(int(nodeid) / 1000))
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1832 d = os.path.join(self.db.config.DATABASE, 'files', self.classname, sd)
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1833 if not os.path.exists(d):
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1834 os.makedirs(d)
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1835 return os.path.join(d, nm)
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1836
2498
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1837 def export_files(self, dirname, nodeid):
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1838 ''' Export the "content" property as a file, not csv column
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1839 '''
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1840 source = self.gen_filename(nodeid)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1841 x, filename = os.path.split(source)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1842 x, subdir = os.path.split(x)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1843 dest = os.path.join(dirname, self.classname+'-files', subdir, filename)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1844 if not os.path.exists(os.path.dirname(dest)):
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1845 os.makedirs(os.path.dirname(dest))
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1846 shutil.copyfile(source, dest)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1847
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1848 def import_files(self, dirname, nodeid):
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1849 ''' Import the "content" property as a file
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1850 '''
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1851 dest = self.gen_filename(nodeid)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1852 x, filename = os.path.split(dest)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1853 x, subdir = os.path.split(x)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1854 source = os.path.join(dirname, self.classname+'-files', subdir,
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1855 filename)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1856 if not os.path.exists(os.path.dirname(dest)):
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1857 os.makedirs(os.path.dirname(dest))
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1858 shutil.copyfile(source, dest)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1859
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1860 def get(self, nodeid, propname, default=_marker, cache=1):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1861 if propname == 'content':
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1862 poss_msg = 'Possibly an access right configuration problem.'
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1863 fnm = self.gen_filename(nodeid)
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1864 if not os.path.exists(fnm):
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1865 fnm = fnm + '.tmp'
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1866 try:
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1867 f = open(fnm, 'rb')
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1868 except IOError, (strerror):
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1869 # XXX by catching this we donot see an error in the log.
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1870 return 'ERROR reading file: %s%s\n%s\n%s'%(
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1871 self.classname, nodeid, poss_msg, strerror)
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1872 x = f.read()
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1873 f.close()
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1874 else:
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1875 x = Class.get(self, nodeid, propname, default)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1876 return x
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1877
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1878 def create(self, **propvalues):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1879 if not propvalues:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1880 raise ValueError, "Need something to create!"
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1881 self.fireAuditors('create', None, propvalues)
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1882
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1883 content = propvalues['content']
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1884 del propvalues['content']
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1885
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1886 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
1887 if not content:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1888 return newid
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1889
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1890 # figure a filename
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1891 nm = self.gen_filename(newid)
2502
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1892
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1893 # make sure we don't register the rename action more than once
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1894 if not os.path.exists(nm + '.tmp'):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1895 # register commit and rollback actions
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1896 def commit(fnm=nm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1897 os.rename(fnm + '.tmp', fnm)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1898 self.commitaction(commit)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1899 def undo(fnm=nm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1900 os.remove(fnm + '.tmp')
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1901 self.rollbackaction(undo)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1902
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1903 # save the tempfile
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1904 f = open(nm + '.tmp', 'wb')
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1905 f.write(content)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1906 f.close()
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1907
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1908 mimetype = propvalues.get('type', self.default_mime_type)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1909 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
1910 mimetype)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1911 return newid
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1912
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1913 def set(self, itemid, **propvalues):
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1914 if not propvalues:
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1915 return
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1916 self.fireAuditors('set', None, propvalues)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1917
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1918 content = propvalues.get('content', None)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1919 if content is not None:
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1920 del propvalues['content']
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1921
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1922 propvalues, oldnode = Class.set_inner(self, itemid, **propvalues)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1923
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1924 # figure a filename
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1925 if content is not None:
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1926 nm = self.gen_filename(itemid)
2502
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1927
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1928 # make sure we don't register the rename action more than once
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1929 if not os.path.exists(nm + '.tmp'):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1930 # register commit and rollback actions
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1931 def commit(fnm=nm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1932 if os.path.exists(fnm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1933 os.remove(fnm)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1934 os.rename(fnm + '.tmp', fnm)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1935 self.commitaction(commit)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1936 def undo(fnm=nm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1937 os.remove(fnm + '.tmp')
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1938 self.rollbackaction(undo)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1939
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1940 f = open(nm + '.tmp', 'wb')
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1941 f.write(content)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1942 f.close()
2502
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1943
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1944 mimetype = propvalues.get('type', self.default_mime_type)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1945 self.db.indexer.add_text((self.classname, itemid, 'content'),
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1946 content, mimetype)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1947
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1948 self.fireReactors('set', oldnode, propvalues)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1949
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1950 def index(self, nodeid):
2505
bdd112cf61ba rdbms backend full text search failure after import [SF#980314]
Richard Jones <richard@users.sourceforge.net>
parents: 2502
diff changeset
1951 '''Add (or refresh) the node to search indexes.
bdd112cf61ba rdbms backend full text search failure after import [SF#980314]
Richard Jones <richard@users.sourceforge.net>
parents: 2502
diff changeset
1952
bdd112cf61ba rdbms backend full text search failure after import [SF#980314]
Richard Jones <richard@users.sourceforge.net>
parents: 2502
diff changeset
1953 Pass on the content-type property for the content property.
bdd112cf61ba rdbms backend full text search failure after import [SF#980314]
Richard Jones <richard@users.sourceforge.net>
parents: 2502
diff changeset
1954 '''
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1955 Class.index(self, nodeid)
2512
f5542d92307a fix anydbm journal import [SF#983166]
Richard Jones <richard@users.sourceforge.net>
parents: 2505
diff changeset
1956 try:
f5542d92307a fix anydbm journal import [SF#983166]
Richard Jones <richard@users.sourceforge.net>
parents: 2505
diff changeset
1957 mime_type = self.get(nodeid, 'type', self.default_mime_type)
f5542d92307a fix anydbm journal import [SF#983166]
Richard Jones <richard@users.sourceforge.net>
parents: 2505
diff changeset
1958 except KeyError:
f5542d92307a fix anydbm journal import [SF#983166]
Richard Jones <richard@users.sourceforge.net>
parents: 2505
diff changeset
1959 mime_type = self.default_mime_type
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1960 self.db.indexer.add_text((self.classname, nodeid, 'content'),
2512
f5542d92307a fix anydbm journal import [SF#983166]
Richard Jones <richard@users.sourceforge.net>
parents: 2505
diff changeset
1961 str(self.get(nodeid, 'content')), mime_type)
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1962
859
eb924e614934 Fixes for the metakit backend
Richard Jones <richard@users.sourceforge.net>
parents: 854
diff changeset
1963 class IssueClass(Class, roundupdb.IssueClass):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1964 ''' 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
1965 "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
1966 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
1967 "creation" or "activity" property, a ValueError is raised.
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1968 '''
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1969 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
1970 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
1971 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
1972 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
1973 properties['messages'] = hyperdb.Multilink("msg")
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1974 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
1975 properties['files'] = hyperdb.Multilink("file")
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1976 if not properties.has_key('nosy'):
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1977 # note: journalling is turned off as it really just wastes
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1978 # space. this behaviour may be overridden in an instance
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
1979 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
1980 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
1981 properties['superseder'] = hyperdb.Multilink(classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1982 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
1983
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1984 CURVERSION = 2
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1985
2089
93f03c6714d8 A few big changes in this commit:
Richard Jones <richard@users.sourceforge.net>
parents: 2082
diff changeset
1986 class Indexer(Indexer):
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1987 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
1988 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
1989 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
1990 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
1991 self.datadb = datadb
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1992 self.reindex = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1993 v = self.db.view('version')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1994 if not v.structure():
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1995 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
1996 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1997 v.append(vers=CURVERSION)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1998 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1999 elif v[0].vers != CURVERSION:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2000 v[0].vers = CURVERSION
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2001 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2002 if self.reindex:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2003 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
2004 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
2005 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2006 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2007 self.changed = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2008 self.propcache = {}
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2009
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2010 def close(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2011 '''close the indexing database'''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2012 del self.db
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2013 self.db = None
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2014
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2015 def force_reindex(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2016 '''Force a reindexing of the database. This essentially
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2017 empties the tables ids and index and sets a flag so
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2018 that the databases are reindexed'''
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2019 v = self.db.view('ids')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2020 v[:] = []
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2021 v = self.db.view('index')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2022 v[:] = []
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2023 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2024 self.reindex = 1
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2025
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2026 def should_reindex(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2027 '''returns True if the indexes need to be rebuilt'''
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2028 return self.reindex
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2029
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2030 def _getprops(self, classname):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2031 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
2032 if props is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2033 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
2034 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
2035 self.propcache[classname] = props
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2036 return props
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2037
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2038 def _getpropid(self, classname, propname):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2039 return self._getprops(classname).index(propname)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2040
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2041 def _getpropname(self, classname, propid):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2042 return self._getprops(classname)[propid]
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
2043
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2044 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
2045 if mime_type != 'text/plain':
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2046 return
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2047 classname, nodeid, property = identifier
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2048 tbls = self.datadb.view('tables')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2049 tblid = tbls.find(name=classname)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2050 if tblid < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2051 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
2052 nodeid = int(nodeid)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2053 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
2054 ids = self.db.view('ids')
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2055 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
2056 if oldpos > -1:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2057 ids[oldpos].ignore = 1
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2058 self.changed = 1
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2059 pos = ids.append(tblid=tblid,nodeid=nodeid,propid=propid)
2093
3f6024ab2c7a That's the last of the RDBMS migration steps done! Yay!
Richard Jones <richard@users.sourceforge.net>
parents: 2091
diff changeset
2060
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2061 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
2062 words = {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2063 for word in wordlist:
2093
3f6024ab2c7a That's the last of the RDBMS migration steps done! Yay!
Richard Jones <richard@users.sourceforge.net>
parents: 2091
diff changeset
2064 if not self.disallows.has_key(word):
3f6024ab2c7a That's the last of the RDBMS migration steps done! Yay!
Richard Jones <richard@users.sourceforge.net>
parents: 2091
diff changeset
2065 words[word] = 1
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2066 words = words.keys()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2067
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2068 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
2069 for word in words:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2070 ndx = index.find(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2071 if ndx < 0:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2072 index.append(word=word)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2073 ndx = index.find(word=word)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2074 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
2075 self.changed = 1
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
2076
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2077 def find(self, wordlist):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2078 '''look up all the words in the wordlist.
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2079 If none are found return an empty dictionary
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2080 * more rules here
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2081 '''
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2082 hits = None
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2083 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
2084 for word in wordlist:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2085 word = word.upper()
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2086 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
2087 continue
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2088 ndx = index.find(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2089 if ndx < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2090 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2091 if hits is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2092 hits = index[ndx].hits
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2093 else:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2094 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
2095 if len(hits) == 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2096 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2097 if hits is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2098 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2099 rslt = {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2100 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
2101 tbls = self.datadb.view('tables')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2102 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
2103 hit = ids[i]
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2104 if not hit.ignore:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2105 classname = tbls[hit.tblid].name
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2106 nodeid = str(hit.nodeid)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2107 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
2108 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
2109 return rslt
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2110
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2111 def save_index(self):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2112 if self.changed:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2113 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2114 self.changed = 0
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2115
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2116 def rollback(self):
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2117 if self.changed:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2118 self.db.rollback()
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2119 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
2120 self.changed = 0
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2121

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