annotate roundup/backends/back_metakit.py @ 3489:87e512f87bae

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

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