annotate roundup/backends/back_metakit.py @ 3854:f4e8dc583256

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

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