annotate roundup/backends/back_metakit.py @ 3878:6d14a3b4e295

allow admin to specify port and local hostname for SMTP connections
author Justus Pendleton <jpend@users.sourceforge.net>
date Sun, 02 Sep 2007 05:54:46 +0000
parents 34128a809e22
children 603ec9630b08
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3872
34128a809e22 Allow multilinks to take None (treated as an empty list).
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3869
diff changeset
1 # $Id: back_metakit.py,v 1.117 2007-08-31 15:44:02 jpend 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):
3872
34128a809e22 Allow multilinks to take None (treated as an empty list).
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3869
diff changeset
650 if value is None:
34128a809e22 Allow multilinks to take None (treated as an empty list).
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3869
diff changeset
651 value = []
3869
16faac822fe5 Allow Multilinks to take any iterable
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3827
diff changeset
652 if not hasattr(value, '__iter__'):
16faac822fe5 Allow Multilinks to take any iterable
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3827
diff changeset
653 raise TypeError, 'new property "%s" not an iterable of ids'%key
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
654 link_class = prop.classname
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
655 l = []
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
656 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
657 value = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
658 for entry in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
659 if type(entry) != _STRINGTYPE:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
660 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
661 'must be a string'%key
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
662 # 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
663 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
664 int(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
665 except ValueError:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
666 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
667 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
668 except (TypeError, KeyError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
669 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
670 key, entry, prop.classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
671 l.append(entry)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
672 propvalues[key] = value = l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
673
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
674 # handle removals
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
675 rmvd = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
676 for id in oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
677 if id not in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
678 rmvd.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
679 # 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
680 if self.do_journal and prop.do_journal:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
681 self.db.addjournal(link_class, id, _UNLINK,
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
682 (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
683
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
684 # handle additions
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
685 adds = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
686 for id in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
687 if id not in oldvalue:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
688 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
689 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
690 link_class, id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
691 adds.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
692 # 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
693 if self.do_journal and prop.do_journal:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
694 self.db.addjournal(link_class, id, _LINK,
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
695 (self.classname, str(row.id), key))
1385
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
696
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
697 # 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
698 sv = getattr(row, key)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
699 i = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
700 while i < len(sv):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
701 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
702 sv.delete(i)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
703 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
704 i += 1
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
705 for id in adds:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
706 sv.append(fid=int(id))
1385
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
707
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
708 # figure the journal entry
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
709 l = []
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
710 if adds:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
711 l.append(('+', adds))
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
712 if rmvd:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
713 l.append(('-', rmvd))
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
714 if l:
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
715 changes[key] = tuple(l)
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
716 #changes[key] = oldvalue
2bd4822f96a6 - more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents: 1351
diff changeset
717
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
718 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
719 del propvalues[key]
1389
7f9bd5b1e798 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 1385
diff changeset
720
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
721 elif isinstance(prop, hyperdb.String):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
722 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
723 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
724 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
725 value = ''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
726 setattr(row, key, value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
727 changes[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
728 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
729 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
730 if prop.indexme:
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
731 self.db.indexer.add_text((self.classname, nodeid, key),
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
732 value, 'text/plain')
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
733
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
734 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
735 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
736 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
737 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
738 value = ''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
739 setattr(row, key, str(value))
3826
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
740 if oldvalue is None:
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
741 changes[key] = oldvalue
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
742 else:
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
743 changes[key] = str(oldvalue)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
744 propvalues[key] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
745
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
746 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
747 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
748 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
749 if value is None:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
750 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
751 else:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
752 setattr(row, key, int(calendar.timegm(value.get_tuple())))
3151
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3147
diff changeset
753 if oldvalue is None:
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3147
diff changeset
754 changes[key] = oldvalue
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3147
diff changeset
755 else:
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3147
diff changeset
756 changes[key] = str(oldvalue)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
757 propvalues[key] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
758
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
759 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
760 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
761 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
762 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
763 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
764 else:
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
765 # 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
766 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
767 changes[key] = str(oldvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
768 propvalues[key] = str(value)
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
769
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
770 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
771 if value is None:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
772 v = 0
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
773 else:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
774 try:
2713
f5ae28302619 column type for Number changed from Integer to Double...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2712
diff changeset
775 v = float(value)
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
776 except ValueError:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
777 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
778 if not BACKWARDS_COMPATIBLE:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
779 if v >=0:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
780 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
781 setattr(row, key, v)
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
782 changes[key] = oldvalue
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
783 propvalues[key] = value
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
784
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
785 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
786 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
787 bv = 0
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
788 elif value not in (0,1):
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
789 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
790 else:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
791 bv = value
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
792 if not BACKWARDS_COMPATIBLE:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
793 bv += 1
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
794 setattr(row, key, bv)
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
795 changes[key] = oldvalue
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
796 propvalues[key] = value
820
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 oldnode[key] = oldvalue
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
799
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
800 # 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
801 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
802 return propvalues, oldnode
874
b9da8729d8ff Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 872
diff changeset
803 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
804 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
805 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
806 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
807 if isnew:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
808 if not row.creation:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
809 row.creation = int(time.time())
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
810 if not row.creator:
1912
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
811 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
812
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
813 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
814
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
815 if self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
816 if isnew:
2104
f376437cd35c more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2103
diff changeset
817 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
818 else:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
819 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
820
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
821 return propvalues, oldnode
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
822
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
823 def retire(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
824 '''Retire a node.
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
825
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
826 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
827 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
828
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
829 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
830 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
831 '''
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
832 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
833 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
834 self.fireAuditors('retire', nodeid, None)
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
835 view = self.getview(READWRITE)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
836 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
837 if ndx < 0:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
838 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
839
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
840 row = view[ndx]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
841 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
842 oldval = oldvalues['_isdel'] = row._isdel
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
843 row._isdel = 1
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
844
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
845 if self.do_journal:
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
846 self.db.addjournal(self.classname, nodeid, _RETIRE, {})
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
847 if self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
848 iv = self.getindexview(READWRITE)
1995
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
849 ndx = iv.find(k=getattr(row, self.key))
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
850 # find is broken with multiple attribute lookups
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
851 # on ordered views
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
852 #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
853 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
854 iv.delete(ndx)
1995
b7c9867aca19 Changed to 1.56
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1994
diff changeset
855
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
856 self.db.dirty = 1
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
857 self.fireReactors('retire', nodeid, None)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
858
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
859 def restore(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
860 '''Restore a retired node.
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
861
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
862 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
863 '''
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
864 if self.db.journaltag is None:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
865 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
866
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
867 # 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
868 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
869 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
870
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
871 try:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
872 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
873 except KeyError:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
874 pass
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
875 else:
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1519
diff changeset
876 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
877 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
878 # Now we can safely restore node
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
879 self.fireAuditors('restore', nodeid, None)
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
880 view = self.getview(READWRITE)
1519
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
881 ndx = view.find(id=int(nodeid))
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
882 if ndx < 0:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
883 raise KeyError, "nodeid %s not found" % nodeid
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
884
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
885 row = view[ndx]
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
886 oldvalues = self.uncommitted.setdefault(row.id, {})
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
887 oldval = oldvalues['_isdel'] = row._isdel
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
888 row._isdel = 0
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
889
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
890 if self.do_journal:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
891 self.db.addjournal(self.classname, nodeid, _RESTORE, {})
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
892 if self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
893 iv = self.getindexview(READWRITE)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
894 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
895 if ndx > -1:
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
896 iv.delete(ndx)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
897 self.db.dirty = 1
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
898 self.fireReactors('restore', nodeid, None)
6fede2aa6a12 added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1508
diff changeset
899
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
900 def is_retired(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
901 '''Return true if the node is retired
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
902 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
903 view = self.getview(READWRITE)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
904 # 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
905 id = int(nodeid)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
906 ndx = view.find(id=id)
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
907 if ndx < 0:
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
908 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
909 row = view[ndx]
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
910 return row._isdel
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
911
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
912 def history(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
913 '''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
914
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
915 '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
916 IndexError is raised.
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 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
919
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
920 (nodeid, date, tag, action, params)
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
921
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
922 '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
923 '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
924 '''
860
2df32a73eb45 Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents: 859
diff changeset
925 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
926 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
927 return self.db.getjournal(self.classname, nodeid)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
928
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
929 def setkey(self, propname):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
930 '''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
931
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
932 '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
933 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
934 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
935 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
936 if self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
937 if propname == self.key:
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
938 return
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
939 else:
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
940 # 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
941 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
942 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
943
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
944 #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
945 # self.key)
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
946
1177
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.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
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 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
950 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
951 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
952 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
953 raise TypeError, "%s is not a String" % propname
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
954
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
955 # 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
956 # 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
957 # 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
958 # 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
959 # key value.
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
960
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
961 # 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
962 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
963 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
964
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
965 iv = self.db._db.view(tablename)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
966 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
967 return
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
968
2040
db66443e1463 A classes key can now be changed in the metakit backend.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2039
diff changeset
969 # 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
970 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
971 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
972 iv = iv.ordered(1)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
973 for row in self.getview():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
974 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
975 self.db.commit()
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
976
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
977 def getkey(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
978 '''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
979 return self.key
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
980
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
981 def lookup(self, keyvalue):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
982 '''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
983
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
984 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
985 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
986 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
987 otherwise a KeyError is raised.
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
988 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
989 if not self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
990 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
991
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
992 if type(keyvalue) is not _STRINGTYPE:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
993 raise TypeError, '%r is not a string'%keyvalue
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
995 # XXX FIX ME -> this is a bit convoluted
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
996 # 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
997 # which is a quicker look up.
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
998 # Then we lookup the row with id=id
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
999 # 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
1000 # string version of the id. (Why string version???)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1001 #
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1002 # Otherwise, just lookup the non-indexed key
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1003 # 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
1004 iv = self.getindexview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1005 if iv:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1006 # look up the index view for the id,
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1007 # then instead of looking up the keyvalue, lookup the
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1008 # quicker id
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1009 ndx = iv.find(k=keyvalue)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1010 if ndx > -1:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1011 view = self.getview()
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1012 ndx = view.find(id=iv[ndx].i)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1013 if ndx > -1:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1014 row = view[ndx]
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1015 if not row._isdel:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1016 return str(row.id)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1017 else:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1018 # perform the slower query
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1019 view = self.getview()
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1020 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
1021 if ndx > -1:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1022 row = view[ndx]
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1023 if not row._isdel:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1024 return str(row.id)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1025
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1026 raise KeyError, keyvalue
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
1027
1177
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1028 def destroy(self, id):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1029 '''Destroy a node.
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1030
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1031 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
1032 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
1033 deleted
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: use retire() instead
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: 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
1038
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1039 WARNING: really, use retire() instead
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1040
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1041 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
1042 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
1043
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1044 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
1045 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
1046 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
1047 '''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1048 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
1049 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
1050 if ndx > -1:
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1051 if self.key:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1052 keyvalue = getattr(view[ndx], self.key)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1053 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
1054 if iv:
24a1a5de1203 Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1176
diff changeset
1055 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
1056 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
1057 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
1058 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
1059 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
1060 self.db.dirty = 1
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1061
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1062 def find(self, **propspec):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1063 '''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
1064
3239
440f0a6a2e3c merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3155
diff changeset
1065 'propspec' consists of keyword args propname=nodeid or
440f0a6a2e3c merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3155
diff changeset
1066 propname={nodeid:1, }
440f0a6a2e3c merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3155
diff changeset
1067 '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
1068 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
1069 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
1070
3239
440f0a6a2e3c merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3155
diff changeset
1071 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
1072 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
1073
3239
440f0a6a2e3c merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3155
diff changeset
1074 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
1075 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
1076 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1077 propspec = propspec.items()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1078 for propname, nodeid in propspec:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1079 # check the prop is OK
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1080 prop = self.ruprops[propname]
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1081 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
1082 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
1083 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
1084
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1085 vws = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1086 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
1087 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
1088 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
1089 elif ids is None:
e2a8ce4d2317 Class.find() may now find unset Links [SF#700620]
Richard Jones <richard@users.sourceforge.net>
parents: 1561
diff changeset
1090 ids = {0:1}
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1091 else:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1092 d = {}
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1093 for id in ids.keys():
1912
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1094 if id is None:
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1095 d[0] = 1
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1096 else:
2b0ab61db194 fixes for [SF#818339]
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1097 d[int(id)] = 1
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1098 ids = d
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1099 prop = self.ruprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1100 view = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1101 if isinstance(prop, hyperdb.Multilink):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1102 def ff(row, nm=propname, ids=ids):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1103 if not row._isdel:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1104 sv = getattr(row, nm)
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1105 for sr in sv:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1106 if ids.has_key(sr.fid):
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1107 return 1
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1108 return 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1109 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1110 def ff(row, nm=propname, ids=ids):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1111 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
1112 ndxview = view.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1113 vws.append(ndxview.unique())
854
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1114
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1115 # handle the empty match case
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1116 if not vws:
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1117 return []
3cdfa5d86cec Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents: 832
diff changeset
1118
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1119 ndxview = vws[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1120 for v in vws[1:]:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1121 ndxview = ndxview.union(v)
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
1122 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
1123 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1124 for row in view:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1125 rslt.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1126 return rslt
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1127
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1128
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1129 def list(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1130 ''' 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
1131 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1132 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1133 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
1134 l.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1135 return l
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1136
3486
34ada15b9936 all backends implement the retired check in getnodeids [SF#1290560]
Richard Jones <richard@users.sourceforge.net>
parents: 3476
diff changeset
1137 def getnodeids(self, retired=None):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1138 ''' 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
1139
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1140 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
1141 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
1142 '''
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1143 l = []
3486
34ada15b9936 all backends implement the retired check in getnodeids [SF#1290560]
Richard Jones <richard@users.sourceforge.net>
parents: 3476
diff changeset
1144 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
1145 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
1146 else:
34ada15b9936 all backends implement the retired check in getnodeids [SF#1290560]
Richard Jones <richard@users.sourceforge.net>
parents: 3476
diff changeset
1147 result = self.getview()
34ada15b9936 all backends implement the retired check in getnodeids [SF#1290560]
Richard Jones <richard@users.sourceforge.net>
parents: 3476
diff changeset
1148 for row in result:
1484
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1149 l.append(str(row.id))
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1150 return l
b3f2484babce fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents: 1476
diff changeset
1151
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1152 def count(self):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1153 return len(self.getview())
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1154
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1155 def getprops(self, protected=1):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1156 # 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
1157 allprops = self.ruprops.copy()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1158 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
1159 allprops.update(self.privateprops)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1160 return allprops
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1161
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1162 def addprop(self, **properties):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1163 for key in properties.keys():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1164 if self.ruprops.has_key(key):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1165 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
1166 self.classname)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1167 self.ruprops.update(properties)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1168 # Class structure has changed
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1169 self.db.fastopen = 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1170 view = self.__getview()
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1171 self.db.commit()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1172 # ---- end of ping's spec
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1173
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1174 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
1175 '''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
1176 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
1177 sort spec
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 "filterspec" is {propname: value(s)}
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1180
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1181 "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
1182 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
1183
2362
10fc45eea226 fix SearchAction use of Class.filter(), and clarify API docs for same
Richard Jones <richard@users.sourceforge.net>
parents: 2325
diff changeset
1184 "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
1185
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1186 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
1187 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
1188 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
1189 '''
2603
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1190 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
1191 start_t = time.time()
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1192
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1193 where = {'_isdel':0}
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1194 wherehigh = {}
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1195 mlcriteria = {}
3147
dbf80d7db63f consistent text searching behaviour (AND everywhere) [SF#1101036]
Richard Jones <richard@users.sourceforge.net>
parents: 3095
diff changeset
1196 regexes = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1197 orcriteria = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1198 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
1199 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
1200 if prop is None:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1201 prop = self.privateprops[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1202 if isinstance(prop, hyperdb.Multilink):
1561
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1203 if value in ('-1', ['-1']):
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1204 value = []
cf5a5357a7ea match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1205 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
1206 value = [value]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1207 # transform keys to ids
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1208 u = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1209 for item in value:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1210 try:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1211 item = int(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1212 except (TypeError, ValueError):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1213 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
1214 if item == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1215 item = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1216 u.append(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1217 mlcriteria[propname] = u
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1218 elif isinstance(prop, hyperdb.Link):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1219 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
1220 value = [value]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1221 # transform keys to ids
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1222 u = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1223 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
1224 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
1225 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
1226 else:
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1227 try:
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1228 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
1229 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
1230 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
1231 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
1232 if item == -1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1233 item = 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1234 u.append(item)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1235 if len(u) == 1:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1236 where[propname] = u[0]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1237 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1238 orcriteria[propname] = u
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1239 elif isinstance(prop, hyperdb.String):
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1240 if type(value) is not type([]):
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1241 value = [value]
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1242 for v in value:
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1243 # simple glob searching
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1244 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
1245 v = v.replace('?', '.')
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1596
diff changeset
1246 v = v.replace('*', '.*?')
3147
dbf80d7db63f consistent text searching behaviour (AND everywhere) [SF#1101036]
Richard Jones <richard@users.sourceforge.net>
parents: 3095
diff changeset
1247 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
1248 elif propname == 'id':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1249 where[propname] = int(value)
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1250 elif isinstance(prop, hyperdb.Boolean):
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1251 if type(value) is _STRINGTYPE:
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1252 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
1253 else:
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1254 bv = value
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1255 where[propname] = bv
1351
d1bfb479e527 fixed searching on date / interval fields [SF#658157]
Richard Jones <richard@users.sourceforge.net>
parents: 1333
diff changeset
1256 elif isinstance(prop, hyperdb.Date):
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1257 try:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1258 # Try to filter on range of dates
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3365
diff changeset
1259 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
1260 if date_rng.from_value:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1261 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
1262 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
1263 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1264 # 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
1265 # 'prop' property
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1266 where[propname] = 0
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1267 if date_rng.to_value:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1268 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
1269 wherehigh[propname] = int(calendar.timegm(t))
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1270 else:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1271 wherehigh[propname] = None
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1272 except ValueError:
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1273 # 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
1274 pass
1351
d1bfb479e527 fixed searching on date / interval fields [SF#658157]
Richard Jones <richard@users.sourceforge.net>
parents: 1333
diff changeset
1275 elif isinstance(prop, hyperdb.Interval):
1596
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1276 try:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1277 # 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
1278 date_rng = Range(value, date.Interval)
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1279 if date_rng.from_value:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1280 #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
1281 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
1282 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1283 # 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
1284 # 'prop' property
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1285 where[propname] = '-99999999999999'
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1286 if date_rng.to_value:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1287 #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
1288 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
1289 else:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1290 wherehigh[propname] = None
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1291 except ValueError:
33a0d94c7658 searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1563
diff changeset
1292 # 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
1293 pass
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1294 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
1295 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
1296 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
1297 else:
f5ae28302619 column type for Number changed from Integer to Double...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2712
diff changeset
1298 where[propname] = float(value)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1299 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1300 where[propname] = str(value)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1301 v = self.getview()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1302 if where:
1508
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1303 where_higherbound = where.copy()
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1304 where_higherbound.update(wherehigh)
5c58ccad41ee Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1496
diff changeset
1305 v = v.select(where, where_higherbound)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1306
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1307 if mlcriteria:
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1308 # multilink - if any of the nodeids required by the
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1309 # 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
1310 def ff(row, ml=mlcriteria):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1311 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
1312 sv = getattr(row, propname)
2601
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1313 if not values and not sv:
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1314 return 1
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1315 for id in values:
2601
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1316 if sv.find(fid=id) != -1:
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1317 return 1
113548baeed2 API clarification.
Richard Jones <richard@users.sourceforge.net>
parents: 2597
diff changeset
1318 return 0
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1319 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1320 v = v.remapwith(iv)
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1321
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1322 if orcriteria:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1323 def ff(row, crit=orcriteria):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1324 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
1325 val = getattr(row, propname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1326 if val not in allowed:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1327 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1328 return 1
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1329
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1330 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1331 v = v.remapwith(iv)
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1332
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1333 if regexes:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1334 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
1335 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
1336 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
1337 if not regex.search(val):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1338 return 0
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1339 return 1
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1340
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1341 iv = v.filter(ff)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1342 v = v.remapwith(iv)
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1343
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1344 # 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
1345 # 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
1346 # 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
1347 # 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
1348 # 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
1349 # we do it backwards.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1350 sortspec = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1351 rev = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1352 sa = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1353 if proptree:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1354 sa = reversed(proptree.sortattr)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1355 for pt in sa:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1356 if pt.parent != proptree:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1357 break;
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1358 propname = pt.name
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1359 dir = pt.sort_direction
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1360 assert (dir and propname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1361 isreversed = 0
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1362 if dir == '-':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1363 isreversed = 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1364 try:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1365 prop = getattr(v, propname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1366 except AttributeError:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1367 logging.getLogger("hyperdb").error(
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1368 "MK has no property %s" % propname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1369 continue
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1370 propclass = self.ruprops.get(propname, None)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1371 if propclass is None:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1372 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
1373 if propclass is None:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1374 logging.getLogger("hyperdb").error(
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1375 "Schema has no property %s" % propname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1376 continue
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1377 # 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
1378 # 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
1379 # 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
1380 # 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
1381 # broken because natural-joining to the Link-class can
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1382 # produce name-clashes wich result in broken sorting.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1383 if isinstance(propclass, hyperdb.Link):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1384 linkclass = self.db.getclass(propclass.classname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1385 lv = linkclass.getview()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1386 lv = lv.rename('id', propname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1387 v = v.join(lv, prop, 1)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1388 prop = getattr(v, linkclass.orderprop())
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1389 if isreversed:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1390 rev.append(prop)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1391 sortspec.append(prop)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1392 pt.sort_done = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1393 sortspec.reverse()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1394 rev.reverse()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3679
diff changeset
1395 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
1396
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1397 rslt = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1398 for row in v:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1399 id = str(row.id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1400 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
1401 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
1402 rslt.append(id)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1403 else:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1404 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
1405
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2601
diff changeset
1406 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
1407 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
1408
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1409 return rslt
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1410
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1411 def hasnode(self, nodeid):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1412 '''Determine if the given nodeid actually exists
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1413 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1414 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
1415
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1416 def stringFind(self, **requirements):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1417 '''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
1418 properties in a caseless search.
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1419
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1420 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
1421
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1422 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
1423 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1424 for propname in requirements.keys():
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1425 prop = self.properties[propname]
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1426 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
1427 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
1428 requirements[propname] = requirements[propname].lower()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1429 requirements['_isdel'] = 0
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1430
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1431 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1432 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
1433 l.append(str(row.id))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1434 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1435
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1436 def addjournal(self, nodeid, action, params):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1437 '''Add a journal to the given nodeid,
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1438 'action' may be:
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1439
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1440 '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
1441 '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
1442 'retire' -- 'params' is None
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1443 '''
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1444 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
1445
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1446 def index(self, nodeid):
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1447 ''' 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
1448 # 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
1449 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
1450 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
1451 # 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
1452 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
1453 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
1454
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1455 # --- used by Database
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1456 def _commit(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1457 ''' called post commit of the DB.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1458 interested subclasses may override '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1459 self.uncommitted = {}
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1460 for action in self.comactions:
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1461 action()
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1462 self.comactions = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1463 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1464 self.idcache = {}
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1465 def _rollback(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1466 ''' called pre rollback of the DB.
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1467 interested subclasses may override '''
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1468 self.comactions = []
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1469 for action in self.rbactions:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1470 action()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1471 self.rbactions = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1472 self.uncommitted = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1473 self.idcache = {}
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1474 def _clear(self):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1475 view = self.getview(READWRITE)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1476 if len(view):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1477 view[:] = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1478 self.db.dirty = 1
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1479 iv = self.getindexview(READWRITE)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1480 if iv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1481 iv[:] = []
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1482 def commitaction(self, action):
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1483 ''' call this to register a callback called on commit
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1484 callback is removed on end of transaction '''
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1485 self.comactions.append(action)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1486 def rollbackaction(self, action):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
1487 ''' 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
1488 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
1489 self.rbactions.append(action)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1490 # --- internal
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1491 def __getview(self):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1492 ''' 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
1493
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1494 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
1495 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
1496 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1497 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
1498 view = db.view(self.classname)
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1499 mkprops = view.structure()
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1500
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1501 # 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
1502 # changed
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1503 # note on view.ordered ->
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1504 # return a metakit view ordered on the id column
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1505 # id is always the first column. This speeds up
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1506 # 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
1507
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1508 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
1509 return view.ordered(1)
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1510
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1511 # is the definition the same?
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1512 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
1513 for mkprop in mkprops:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1514 if mkprop.name == nm:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1515 break
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1516 else:
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1517 mkprop = None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1518 if mkprop is None:
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 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
1521 break
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1522 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
1523 # 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
1524 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
1525 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
1526 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
1527
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1528 # 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
1529 # 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
1530 # 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
1531 # the id column
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1532 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
1533 s = ["%s[id:I" % self.classname]
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1534
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1535 # 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
1536 _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
1537 "creation":"I", "creator":"I"}
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1538
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1539 for nm, rutyp in self.ruprops.items():
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1540 mktyp = _typmap[rutyp.__class__].upper()
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1541 if nm in _columns and _columns[nm] != mktyp:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1542 # 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
1543 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
1544 _columns[nm] = mktyp
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1545 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
1546 if mktyp == 'V':
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1547 s[-1] += ('[fid:I]')
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1548
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1549 # 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
1550 # 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
1551 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
1552 view = self.db._db.getas(','.join(s))
872
bd6211d39328 Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 860
diff changeset
1553 self.db.commit()
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1554 return view.ordered(1)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1555 def getview(self, RW=0):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1556 # 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
1557 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
1558 def getindexview(self, RW=0):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1559 # 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
1560 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
1561 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
1562
2175
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 # import / export
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1565 #
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1566 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
1567 ''' 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
1568 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
1569 '''
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1570 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
1571 l = []
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1572 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
1573 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
1574 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
1575 # "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
1576 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
1577 pass
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.Date):
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.Interval):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1581 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
1582 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
1583 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
1584 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
1585
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1586 # 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
1587 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
1588
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1589 return l
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1590
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1591 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
1592 ''' 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
1593 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
1594 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
1595 information.
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 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
1598 '''
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1599 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
1600 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
1601 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
1602
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1603 d = {}
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1604 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
1605 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
1606 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
1607 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
1608 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1609
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1610 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
1611 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
1612 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
1613 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
1614 # 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
1615 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
1616 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
1617 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1618 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
1619 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
1620 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1621
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1622 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
1623 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
1624 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
1625 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
1626 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
1627 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
1628 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
1629 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
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.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
1632 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
1633 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
1634 # 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
1635 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1636 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
1637
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1638 # 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
1639 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
1640 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
1641 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
1642
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1643 # 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
1644 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
1645
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1646 # 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
1647 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
1648 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
1649 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
1650 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
1651 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
1652 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
1653 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1654 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
1655 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
1656 continue
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1657 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
1658 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
1659 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
1660
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1661 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
1662 return newid
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1663
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1664 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
1665 '''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
1666 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
1667
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1668 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
1669
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1670 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
1671 '''
3348
35def80077ba fix metakit. backport candidate
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 3295
diff changeset
1672 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
1673 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
1674 r = []
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1675 for nodeid in self.getnodeids():
3826
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
1676 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
1677 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
1678 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
1679 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
1680 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
1681 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
1682 # 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
1683 continue
e2d65f6c8d83 handle dropped properies in rdbms/metakit journal export [SF#1203569]
Richard Jones <richard@users.sourceforge.net>
parents: 3348
diff changeset
1684
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1685 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
1686 # 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
1687 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
1688 pass
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1689 elif isinstance(prop, Date):
3826
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
1690 if isinstance(value, str):
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
1691 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
1692 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
1693 elif isinstance(prop, Interval):
3826
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
1694 if isinstance(value, str):
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
1695 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
1696 value = value.get_tuple()
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1697 elif isinstance(prop, Password):
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1698 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
1699 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
1700 params = export_data
3826
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
1701 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
1702 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
1703 return r
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1704
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1705 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
1706 '''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
1707
2175
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1708 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
1709 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
1710 d = {}
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1711 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
1712 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
1713 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
1714 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
1715 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
1716 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
1717 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
1718 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
1719 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
1720 pass
2446
4bab776d540d Importing journals was broken.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2398
diff changeset
1721 elif isinstance(prop, hyperdb.Date):
3826
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
1722 value = str(date.Date(value))
2446
4bab776d540d Importing journals was broken.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2398
diff changeset
1723 elif isinstance(prop, hyperdb.Interval):
3827
5e21117e38b2 coding-style fix.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3826
diff changeset
1724 value = str(date.Interval(value))
2446
4bab776d540d Importing journals was broken.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2398
diff changeset
1725 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
1726 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
1727 pwd.unpack(value)
3826
bf2e9535da00 Journal and database testing.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
1728 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
1729 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
1730 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
1731 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
1732
723098a10677 Export and import now include journals (incompatible with export < 0.7)
Richard Jones <richard@users.sourceforge.net>
parents: 2104
diff changeset
1733 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
1734 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
1735
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1736 def _fetchML(sv):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1737 l = []
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1738 for row in sv:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1739 if row.fid:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1740 l.append(str(row.fid))
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1741 return l
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1742
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1743 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
1744 ''' 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
1745 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
1746 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1747 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
1748 return None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1749 p = password.Password()
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1750 p.unpack(s)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1751 return p
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1752
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1753 def _fetchLink(n):
1476
5a01e90b7dc9 fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
1754 ''' 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
1755 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1756 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
1757
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1758 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
1759 ''' 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
1760 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
1761 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1762 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
1763 return None
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1764 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
1765
1392
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1766 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
1767 ''' 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
1768 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
1769 '''
083cce7840aa Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents: 1389
diff changeset
1770 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
1771 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
1772 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
1773
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1774 # Converters for boolean and numbers to properly
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1775 # return None values.
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1776 # These are in conjunction with the setters above
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1777 # look for hyperdb.Boolean and hyperdb.Number
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1778 if BACKWARDS_COMPATIBLE:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1779 def getBoolean(bool): return bool
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1780 def getNumber(number): return number
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1781 else:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1782 def getBoolean(bool):
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1783 if not bool: res = None
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1784 else: res = bool - 1
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1785 return res
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1786
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1787 def getNumber(number):
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1788 if number == 0: res = None
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1789 elif number < 0: res = number
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1790 else: res = number - 1
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1791 return res
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1792
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1793 _converters = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1794 hyperdb.Date : _fetchDate,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1795 hyperdb.Link : _fetchLink,
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1796 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
1797 hyperdb.Interval : _fetchInterval,
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1798 hyperdb.Password : _fetchPW,
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1799 hyperdb.Boolean : getBoolean,
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1800 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
1801 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
1802 }
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1803
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1804 class FileName(hyperdb.String):
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
1805 isfilename = 1
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1806
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1807 _typmap = {
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1808 FileName : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1809 hyperdb.String : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1810 hyperdb.Date : 'I',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1811 hyperdb.Link : 'I',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1812 hyperdb.Multilink : 'V',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1813 hyperdb.Interval : 'S',
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1814 hyperdb.Password : 'S',
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 874
diff changeset
1815 hyperdb.Boolean : 'I',
2713
f5ae28302619 column type for Number changed from Integer to Double...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2712
diff changeset
1816 hyperdb.Number : 'D',
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1817 }
2597
c86b2179085b fix journal export of files to remove content from CSV files
Richard Jones <richard@users.sourceforge.net>
parents: 2512
diff changeset
1818 class FileClass(hyperdb.FileClass, Class):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1819 ''' like Class but with a content property
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1820 '''
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1821 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
1822 '''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
1823 and "type" properties.
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1824 '''
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1825 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
1826 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
1827 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
1828 properties['type'] = hyperdb.String()
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1829 Class.__init__(self, db, classname, **properties)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1830
2091
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1831 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
1832 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
1833 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
1834 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
1835 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
1836 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
1837 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
1838
2498
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1839 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
1840 ''' 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
1841 '''
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1842 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
1843 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
1844 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
1845 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
1846 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
1847 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
1848 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
1849
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1850 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
1851 ''' 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
1852 '''
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1853 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
1854 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
1855 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
1856 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
1857 filename)
f9709e575cf4 export now stores file "content" in separate files in export directory
Richard Jones <richard@users.sourceforge.net>
parents: 2446
diff changeset
1858 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
1859 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
1860 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
1861
3679
e761981cde25 missed a couple of indexme checks
Richard Jones <richard@users.sourceforge.net>
parents: 3674
diff changeset
1862 if self.properties['content'].indexme:
e761981cde25 missed a couple of indexme checks
Richard Jones <richard@users.sourceforge.net>
parents: 3674
diff changeset
1863 return
e761981cde25 missed a couple of indexme checks
Richard Jones <richard@users.sourceforge.net>
parents: 3674
diff changeset
1864
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3520
diff changeset
1865 mime_type = None
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3520
diff changeset
1866 if self.getprops().has_key('type'):
3545
507b2df02956 fixes to import_files
Richard Jones <richard@users.sourceforge.net>
parents: 3544
diff changeset
1867 mime_type = self.get(nodeid, 'type')
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3520
diff changeset
1868 if not mime_type:
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3520
diff changeset
1869 mime_type = self.default_mime_type
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3520
diff changeset
1870 self.db.indexer.add_text((self.classname, nodeid, 'content'),
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3520
diff changeset
1871 self.get(nodeid, 'content'), mime_type)
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3520
diff changeset
1872
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1873 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
1874 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
1875 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
1876 fnm = self.gen_filename(nodeid)
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1877 if not os.path.exists(fnm):
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1878 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
1879 try:
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1880 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
1881 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
1882 # 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
1883 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
1884 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
1885 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
1886 f.close()
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1887 else:
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1888 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
1889 return x
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1890
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1891 def create(self, **propvalues):
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1892 if not propvalues:
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
1893 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
1894 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
1895
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1896 content = propvalues['content']
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1897 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
1898
1431
c70068162e64 Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1899 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
1900 if not content:
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1901 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
1902
0e6db4462896 Part-way to having the metakit backend handle "content" property changes.
Richard Jones <richard@users.sourceforge.net>
parents: 2090
diff changeset
1903 # 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
1904 nm = self.gen_filename(newid)
2502
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1905
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1906 # 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
1907 if not os.path.exists(nm + '.tmp'):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1908 # register commit and rollback actions
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1909 def commit(fnm=nm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1910 os.rename(fnm + '.tmp', fnm)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1911 self.commitaction(commit)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1912 def undo(fnm=nm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1913 os.remove(fnm + '.tmp')
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1914 self.rollbackaction(undo)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1915
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1916 # save the tempfile
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1917 f = open(nm + '.tmp', 'wb')
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1918 f.write(content)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1919 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
1920
3679
e761981cde25 missed a couple of indexme checks
Richard Jones <richard@users.sourceforge.net>
parents: 3674
diff changeset
1921 if not self.properties['content'].indexme:
e761981cde25 missed a couple of indexme checks
Richard Jones <richard@users.sourceforge.net>
parents: 3674
diff changeset
1922 return newid
e761981cde25 missed a couple of indexme checks
Richard Jones <richard@users.sourceforge.net>
parents: 3674
diff changeset
1923
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1924 mimetype = propvalues.get('type', self.default_mime_type)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1925 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
1926 mimetype)
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1927 return newid
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1928
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1929 def set(self, itemid, **propvalues):
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1930 if not propvalues:
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1931 return
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1932 self.fireAuditors('set', None, propvalues)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1933
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1934 content = propvalues.get('content', None)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1935 if content is not None:
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1936 del propvalues['content']
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 propvalues, oldnode = Class.set_inner(self, itemid, **propvalues)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1939
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1940 # figure a filename
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1941 if content is not None:
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1942 nm = self.gen_filename(itemid)
2502
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1943
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1944 # 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
1945 if not os.path.exists(nm + '.tmp'):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1946 # register commit and rollback actions
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1947 def commit(fnm=nm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1948 if os.path.exists(fnm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1949 os.remove(fnm)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1950 os.rename(fnm + '.tmp', fnm)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1951 self.commitaction(commit)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1952 def undo(fnm=nm):
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1953 os.remove(fnm + '.tmp')
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1954 self.rollbackaction(undo)
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1955
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1956 f = open(nm + '.tmp', 'wb')
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1957 f.write(content)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1958 f.close()
2502
222ec8915b42 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2498
diff changeset
1959
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1960 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
1961 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
1962 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
1963 content, mimetype)
2103
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1964
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1965 self.fireReactors('set', oldnode, propvalues)
8c6c0d40f9c8 more metakit fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
1966
831
9a4aa0b107de Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 822
diff changeset
1967 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
1968 ''' 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
1969
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1970 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
1971 '''
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1972 # 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
1973 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
1974 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
1975 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
1976 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
1977 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
1978 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
1979 # 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
1980 try:
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1981 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
1982 except IndexError:
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1983 # node has been destroyed
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1984 continue
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3554
diff changeset
1985 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
1986
859
eb924e614934 Fixes for the metakit backend
Richard Jones <richard@users.sourceforge.net>
parents: 854
diff changeset
1987 class IssueClass(Class, roundupdb.IssueClass):
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1988 ''' 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
1989 "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
1990 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
1991 "creation" or "activity" property, a ValueError is raised.
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1992 '''
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1993 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
1994 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
1995 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
1996 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
1997 properties['messages'] = hyperdb.Multilink("msg")
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('files'):
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1999 properties['files'] = hyperdb.Multilink("file")
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
2000 if not properties.has_key('nosy'):
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
2001 # note: journalling is turned off as it really just wastes
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
2002 # space. this behaviour may be overridden in an instance
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 930
diff changeset
2003 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
2004 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
2005 properties['superseder'] = hyperdb.Multilink(classname)
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
2006 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
2007
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2008 CURVERSION = 2
820
d75ce81534db Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
2009
3674
a023442e691c Make most of the regression tests for metakit run again.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
2010 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
2011 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
2012 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
2013 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
2014 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
2015 self.datadb = db._db
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2016 self.reindex = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2017 v = self.db.view('version')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2018 if not v.structure():
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2019 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
2020 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2021 v.append(vers=CURVERSION)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2022 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2023 elif v[0].vers != CURVERSION:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2024 v[0].vers = CURVERSION
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2025 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2026 if self.reindex:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2027 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
2028 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
2029 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2030 self.reindex = 1
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2031 self.changed = 0
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2032 self.propcache = {}
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2033
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2034 def close(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2035 '''close the indexing database'''
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2036 del self.db
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2037 self.db = None
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
2038
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2039 def force_reindex(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2040 '''Force a reindexing of the database. This essentially
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2041 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
2042 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
2043 v = self.db.view('ids')
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 v = self.db.view('index')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2046 v[:] = []
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2047 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2048 self.reindex = 1
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2049
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2050 def should_reindex(self):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2051 '''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
2052 return self.reindex
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2053
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2054 def _getprops(self, classname):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2055 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
2056 if props is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2057 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
2058 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
2059 self.propcache[classname] = props
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2060 return props
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2061
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2062 def _getpropid(self, classname, propname):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2063 return self._getprops(classname).index(propname)
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2064
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2065 def _getpropname(self, classname, propid):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2066 return self._getprops(classname)[propid]
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
2067
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2068 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
2069 if mime_type != 'text/plain':
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2070 return
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2071 classname, nodeid, property = identifier
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2072 tbls = self.datadb.view('tables')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2073 tblid = tbls.find(name=classname)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2074 if tblid < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2075 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
2076 nodeid = int(nodeid)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2077 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
2078 ids = self.db.view('ids')
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2079 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
2080 if oldpos > -1:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2081 ids[oldpos].ignore = 1
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2082 self.changed = 1
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2083 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
2084
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2085 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
2086 words = {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2087 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
2088 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
2089 words[word] = 1
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2090 words = words.keys()
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
2091
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2092 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
2093 for word in words:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2094 ndx = index.find(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2095 if ndx < 0:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2096 index.append(word=word)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2097 ndx = index.find(word=word)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2098 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
2099 self.changed = 1
1143
Richard Jones <richard@users.sourceforge.net>
parents: 1131
diff changeset
2100
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2101 def find(self, wordlist):
2039
4b0b365317f7 Added __doc__ strings to back_metakit.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 2005
diff changeset
2102 '''look up all the words in the wordlist.
1994
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2103 If none are found return an empty dictionary
bd82a76c48ff Many database-interface improvements.
Brian Kelley <wc2so1@users.sourceforge.net>
parents: 1990
diff changeset
2104 * more rules here
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
2105 '''
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2106 hits = None
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2107 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
2108 for word in wordlist:
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2109 word = word.upper()
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2110 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
2111 continue
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2112 ndx = index.find(word=word)
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2113 if ndx < 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2114 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2115 if hits is None:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2116 hits = index[ndx].hits
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2117 else:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2118 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
2119 if len(hits) == 0:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2120 return {}
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2121 if hits is None:
3095
a588dab13664 Update metakit indexer:
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2825
diff changeset
2122 return []
a588dab13664 Update metakit indexer:
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2825
diff changeset
2123 rslt = []
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2124 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
2125 tbls = self.datadb.view('tables')
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2126 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
2127 hit = ids[i]
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2128 if not hit.ignore:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2129 classname = tbls[hit.tblid].name
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2130 nodeid = str(hit.nodeid)
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2131 property = self._getpropname(classname, hit.propid)
3095
a588dab13664 Update metakit indexer:
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2825
diff changeset
2132 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
2133 return rslt
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2134
892
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2135 def save_index(self):
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2136 if self.changed:
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2137 self.db.commit()
44eb237a8b3e An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 880
diff changeset
2138 self.changed = 0
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2139
1243
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2140 def rollback(self):
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2141 if self.changed:
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2142 self.db.rollback()
3a028d2f7830 Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 1232
diff changeset
2143 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
2144 self.changed = 0
1333
80d27b7d6db5 implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2145
3295
a615cc230160 added Xapian indexer; replaces standard indexers if Xapian is available
Richard Jones <richard@users.sourceforge.net>
parents: 3239
diff changeset
2146 try:
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3520
diff changeset
2147 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
2148 except ImportError:
a615cc230160 added Xapian indexer; replaces standard indexers if Xapian is available
Richard Jones <richard@users.sourceforge.net>
parents: 3239
diff changeset
2149 Indexer = MetakitIndexer
a615cc230160 added Xapian indexer; replaces standard indexers if Xapian is available
Richard Jones <richard@users.sourceforge.net>
parents: 3239
diff changeset
2150
2711
6b18005c3bb4 addclass(): variable 'cn' (class name) was not initialized.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2650
diff changeset
2151 # vim: set et sts=4 sw=4 :

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