annotate roundup/backends/back_metakit.py @ 3634:57c66056ffe4

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

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