Mercurial > p > roundup > code
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 |
| 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 | 300 if self.lockfile is not None: |
| 301 locking.release_lock(self.lockfile) | |
| 302 if _dbs.has_key(self.config.DATABASE): | |
| 303 del _dbs[self.config.DATABASE] | |
| 304 if self.lockfile is not None: | |
| 305 self.lockfile.close() | |
| 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 | 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 | 668 self.db.addjournal(link_class, id, _UNLINK, |
| 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 | 681 self.db.addjournal(link_class, id, _LINK, |
| 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 | 718 self.db.indexer.add_text((self.classname, nodeid, key), |
| 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 | 1332 for dir, propname in group, sort: |
| 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 | 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 | 1955 # note: journalling is turned off as it really just wastes |
| 1956 # space. this behaviour may be overridden in an instance | |
| 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 | 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 | 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 : |
