Mercurial > p > roundup > code
annotate roundup/backends/back_metakit.py @ 1829:4e4afbe3cd30
Move '<input type="hidden">' elements into a block.
It is invalid HTML4 Strict to have them at the top of a form.
| author | Johannes Gijsbers <jlgijsbers@users.sourceforge.net> |
|---|---|
| date | Fri, 03 Oct 2003 19:15:24 +0000 |
| parents | a3b1b1dcf639 |
| children | 91a4619b1a14 |
| rev | line source |
|---|---|
|
1800
a3b1b1dcf639
Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1780
diff
changeset
|
1 # $Id: back_metakit.py,v 1.50 2003-09-08 20:39:18 jlgijsbers Exp $ |
|
1392
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
2 ''' |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
3 Metakit backend for Roundup, originally by Gordon McMillan. |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
4 |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
5 Notes by Richard: |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
6 |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
7 This backend has some behaviour specific to metakit: |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
8 |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
9 - there's no concept of an explicit "unset" in metakit, so all types |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
10 have some "unset" value: |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
11 |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
12 ========= ===== ==================================================== |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
13 Type Value Action when fetching from mk |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
14 ========= ===== ==================================================== |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
15 Strings '' convert to None |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
16 Date 0 (seconds since 1970-01-01.00:00:00) convert to None |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
17 Interval '' convert to None |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
18 Number 0 ambiguious :( - do nothing |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
19 Boolean 0 ambiguious :( - do nothing |
|
1563
e2a8ce4d2317
Class.find() may now find unset Links [SF#700620]
Richard Jones <richard@users.sourceforge.net>
parents:
1561
diff
changeset
|
20 Link 0 convert to None |
|
1392
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
21 Multilink [] actually, mk can handle this one ;) |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
22 Passowrd '' convert to None |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
23 ========= ===== ==================================================== |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
24 |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
25 The get/set routines handle these values accordingly by converting |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
26 to/from None where they can. The Number/Boolean types are not able |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
27 to handle an "unset" at all, so they default the "unset" to 0. |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
28 |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
29 - probably a bunch of stuff that I'm not aware of yet because I haven't |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
30 fully read through the source. One of these days.... |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
31 ''' |
|
916
76b783c69976
Session storage in the hyperdb was horribly, horribly inefficient.
Richard Jones <richard@users.sourceforge.net>
parents:
892
diff
changeset
|
32 from roundup import hyperdb, date, password, roundupdb, security |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
33 import metakit |
|
1467
378081f066cc
registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents:
1442
diff
changeset
|
34 from sessions import Sessions, OneTimeKeys |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
35 import re, marshal, os, sys, weakref, time, calendar |
|
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
|
36 from roundup import indexer |
|
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
|
37 import locking |
|
1508
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
38 from roundup.date import Range |
|
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
|
39 |
|
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
|
40 _dbs = {} |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
41 |
|
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
|
42 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
|
43 ''' 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
|
44 ''' |
|
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
|
45 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
|
46 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
|
47 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
|
48 _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
|
49 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
|
50 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
|
51 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
|
52 |
|
1417
472c21af7f69
fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents:
1392
diff
changeset
|
53 class _Database(hyperdb.Database, roundupdb.Database): |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
54 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
|
55 self.config = config |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
56 self.journaltag = journaltag |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
57 self.classes = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
58 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
|
59 self.lockfile = None |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
60 self._db = self.__open() |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
61 self.indexer = Indexer(self.config.DATABASE, self._db) |
|
916
76b783c69976
Session storage in the hyperdb was horribly, horribly inefficient.
Richard Jones <richard@users.sourceforge.net>
parents:
892
diff
changeset
|
62 self.sessions = Sessions(self.config) |
|
1467
378081f066cc
registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents:
1442
diff
changeset
|
63 self.otks = OneTimeKeys(self.config) |
|
916
76b783c69976
Session storage in the hyperdb was horribly, horribly inefficient.
Richard Jones <richard@users.sourceforge.net>
parents:
892
diff
changeset
|
64 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
|
65 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
66 os.umask(0002) |
|
1131
92e92ae58494
add close() methods where they are missing!
Richard Jones <richard@users.sourceforge.net>
parents:
1002
diff
changeset
|
67 |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
68 def post_init(self): |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
69 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
|
70 self.reindex() |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
71 |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
72 def reindex(self): |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
73 for klass in self.classes.values(): |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
74 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
|
75 klass.index(nodeid) |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
76 self.indexer.save_index() |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
77 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
78 # --- defined in ping's spec |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
79 def __getattr__(self, classname): |
|
1800
a3b1b1dcf639
Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1780
diff
changeset
|
80 if classname == 'transactions': |
|
926
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
81 return self.dirty |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
82 # fall back on the classes |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
83 return self.getclass(classname) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
84 def getclass(self, classname): |
|
1145
81941abedb0a
nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents:
1143
diff
changeset
|
85 try: |
|
81941abedb0a
nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents:
1143
diff
changeset
|
86 return self.classes[classname] |
|
81941abedb0a
nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents:
1143
diff
changeset
|
87 except KeyError: |
|
81941abedb0a
nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents:
1143
diff
changeset
|
88 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
|
89 def getclasses(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
90 return self.classes.keys() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
91 # --- 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
|
92 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
93 # --- exposed methods |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
94 def commit(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
95 if self.dirty: |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
96 self._db.commit() |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
97 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
|
98 cl._commit() |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
99 self.indexer.save_index() |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
100 self.dirty = 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
101 def rollback(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
102 if self.dirty: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
103 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
|
104 cl._rollback() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
105 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
|
106 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
|
107 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
|
108 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
|
109 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
|
110 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
|
111 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
|
112 self.dirty = 0 |
|
1232
c6a844d48176
Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1179
diff
changeset
|
113 def clearCache(self): |
|
c6a844d48176
Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1179
diff
changeset
|
114 for cl in self.classes.values(): |
|
c6a844d48176
Add clearCache method to DB.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1179
diff
changeset
|
115 cl._commit() |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
116 def clear(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
117 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
|
118 cl._clear() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
119 def hasnode(self, classname, 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
|
120 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
|
121 def pack(self, pack_before): |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
122 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
|
123 i = 0 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
124 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
|
125 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
|
126 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
|
127 else: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
128 i = i + 1 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
129 def addclass(self, cl): |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
130 self.classes[cl.classname] = cl |
|
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
|
131 if self.tables.find(name=cl.classname) < 0: |
|
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
|
132 self.tables.append(name=cl.classname) |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
133 def addjournal(self, tablenm, nodeid, action, params, creator=None, |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
134 creation=None): |
|
1179
9b013302c582
Remove some nasty debugging code.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1177
diff
changeset
|
135 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
|
136 if tblid == -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
137 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
|
138 if creator is None: |
|
1800
a3b1b1dcf639
Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1780
diff
changeset
|
139 creator = 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
|
140 else: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
141 try: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
142 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
|
143 except TypeError: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
144 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
|
145 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
|
146 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
|
147 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
|
148 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
|
149 # 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
|
150 self.hist.append(tableid=tblid, |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
151 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
|
152 date=creation, |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
153 action=action, |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
154 user = creator, |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
155 params = marshal.dumps(params)) |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
156 def getjournal(self, tablenm, nodeid): |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
157 rslt = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
158 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
|
159 if tblid == -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
160 return rslt |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
161 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
|
162 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
|
163 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
|
164 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
|
165 #userclass = self.getclass('user') |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
166 for row in q: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
167 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
168 params = marshal.loads(row.params) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
169 except ValueError: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
170 print "history couldn't unmarshal %r" % row.params |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
171 params = {} |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
172 #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
|
173 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
|
174 #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
|
175 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
|
176 params)) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
177 return rslt |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
178 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
179 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
|
180 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
|
181 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
|
182 if tblid == -1: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
183 return |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
184 i = 0 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
185 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
|
186 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
|
187 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
|
188 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 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
191 self.dirty = 1 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
192 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
193 def close(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
194 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
|
195 cl.db = None |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
196 self._db = None |
| 1143 | 197 if self.lockfile is not None: |
| 198 locking.release_lock(self.lockfile) | |
| 199 if _dbs.has_key(self.config.DATABASE): | |
| 200 del _dbs[self.config.DATABASE] | |
| 201 if self.lockfile is not None: | |
| 202 self.lockfile.close() | |
| 203 self.lockfile = None | |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
204 self.classes = {} |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
205 self.indexer = None |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
206 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
207 # --- internal |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
208 def __open(self): |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
209 ''' Open the metakit database |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
210 ''' |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
211 # 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
|
212 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
|
213 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
|
214 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
215 # figure the file names |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
216 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
|
217 lockfilenm = db[:-3]+'lck' |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
218 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
219 # 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
|
220 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
|
221 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
|
222 self.lockfile.flush() |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
223 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
224 # 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
|
225 self.fastopen = 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
226 if os.path.exists(db): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
227 dbtm = os.path.getmtime(db) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
228 pkgnm = self.config.__name__.split('.')[0] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
229 schemamod = sys.modules.get(pkgnm+'.dbinit', None) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
230 if schemamod: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
231 if os.path.exists(schemamod.__file__): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
232 schematm = os.path.getmtime(schemamod.__file__) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
233 if schematm < dbtm: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
234 # found schema mod - it's older than the db |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
235 self.fastopen = 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
236 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
237 # can't find schemamod - must be frozen |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
238 self.fastopen = 1 |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
239 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
240 # open the db |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
241 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
|
242 hist = db.view('history') |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
243 tables = db.view('tables') |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
244 if not self.fastopen: |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
245 # 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
|
246 if not hist.structure(): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
247 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
|
248 if not tables.structure(): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
249 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
|
250 db.commit() |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
251 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
252 # 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
|
253 self.tables = tables |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
254 self.hist = hist |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
255 return db |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
256 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
257 def setid(self, classname, maxid): |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
258 ''' No-op in metakit |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
259 ''' |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
260 pass |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
261 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
262 _STRINGTYPE = type('') |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
263 _LISTTYPE = type([]) |
|
1519
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
264 _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
|
265 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
266 _actionnames = { |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
267 _CREATE : 'create', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
268 _SET : 'set', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
269 _RETIRE : 'retire', |
|
1519
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
270 _RESTORE : 'restore', |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
271 _LINK : 'link', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
272 _UNLINK : 'unlink', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
273 } |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
274 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
275 _marker = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
276 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
277 _ALLOWSETTINGPRIVATEPROPS = 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
278 |
|
874
b9da8729d8ff
Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
872
diff
changeset
|
279 class Class: |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
280 privateprops = None |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
281 def __init__(self, db, classname, **properties): |
|
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
|
282 #self.db = weakref.proxy(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
|
283 self.db = db |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
284 self.classname = classname |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
285 self.keyname = None |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
286 self.ruprops = properties |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
287 self.privateprops = { 'id' : hyperdb.String(), |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
288 'activity' : hyperdb.Date(), |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
289 'creation' : hyperdb.Date(), |
|
1176
bd3b57859c37
On second thought, that last checkin was dumb.
Richard Jones <richard@users.sourceforge.net>
parents:
1175
diff
changeset
|
290 'creator' : hyperdb.Link('user') } |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
291 |
|
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
292 # event -> list of callables |
|
1519
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
293 self.auditors = {'create': [], 'set': [], 'retire': [], 'restore': []} |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
294 self.reactors = {'create': [], 'set': [], 'retire': [], 'restore': []} |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
295 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
296 view = self.__getview() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
297 self.maxid = 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
298 if view: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
299 self.maxid = view[-1].id + 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
300 self.uncommitted = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
301 self.rbactions = [] |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
302 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
303 # people reach inside!! |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
304 self.properties = self.ruprops |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
305 self.db.addclass(self) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
306 self.idcache = {} |
|
860
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
307 |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
308 # default is to journal changes |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
309 self.do_journal = 1 |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
310 |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
311 def enableJournalling(self): |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
312 '''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
|
313 ''' |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
314 self.do_journal = 1 |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
315 |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
316 def disableJournalling(self): |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
317 '''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
|
318 ''' |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
319 self.do_journal = 0 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
320 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
321 # --- the roundup.Class methods |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
322 def audit(self, event, detector): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
323 l = self.auditors[event] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
324 if detector not in l: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
325 self.auditors[event].append(detector) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
326 def fireAuditors(self, action, nodeid, newvalues): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
327 for audit in self.auditors[action]: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
328 audit(self.db, self, nodeid, newvalues) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
329 def fireReactors(self, action, nodeid, oldvalues): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
330 for react in self.reactors[action]: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
331 react(self.db, self, nodeid, oldvalues) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
332 def react(self, event, detector): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
333 l = self.reactors[event] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
334 if detector not in l: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
335 self.reactors[event].append(detector) |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
336 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
337 # --- the hyperdb.Class methods |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
338 def create(self, **propvalues): |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
339 self.fireAuditors('create', None, propvalues) |
|
1431
c70068162e64
Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents:
1417
diff
changeset
|
340 newid = self.create_inner(**propvalues) |
|
c70068162e64
Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents:
1417
diff
changeset
|
341 # self.set() (called in self.create_inner()) does reactors) |
|
c70068162e64
Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents:
1417
diff
changeset
|
342 return newid |
|
c70068162e64
Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents:
1417
diff
changeset
|
343 |
|
c70068162e64
Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents:
1417
diff
changeset
|
344 def create_inner(self, **propvalues): |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
345 rowdict = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
346 rowdict['id'] = newid = self.maxid |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
347 self.maxid += 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
348 ndx = self.getview(1).append(rowdict) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
349 propvalues['#ISNEW'] = 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
350 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
351 self.set(str(newid), **propvalues) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
352 except Exception: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
353 self.maxid -= 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
354 raise |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
355 return str(newid) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
356 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
357 def get(self, nodeid, propname, default=_marker, cache=1): |
|
1780
d2801a2b0a77
Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents:
1751
diff
changeset
|
358 ''' |
|
d2801a2b0a77
Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents:
1751
diff
changeset
|
359 'cache' exists for backwards compatibility, and is not used. |
|
d2801a2b0a77
Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents:
1751
diff
changeset
|
360 ''' |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
361 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
362 view = self.getview() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
363 id = int(nodeid) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
364 if cache == 0: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
365 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
|
366 if oldnode and oldnode.has_key(propname): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
367 return oldnode[propname] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
368 ndx = self.idcache.get(id, None) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
369 if ndx is None: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
370 ndx = view.find(id=id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
371 if ndx < 0: |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
372 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
|
373 self.idcache[id] = ndx |
|
854
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
374 try: |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
375 raw = getattr(view[ndx], propname) |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
376 except AttributeError: |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
377 raise KeyError, propname |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
378 rutyp = self.ruprops.get(propname, None) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
379 if rutyp is None: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
380 rutyp = self.privateprops[propname] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
381 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
|
382 if converter: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
383 raw = converter(raw) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
384 return raw |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
385 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
386 def set(self, nodeid, **propvalues): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
387 isnew = 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
388 if propvalues.has_key('#ISNEW'): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
389 isnew = 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
390 del propvalues['#ISNEW'] |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
391 if not isnew: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
392 self.fireAuditors('set', nodeid, propvalues) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
393 if not propvalues: |
|
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
|
394 return propvalues |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
395 if propvalues.has_key('id'): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
396 raise KeyError, '"id" is reserved' |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
397 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
|
398 raise hyperdb.DatabaseError, 'Database open read-only' |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
399 view = self.getview(1) |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
400 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
401 # 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
|
402 id = int(nodeid) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
403 ndx = view.find(id=id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
404 if ndx < 0: |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
405 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
|
406 row = view[ndx] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
407 if row._isdel: |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
408 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
|
409 oldnode = self.uncommitted.setdefault(id, {}) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
410 changes = {} |
| 1143 | 411 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
412 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
|
413 # 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
|
414 # ... 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
|
415 # the writeable properties. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
416 if _ALLOWSETTINGPRIVATEPROPS: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
417 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
|
418 if not prop: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
419 prop = self.privateprops[key] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
420 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
421 prop = self.ruprops[key] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
422 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
|
423 # 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
|
424 # doing anything |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
425 oldvalue = converter(getattr(row, key)) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
426 if value == oldvalue: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
427 del propvalues[key] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
428 continue |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
429 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
430 # check to make sure we're not duplicating an existing key |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
431 if key == self.keyname: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
432 iv = self.getindexview(1) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
433 ndx = iv.find(k=value) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
434 if ndx == -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
435 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
|
436 if not isnew: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
437 ndx = iv.find(k=oldvalue) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
438 if ndx > -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
439 iv.delete(ndx) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
440 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
441 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
|
442 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
443 # 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
|
444 if isinstance(prop, hyperdb.Link): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
445 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
|
446 # 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
|
447 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
|
448 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
|
449 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
|
450 # 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
|
451 if value is 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
|
452 value = 0 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
453 # 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
|
454 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
455 int(value) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
456 except ValueError: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
457 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
458 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
|
459 except (TypeError, KeyError): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
460 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
|
461 key, value, prop.classname) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
462 |
|
927
51519406b73e
web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents:
926
diff
changeset
|
463 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
|
464 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
|
465 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
|
466 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
467 setattr(row, key, int(value)) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
468 changes[key] = oldvalue |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
469 |
|
860
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
470 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
|
471 # 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
|
472 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
|
473 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
|
474 (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
|
475 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
476 # 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
|
477 if value: |
|
927
51519406b73e
web forms may now unset Link values (like assignedto)
Richard Jones <richard@users.sourceforge.net>
parents:
926
diff
changeset
|
478 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
|
479 (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
|
480 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
481 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
|
482 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
|
483 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
|
484 link_class = prop.classname |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
485 l = [] |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
486 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
|
487 value = [] |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
488 for entry in value: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
489 if type(entry) != _STRINGTYPE: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
490 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
|
491 'must be a string'%key |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
492 # 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
|
493 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
494 int(entry) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
495 except ValueError: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
496 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
497 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
|
498 except (TypeError, KeyError): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
499 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
|
500 key, entry, prop.classname) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
501 l.append(entry) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
502 propvalues[key] = value = l |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
503 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
504 # handle removals |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
505 rmvd = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
506 for id in oldvalue: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
507 if id not in value: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
508 rmvd.append(id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
509 # 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
|
510 if self.do_journal and prop.do_journal: |
| 1143 | 511 self.db.addjournal(link_class, id, _UNLINK, |
| 512 (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
|
513 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
514 # handle additions |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
515 adds = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
516 for id in value: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
517 if id not in oldvalue: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
518 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
|
519 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
|
520 link_class, id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
521 adds.append(id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
522 # 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
|
523 if self.do_journal and prop.do_journal: |
| 1143 | 524 self.db.addjournal(link_class, id, _LINK, |
| 525 (self.classname, str(row.id), key)) | |
|
1385
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
526 |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
527 # 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
|
528 sv = getattr(row, key) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
529 i = 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
530 while i < len(sv): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
531 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
|
532 sv.delete(i) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
533 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
534 i += 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
535 for id in adds: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
536 sv.append(fid=int(id)) |
|
1385
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
537 |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
538 # figure the journal entry |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
539 l = [] |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
540 if adds: |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
541 l.append(('+', adds)) |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
542 if rmvd: |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
543 l.append(('-', rmvd)) |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
544 if l: |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
545 changes[key] = tuple(l) |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
546 #changes[key] = oldvalue |
|
2bd4822f96a6
- more fixes to CGI form handling
Richard Jones <richard@users.sourceforge.net>
parents:
1351
diff
changeset
|
547 |
|
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
|
548 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
|
549 del propvalues[key] |
|
1389
7f9bd5b1e798
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
1385
diff
changeset
|
550 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
551 elif isinstance(prop, hyperdb.String): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
552 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
|
553 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
|
554 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
|
555 value = '' |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
556 setattr(row, key, value) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
557 changes[key] = oldvalue |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
558 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
|
559 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
|
560 if prop.indexme: |
| 1143 | 561 self.db.indexer.add_text((self.classname, nodeid, key), |
| 562 value, 'text/plain') | |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
563 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
564 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
|
565 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
|
566 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
|
567 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
|
568 value = '' |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
569 setattr(row, key, str(value)) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
570 changes[key] = str(oldvalue) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
571 propvalues[key] = str(value) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
572 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
573 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
|
574 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
|
575 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
|
576 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
|
577 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
|
578 else: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
579 setattr(row, key, int(calendar.timegm(value.get_tuple()))) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
580 changes[key] = str(oldvalue) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
581 propvalues[key] = str(value) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
582 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
583 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
|
584 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
|
585 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
|
586 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
|
587 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
|
588 else: |
|
1596
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
589 # 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
|
590 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
|
591 changes[key] = str(oldvalue) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
592 propvalues[key] = str(value) |
|
1596
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
593 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
594 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
|
595 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
|
596 value = 0 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
597 try: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
598 v = int(value) |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
599 except ValueError: |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
600 raise TypeError, "%s (%s) is not numeric"%(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
|
601 setattr(row, key, v) |
|
880
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
602 changes[key] = oldvalue |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
603 propvalues[key] = value |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
604 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
605 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
|
606 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
|
607 bv = 0 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
608 elif value not in (0,1): |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
609 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
|
610 else: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
611 bv = value |
|
880
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
612 setattr(row, key, bv) |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
613 changes[key] = oldvalue |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
614 propvalues[key] = value |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
615 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
616 oldnode[key] = oldvalue |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
617 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
618 # nothing to do? |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
619 if not propvalues: |
|
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
|
620 return propvalues |
|
874
b9da8729d8ff
Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
872
diff
changeset
|
621 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
|
622 row.activity = int(time.time()) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
623 if isnew: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
624 if not row.creation: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
625 row.creation = int(time.time()) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
626 if not row.creator: |
|
1800
a3b1b1dcf639
Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1780
diff
changeset
|
627 row.creator = self.db.getuid() |
|
1431
c70068162e64
Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents:
1417
diff
changeset
|
628 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
629 self.db.dirty = 1 |
|
860
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
630 if self.do_journal: |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
631 if isnew: |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
632 self.db.addjournal(self.classname, nodeid, _CREATE, {}) |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
633 self.fireReactors('create', nodeid, None) |
|
860
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
634 else: |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
635 self.db.addjournal(self.classname, nodeid, _SET, changes) |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
636 self.fireReactors('set', nodeid, oldnode) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
637 |
|
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
|
638 return propvalues |
|
3c344e942055
Use same regex to split search terms as used to index text.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
927
diff
changeset
|
639 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
640 def retire(self, nodeid): |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
641 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
|
642 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
|
643 self.fireAuditors('retire', nodeid, None) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
644 view = self.getview(1) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
645 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
|
646 if ndx < 0: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
647 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
|
648 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
649 row = view[ndx] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
650 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
|
651 oldval = oldvalues['_isdel'] = row._isdel |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
652 row._isdel = 1 |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
653 |
|
860
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
654 if self.do_journal: |
|
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
655 self.db.addjournal(self.classname, nodeid, _RETIRE, {}) |
|
926
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
656 if self.keyname: |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
657 iv = self.getindexview(1) |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
658 ndx = iv.find(k=getattr(row, self.keyname),i=row.id) |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
659 if ndx > -1: |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
660 iv.delete(ndx) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
661 self.db.dirty = 1 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
662 self.fireReactors('retire', nodeid, None) |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
663 |
|
1519
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
664 def restore(self, nodeid): |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
665 '''Restpre a retired node. |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
666 |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
667 Make node available for all operations like it was before retirement. |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
668 ''' |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
669 if self.db.journaltag is None: |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
670 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
|
671 |
|
63aa7be52d2c
checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1519
diff
changeset
|
672 # 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
|
673 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
|
674 keyvalue = self.get(nodeid, key) |
|
63aa7be52d2c
checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1519
diff
changeset
|
675 try: |
|
63aa7be52d2c
checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1519
diff
changeset
|
676 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
|
677 except KeyError: |
|
63aa7be52d2c
checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1519
diff
changeset
|
678 pass |
|
63aa7be52d2c
checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1519
diff
changeset
|
679 else: |
|
63aa7be52d2c
checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1519
diff
changeset
|
680 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
|
681 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
|
682 # Now we can safely restore node |
|
1519
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
683 self.fireAuditors('restore', nodeid, None) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
684 view = self.getview(1) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
685 ndx = view.find(id=int(nodeid)) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
686 if ndx < 0: |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
687 raise KeyError, "nodeid %s not found" % nodeid |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
688 |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
689 row = view[ndx] |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
690 oldvalues = self.uncommitted.setdefault(row.id, {}) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
691 oldval = oldvalues['_isdel'] = row._isdel |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
692 row._isdel = 0 |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
693 |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
694 if self.do_journal: |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
695 self.db.addjournal(self.classname, nodeid, _RESTORE, {}) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
696 if self.keyname: |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
697 iv = self.getindexview(1) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
698 ndx = iv.find(k=getattr(row, self.keyname),i=row.id) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
699 if ndx > -1: |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
700 iv.delete(ndx) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
701 self.db.dirty = 1 |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
702 self.fireReactors('restore', nodeid, None) |
|
6fede2aa6a12
added ability to restore retired nodes
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1508
diff
changeset
|
703 |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
704 def is_retired(self, nodeid): |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
705 view = self.getview(1) |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
706 # 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
|
707 id = int(nodeid) |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
708 ndx = view.find(id=id) |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
709 if ndx < 0: |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
710 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
|
711 row = view[ndx] |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
712 return row._isdel |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
713 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
714 def history(self, nodeid): |
|
860
2df32a73eb45
Implemented a switch to disable journalling for a Class.
Richard Jones <richard@users.sourceforge.net>
parents:
859
diff
changeset
|
715 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
|
716 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
|
717 return self.db.getjournal(self.classname, nodeid) |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
718 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
719 def setkey(self, propname): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
720 if self.keyname: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
721 if propname == self.keyname: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
722 return |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
723 raise ValueError, "%s already indexed on %s"%(self.classname, |
|
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
724 self.keyname) |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
725 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
|
726 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
|
727 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
|
728 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
|
729 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
|
730 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
|
731 raise TypeError, "%s is not a String" % propname |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
732 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
733 # first setkey for this run |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
734 self.keyname = propname |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
735 iv = self.db._db.view('_%s' % self.classname) |
|
872
bd6211d39328
Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
860
diff
changeset
|
736 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
|
737 return |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
738 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
739 # very first setkey ever |
|
872
bd6211d39328
Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
860
diff
changeset
|
740 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
|
741 iv = self.db._db.getas('_%s[k:S,i:I]' % self.classname) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
742 iv = iv.ordered(1) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
743 for row in self.getview(): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
744 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
|
745 self.db.commit() |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
746 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
747 def getkey(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
748 return self.keyname |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
749 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
750 def lookup(self, keyvalue): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
751 if type(keyvalue) is not _STRINGTYPE: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
752 raise TypeError, "%r is not a string" % keyvalue |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
753 iv = self.getindexview() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
754 if iv: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
755 ndx = iv.find(k=keyvalue) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
756 if ndx > -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
757 return str(iv[ndx].i) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
758 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
759 view = self.getview() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
760 ndx = view.find({self.keyname:keyvalue, '_isdel':0}) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
761 if ndx > -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
762 return str(view[ndx].id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
763 raise KeyError, keyvalue |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
764 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
765 def destroy(self, id): |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
766 view = self.getview(1) |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
767 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
|
768 if ndx > -1: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
769 if self.keyname: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
770 keyvalue = getattr(view[ndx], self.keyname) |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
771 iv = self.getindexview(1) |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
772 if iv: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
773 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
|
774 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
|
775 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
|
776 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
|
777 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
|
778 self.db.dirty = 1 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
779 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
780 def find(self, **propspec): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
781 """Get the ids of nodes in this class which link to the given nodes. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
782 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
783 'propspec' consists of keyword args propname={nodeid:1,} |
|
854
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
784 'propname' must be the name of a property in this class, or a |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
785 KeyError is raised. That property must be a Link or |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
786 Multilink property, or a TypeError is raised. |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
787 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
788 Any node in this class whose propname property links to any of the |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
789 nodeids will be returned. Used by the full text indexing, which knows |
|
854
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
790 that "foo" occurs in msg1, msg3 and file7; so we have hits on these |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
791 issues: |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
792 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
793 db.issue.find(messages={'1':1,'3':1}, files={'7':1}) |
|
854
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
794 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
795 """ |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
796 propspec = propspec.items() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
797 for propname, nodeid in propspec: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
798 # check the prop is OK |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
799 prop = self.ruprops[propname] |
|
854
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
800 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
|
801 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
|
802 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
|
803 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
804 vws = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
805 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
|
806 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
|
807 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
|
808 elif ids is None: |
|
e2a8ce4d2317
Class.find() may now find unset Links [SF#700620]
Richard Jones <richard@users.sourceforge.net>
parents:
1561
diff
changeset
|
809 ids = {0:1} |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
810 else: |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
811 d = {} |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
812 for id in ids.keys(): |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
813 d[int(id)] = 1 |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
814 ids = d |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
815 prop = self.ruprops[propname] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
816 view = self.getview() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
817 if isinstance(prop, hyperdb.Multilink): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
818 def ff(row, nm=propname, ids=ids): |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
819 sv = getattr(row, nm) |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
820 for sr in sv: |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
821 if ids.has_key(sr.fid): |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
822 return 1 |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
823 return 0 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
824 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
825 def ff(row, nm=propname, ids=ids): |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
826 return 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
|
827 ndxview = view.filter(ff) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
828 vws.append(ndxview.unique()) |
|
854
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
829 |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
830 # handle the empty match case |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
831 if not vws: |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
832 return [] |
|
3cdfa5d86cec
Added metakit backend to the db tests...
Richard Jones <richard@users.sourceforge.net>
parents:
832
diff
changeset
|
833 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
834 ndxview = vws[0] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
835 for v in vws[1:]: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
836 ndxview = ndxview.union(v) |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
837 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
|
838 rslt = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
839 for row in view: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
840 rslt.append(str(row.id)) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
841 return rslt |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
842 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
843 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
844 def list(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
845 l = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
846 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
|
847 l.append(str(row.id)) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
848 return l |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
849 |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
850 def getnodeids(self): |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
851 l = [] |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
852 for row in self.getview(): |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
853 l.append(str(row.id)) |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
854 return l |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
855 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
856 def count(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
857 return len(self.getview()) |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
858 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
859 def getprops(self, protected=1): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
860 # 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
|
861 allprops = self.ruprops.copy() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
862 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
|
863 allprops.update(self.privateprops) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
864 return allprops |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
865 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
866 def addprop(self, **properties): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
867 for key in properties.keys(): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
868 if self.ruprops.has_key(key): |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
869 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
|
870 self.classname) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
871 self.ruprops.update(properties) |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
872 # Class structure has changed |
|
872
bd6211d39328
Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
860
diff
changeset
|
873 self.db.fastopen = 0 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
874 view = self.__getview() |
|
872
bd6211d39328
Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
860
diff
changeset
|
875 self.db.commit() |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
876 # ---- end of ping's spec |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
877 |
|
1249
6c24a86a12ae
Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents:
1243
diff
changeset
|
878 def filter(self, search_matches, filterspec, sort=(None,None), |
|
6c24a86a12ae
Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents:
1243
diff
changeset
|
879 group=(None,None)): |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
880 # search_matches is None or a set (dict of {nodeid: {propname:[nodeid,...]}}) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
881 # filterspec is a dict {propname:value} |
| 1002 | 882 # sort and group are (dir, prop) where dir is '+', '-' or None |
| 883 # and prop is a prop name or None | |
|
1508
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
884 |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
885 timezone = self.db.getUserTimezone() |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
886 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
887 where = {'_isdel':0} |
|
1508
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
888 wherehigh = {} |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
889 mlcriteria = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
890 regexes = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
891 orcriteria = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
892 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
|
893 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
|
894 if prop is None: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
895 prop = self.privateprops[propname] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
896 if isinstance(prop, hyperdb.Multilink): |
|
1561
cf5a5357a7ea
match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents:
1523
diff
changeset
|
897 if value in ('-1', ['-1']): |
|
cf5a5357a7ea
match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents:
1523
diff
changeset
|
898 value = [] |
|
cf5a5357a7ea
match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents:
1523
diff
changeset
|
899 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
|
900 value = [value] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
901 # transform keys to ids |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
902 u = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
903 for item in value: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
904 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
905 item = int(item) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
906 except (TypeError, ValueError): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
907 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
|
908 if item == -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
909 item = 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
910 u.append(item) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
911 mlcriteria[propname] = u |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
912 elif isinstance(prop, hyperdb.Link): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
913 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
|
914 value = [value] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
915 # transform keys to ids |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
916 u = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
917 for item in value: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
918 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
919 item = int(item) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
920 except (TypeError, ValueError): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
921 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
|
922 if item == -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
923 item = 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
924 u.append(item) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
925 if len(u) == 1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
926 where[propname] = u[0] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
927 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
928 orcriteria[propname] = u |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
929 elif isinstance(prop, hyperdb.String): |
|
1631
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
930 if type(value) is not type([]): |
|
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
931 value = [value] |
|
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
932 m = [] |
|
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
933 for v in value: |
|
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
934 # simple glob searching |
|
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
935 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
|
936 v = v.replace('?', '.') |
|
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
937 v = v.replace('*', '.*?') |
|
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
938 m.append(v) |
|
8a908bbad1ef
A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents:
1596
diff
changeset
|
939 regexes[propname] = re.compile('(%s)'%('|'.join(m)), re.I) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
940 elif propname == 'id': |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
941 where[propname] = int(value) |
|
880
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
942 elif isinstance(prop, hyperdb.Boolean): |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
943 if type(value) is _STRINGTYPE: |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
944 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
|
945 else: |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
946 bv = value |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
947 where[propname] = bv |
|
1351
d1bfb479e527
fixed searching on date / interval fields [SF#658157]
Richard Jones <richard@users.sourceforge.net>
parents:
1333
diff
changeset
|
948 elif isinstance(prop, hyperdb.Date): |
|
1508
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
949 try: |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
950 # Try to filter on range of dates |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
951 date_rng = Range(value, date.Date, offset=timezone) |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
952 if date_rng.from_value: |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
953 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
|
954 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
|
955 else: |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
956 # 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
|
957 # 'prop' property |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
958 where[propname] = 0 |
|
1508
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
959 if date_rng.to_value: |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
960 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
|
961 wherehigh[propname] = int(calendar.timegm(t)) |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
962 else: |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
963 wherehigh[propname] = None |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
964 except ValueError: |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
965 # If range creation fails - ignore that search parameter |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
966 pass |
|
1351
d1bfb479e527
fixed searching on date / interval fields [SF#658157]
Richard Jones <richard@users.sourceforge.net>
parents:
1333
diff
changeset
|
967 elif isinstance(prop, hyperdb.Interval): |
|
1596
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
968 try: |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
969 # 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
|
970 date_rng = Range(value, date.Interval) |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
971 if date_rng.from_value: |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
972 #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
|
973 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
|
974 else: |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
975 # 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
|
976 # 'prop' property |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
977 where[propname] = '-99999999999999' |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
978 if date_rng.to_value: |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
979 #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
|
980 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
|
981 else: |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
982 wherehigh[propname] = None |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
983 except ValueError: |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
984 # If range creation fails - ignore that search parameter |
|
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
985 pass |
|
880
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
986 elif isinstance(prop, hyperdb.Number): |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
987 where[propname] = int(value) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
988 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
989 where[propname] = str(value) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
990 v = self.getview() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
991 #print "filter start at %s" % time.time() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
992 if where: |
|
1508
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
993 where_higherbound = where.copy() |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
994 where_higherbound.update(wherehigh) |
|
5c58ccad41ee
Searches on range of dates for metakit
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1496
diff
changeset
|
995 v = v.select(where, where_higherbound) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
996 #print "filter where at %s" % time.time() |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
997 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
998 if mlcriteria: |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
999 # multilink - if any of the nodeids required by the |
|
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1000 # 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
|
1001 def ff(row, ml=mlcriteria): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1002 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
|
1003 sv = getattr(row, propname) |
|
1561
cf5a5357a7ea
match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents:
1523
diff
changeset
|
1004 if not values and sv: |
|
cf5a5357a7ea
match empty multilinks implemented for metakit
Richard Jones <richard@users.sourceforge.net>
parents:
1523
diff
changeset
|
1005 return 0 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1006 for id in values: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1007 if sv.find(fid=id) == -1: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1008 return 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1009 return 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1010 iv = v.filter(ff) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1011 v = v.remapwith(iv) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1012 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1013 #print "filter mlcrit at %s" % time.time() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1014 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1015 if orcriteria: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1016 def ff(row, crit=orcriteria): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1017 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
|
1018 val = getattr(row, propname) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1019 if val not in allowed: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1020 return 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1021 return 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1022 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1023 iv = v.filter(ff) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1024 v = v.remapwith(iv) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1025 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1026 #print "filter orcrit at %s" % time.time() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1027 if regexes: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1028 def ff(row, r=regexes): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1029 for propname, regex in r.items(): |
|
1392
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
1030 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
|
1031 if not regex.search(val): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1032 return 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1033 return 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1034 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1035 iv = v.filter(ff) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1036 v = v.remapwith(iv) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1037 #print "filter regexs at %s" % time.time() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1038 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1039 if sort or group: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1040 sortspec = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1041 rev = [] |
| 1002 | 1042 for dir, propname in group, sort: |
| 1043 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
|
1044 isreversed = 0 |
| 1002 | 1045 if dir == '-': |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1046 isreversed = 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1047 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1048 prop = getattr(v, propname) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1049 except AttributeError: |
|
926
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1050 print "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
|
1051 continue |
|
926
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1052 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
|
1053 if propclass is None: |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1054 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
|
1055 if propclass is None: |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1056 print "Schema has no property %s" % propname |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1057 continue |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1058 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
|
1059 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
|
1060 lv = linkclass.getview() |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1061 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
|
1062 v = v.join(lv, prop, 1) |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1063 if linkclass.getprops().has_key('order'): |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1064 propname = 'order' |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1065 else: |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1066 propname = linkclass.labelprop() |
|
3216c4f06ec4
Fixes to the search form and saving queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
919
diff
changeset
|
1067 prop = getattr(v, propname) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1068 if isreversed: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1069 rev.append(prop) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1070 sortspec.append(prop) |
|
874
b9da8729d8ff
Fix bug in setting activity.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
872
diff
changeset
|
1071 v = v.sortrev(sortspec, rev)[:] #XXX Metakit bug |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1072 #print "filter sort at %s" % time.time() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1073 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1074 rslt = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1075 for row in v: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1076 id = str(row.id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1077 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
|
1078 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
|
1079 rslt.append(id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1080 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1081 rslt.append(id) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1082 return rslt |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1083 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1084 def hasnode(self, nodeid): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1085 return int(nodeid) < self.maxid |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1086 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1087 def labelprop(self, default_to_id=0): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1088 ''' Return the property name for a label for the given node. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1089 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1090 This method attempts to generate a consistent label for the node. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1091 It tries the following in order: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1092 1. key property |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1093 2. "name" property |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1094 3. "title" property |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1095 4. first property from the sorted property name list |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1096 ''' |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1097 k = self.getkey() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1098 if k: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1099 return k |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1100 props = self.getprops() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1101 if props.has_key('name'): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1102 return 'name' |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1103 elif props.has_key('title'): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1104 return 'title' |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1105 if default_to_id: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1106 return 'id' |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1107 props = props.keys() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1108 props.sort() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1109 return props[0] |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1110 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1111 def stringFind(self, **requirements): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1112 """Locate a particular node by matching a set of its String |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1113 properties in a caseless search. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1114 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1115 If the property is not a String property, a TypeError is raised. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1116 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1117 The return is a list of the id of all nodes that match. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1118 """ |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1119 for propname in requirements.keys(): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1120 prop = self.properties[propname] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1121 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
|
1122 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
|
1123 requirements[propname] = requirements[propname].lower() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1124 requirements['_isdel'] = 0 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1125 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1126 l = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1127 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
|
1128 l.append(str(row.id)) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1129 return l |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1130 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1131 def addjournal(self, nodeid, action, params): |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1132 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
|
1133 |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1134 def index(self, nodeid): |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1135 ''' 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
|
1136 # 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
|
1137 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
|
1138 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
|
1139 # 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
|
1140 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
|
1141 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
|
1142 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1143 def export_list(self, propnames, nodeid): |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1144 ''' Export a node - generate a list of CSV-able data in the order |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1145 specified by propnames for the given node. |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1146 ''' |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1147 properties = self.getprops() |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1148 l = [] |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1149 for prop in propnames: |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1150 proptype = properties[prop] |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1151 value = self.get(nodeid, prop) |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1152 # "marshal" data where needed |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1153 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
|
1154 pass |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1155 elif isinstance(proptype, hyperdb.Date): |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1156 value = value.get_tuple() |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1157 elif isinstance(proptype, hyperdb.Interval): |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1158 value = value.get_tuple() |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1159 elif isinstance(proptype, hyperdb.Password): |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1160 value = str(value) |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1161 l.append(repr(value)) |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1162 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1163 # append retired flag |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1164 l.append(self.is_retired(nodeid)) |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1165 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1166 return l |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1167 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1168 def import_list(self, propnames, proplist): |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1169 ''' Import a node - all information including "id" is present and |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1170 should not be sanity checked. Triggers are not triggered. The |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1171 journal should be initialised using the "creator" and "creation" |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1172 information. |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1173 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1174 Return the nodeid of the node imported. |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1175 ''' |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1176 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
|
1177 raise hyperdb.DatabaseError, 'Database open read-only' |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1178 properties = self.getprops() |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1179 |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1180 d = {} |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1181 view = self.getview(1) |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1182 for i in range(len(propnames)): |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1183 value = eval(proplist[i]) |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1184 if not value: |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1185 continue |
|
1496
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1186 |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1187 propname = propnames[i] |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1188 if propname == 'id': |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1189 newid = value = int(value) |
|
1496
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1190 elif propname == 'is retired': |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1191 # is the item retired? |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1192 if int(value): |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1193 d['_isdel'] = 1 |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1194 continue |
|
1751
ab7760caf6ff
Importing wasn't setting None values explicitly when it should have been
Richard Jones <richard@users.sourceforge.net>
parents:
1631
diff
changeset
|
1195 elif value is None: |
|
ab7760caf6ff
Importing wasn't setting None values explicitly when it should have been
Richard Jones <richard@users.sourceforge.net>
parents:
1631
diff
changeset
|
1196 d[propname] = None |
|
ab7760caf6ff
Importing wasn't setting None values explicitly when it should have been
Richard Jones <richard@users.sourceforge.net>
parents:
1631
diff
changeset
|
1197 continue |
|
1496
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1198 |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1199 prop = properties[propname] |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1200 if isinstance(prop, hyperdb.Date): |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1201 value = int(calendar.timegm(value)) |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1202 elif isinstance(prop, hyperdb.Interval): |
|
1596
33a0d94c7658
searching on ranges of intervals is implemented
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1563
diff
changeset
|
1203 value = date.Interval(value).serialise() |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1204 elif isinstance(prop, hyperdb.Number): |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1205 value = int(value) |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1206 elif isinstance(prop, hyperdb.Boolean): |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1207 value = int(value) |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1208 elif isinstance(prop, hyperdb.Link) and value: |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1209 value = int(value) |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1210 elif isinstance(prop, hyperdb.Multilink): |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1211 # we handle multilinks separately |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1212 continue |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1213 d[propname] = value |
|
1496
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1214 |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1215 # possibly make a new node |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1216 if not d.has_key('id'): |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1217 d['id'] = newid = self.maxid |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1218 self.maxid += 1 |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1219 |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1220 # save off the node |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1221 view.append(d) |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1222 |
|
1496
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1223 # fix up multilinks |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1224 ndx = view.find(id=newid) |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1225 row = view[ndx] |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1226 for i in range(len(propnames)): |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1227 value = eval(proplist[i]) |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1228 propname = propnames[i] |
|
1496
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1229 if propname == 'is retired': |
|
e6ac4e074acb
relaxed CVS importing (feature [SF#693277])
Richard Jones <richard@users.sourceforge.net>
parents:
1484
diff
changeset
|
1230 continue |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1231 prop = properties[propname] |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1232 if not isinstance(prop, hyperdb.Multilink): |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1233 continue |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1234 sv = getattr(row, propname) |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1235 for entry in value: |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1236 sv.append(int(entry)) |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1237 |
|
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1238 self.db.dirty = 1 |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1239 creator = d.get('creator', 0) |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1240 creation = d.get('creation', 0) |
|
1484
b3f2484babce
fixes to import/export
Richard Jones <richard@users.sourceforge.net>
parents:
1476
diff
changeset
|
1241 self.db.addjournal(self.classname, str(newid), _CREATE, {}, creator, |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1242 creation) |
|
1177
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1243 return newid |
|
24a1a5de1203
Fix as many of the unit test cases as possible.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1176
diff
changeset
|
1244 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1245 # --- used by Database |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1246 def _commit(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1247 """ called post commit of the DB. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1248 interested subclasses may override """ |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1249 self.uncommitted = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1250 self.rbactions = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1251 self.idcache = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1252 def _rollback(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1253 """ called pre rollback of the DB. |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1254 interested subclasses may override """ |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1255 for action in self.rbactions: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1256 action() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1257 self.rbactions = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1258 self.uncommitted = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1259 self.idcache = {} |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1260 def _clear(self): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1261 view = self.getview(1) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1262 if len(view): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1263 view[:] = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1264 self.db.dirty = 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1265 iv = self.getindexview(1) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1266 if iv: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1267 iv[:] = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1268 def rollbackaction(self, action): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1269 """ call this to register a callback called on rollback |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1270 callback is removed on end of transaction """ |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1271 self.rbactions.append(action) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1272 # --- internal |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1273 def __getview(self): |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1274 ''' 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
|
1275 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1276 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
|
1277 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
|
1278 ''' |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1279 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
|
1280 view = db.view(self.classname) |
|
872
bd6211d39328
Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
860
diff
changeset
|
1281 mkprops = view.structure() |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1282 |
|
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1283 # 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
|
1284 # changed |
|
872
bd6211d39328
Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
860
diff
changeset
|
1285 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
|
1286 return view.ordered(1) |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1287 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1288 # is the definition the same? |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1289 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
|
1290 for mkprop in mkprops: |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1291 if mkprop.name == nm: |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1292 break |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1293 else: |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1294 mkprop = None |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1295 if mkprop is None: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1296 break |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1297 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
|
1298 break |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1299 else: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1300 return view.ordered(1) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1301 # need to create or restructure the mk view |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1302 # id comes first, so MK will order it for us |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1303 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
|
1304 s = ["%s[id:I" % self.classname] |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1305 for nm, rutyp in self.ruprops.items(): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1306 mktyp = _typmap[rutyp.__class__] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1307 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
|
1308 if mktyp == 'V': |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1309 s[-1] += ('[fid:I]') |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1310 s.append('_isdel:I,activity:I,creation:I,creator:I]') |
|
872
bd6211d39328
Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
860
diff
changeset
|
1311 v = self.db._db.getas(','.join(s)) |
|
bd6211d39328
Saving, running & editing queries.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
860
diff
changeset
|
1312 self.db.commit() |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1313 return v.ordered(1) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1314 def getview(self, RW=0): |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1315 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
|
1316 def getindexview(self, RW=0): |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1317 return self.db._db.view("_%s" % self.classname).ordered(1) |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1318 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1319 def _fetchML(sv): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1320 l = [] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1321 for row in sv: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1322 if row.fid: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1323 l.append(str(row.fid)) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1324 return l |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1325 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1326 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
|
1327 ''' 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
|
1328 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
|
1329 ''' |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
1330 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
|
1331 return None |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1332 p = password.Password() |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1333 p.unpack(s) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1334 return p |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1335 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1336 def _fetchLink(n): |
|
1476
5a01e90b7dc9
fixed export/import of retired nodes [SF#685273]
Richard Jones <richard@users.sourceforge.net>
parents:
1467
diff
changeset
|
1337 ''' 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
|
1338 ''' |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1339 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
|
1340 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1341 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
|
1342 ''' 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
|
1343 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
|
1344 ''' |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
1345 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
|
1346 return None |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1347 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
|
1348 |
|
1392
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
1349 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
|
1350 ''' 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
|
1351 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
|
1352 ''' |
|
083cce7840aa
Metakit now passes all unit tests! w00t! (except the Number/Boolean unset)
Richard Jones <richard@users.sourceforge.net>
parents:
1389
diff
changeset
|
1353 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
|
1354 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
|
1355 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
|
1356 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1357 _converters = { |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1358 hyperdb.Date : _fetchDate, |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1359 hyperdb.Link : _fetchLink, |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1360 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
|
1361 hyperdb.Interval : _fetchInterval, |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1362 hyperdb.Password : _fetchPW, |
|
880
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
1363 hyperdb.Boolean : lambda n: n, |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
1364 hyperdb.Number : lambda n: 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
|
1365 hyperdb.String : lambda s: s and str(s) or None, |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1366 } |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1367 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1368 class FileName(hyperdb.String): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1369 isfilename = 1 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1370 |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1371 _typmap = { |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1372 FileName : 'S', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1373 hyperdb.String : 'S', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1374 hyperdb.Date : 'I', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1375 hyperdb.Link : 'I', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1376 hyperdb.Multilink : 'V', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1377 hyperdb.Interval : 'S', |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1378 hyperdb.Password : 'S', |
|
880
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
1379 hyperdb.Boolean : 'I', |
|
de3da99a7c02
Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
874
diff
changeset
|
1380 hyperdb.Number : 'I', |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1381 } |
|
1442
b42fa71754c9
don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents:
1431
diff
changeset
|
1382 class FileClass(Class, hyperdb.FileClass): |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1383 ''' like Class but with a content property |
|
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1384 ''' |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1385 default_mime_type = 'text/plain' |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1386 def __init__(self, db, classname, **properties): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1387 properties['content'] = FileName() |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1388 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
|
1389 properties['type'] = hyperdb.String() |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1390 Class.__init__(self, db, classname, **properties) |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1391 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1392 def get(self, nodeid, propname, default=_marker, cache=1): |
|
1780
d2801a2b0a77
Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents:
1751
diff
changeset
|
1393 x = Class.get(self, nodeid, propname, default) |
|
1417
472c21af7f69
fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents:
1392
diff
changeset
|
1394 poss_msg = 'Possibly an access right configuration problem.' |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1395 if propname == 'content': |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1396 if x.startswith('file:'): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1397 fnm = x[5:] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1398 try: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1399 x = open(fnm, 'rb').read() |
|
1417
472c21af7f69
fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents:
1392
diff
changeset
|
1400 except IOError, (strerror): |
|
472c21af7f69
fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents:
1392
diff
changeset
|
1401 # XXX by catching this we donot see an error in the log. |
|
472c21af7f69
fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents:
1392
diff
changeset
|
1402 return 'ERROR reading file: %s%s\n%s\n%s'%( |
|
472c21af7f69
fixed error in indexargs_url (thanks Patrick Ohly)
Richard Jones <richard@users.sourceforge.net>
parents:
1392
diff
changeset
|
1403 self.classname, nodeid, poss_msg, strerror) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1404 return x |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1405 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1406 def create(self, **propvalues): |
|
1431
c70068162e64
Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents:
1417
diff
changeset
|
1407 self.fireAuditors('create', None, propvalues) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1408 content = propvalues['content'] |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1409 del propvalues['content'] |
|
1431
c70068162e64
Altered Class.create() and FileClass.create() methods...
Richard Jones <richard@users.sourceforge.net>
parents:
1417
diff
changeset
|
1410 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
|
1411 if not content: |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1412 return newid |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1413 nm = bnm = '%s%s' % (self.classname, newid) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1414 sd = str(int(int(newid) / 1000)) |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1415 d = os.path.join(self.db.config.DATABASE, 'files', self.classname, sd) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1416 if not os.path.exists(d): |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1417 os.makedirs(d) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1418 nm = os.path.join(d, nm) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1419 open(nm, 'wb').write(content) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1420 self.set(newid, content = 'file:'+nm) |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1421 mimetype = propvalues.get('type', self.default_mime_type) |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1422 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
|
1423 mimetype) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1424 def undo(fnm=nm, action1=os.remove, indexer=self.db.indexer): |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1425 action1(fnm) |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1426 self.rollbackaction(undo) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1427 return newid |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1428 |
|
831
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1429 def index(self, nodeid): |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1430 Class.index(self, nodeid) |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1431 mimetype = self.get(nodeid, 'type') |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1432 if not mimetype: |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1433 mimetype = self.default_mime_type |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1434 self.db.indexer.add_text((self.classname, nodeid, 'content'), |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1435 self.get(nodeid, 'content'), mimetype) |
|
9a4aa0b107de
Updates to use Richard's cool new indexer.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
822
diff
changeset
|
1436 |
|
859
eb924e614934
Fixes for the metakit backend
Richard Jones <richard@users.sourceforge.net>
parents:
854
diff
changeset
|
1437 class IssueClass(Class, roundupdb.IssueClass): |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1438 ''' 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
|
1439 "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
|
1440 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
|
1441 "creation" or "activity" property, a ValueError is raised. |
|
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1442 ''' |
|
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1443 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
|
1444 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
|
1445 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
|
1446 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
|
1447 properties['messages'] = hyperdb.Multilink("msg") |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1448 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
|
1449 properties['files'] = hyperdb.Multilink("file") |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1450 if not properties.has_key('nosy'): |
| 1002 | 1451 # note: journalling is turned off as it really just wastes |
| 1452 # space. this behaviour may be overridden in an instance | |
| 1453 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
|
1454 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
|
1455 properties['superseder'] = hyperdb.Multilink(classname) |
|
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1456 Class.__init__(self, db, classname, **properties) |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1457 |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1458 CURVERSION = 2 |
|
820
d75ce81534db
Metakit backend. Metakit's home is equi4.com.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff
changeset
|
1459 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1460 class Indexer(indexer.Indexer): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1461 disallows = {'THE':1, 'THIS':1, 'ZZZ':1, 'THAT':1, 'WITH':1} |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1462 def __init__(self, path, datadb): |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1463 self.path = os.path.join(path, 'index.mk4') |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1464 self.db = metakit.storage(self.path, 1) |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1465 self.datadb = datadb |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1466 self.reindex = 0 |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1467 v = self.db.view('version') |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1468 if not v.structure(): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1469 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
|
1470 self.db.commit() |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1471 v.append(vers=CURVERSION) |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1472 self.reindex = 1 |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1473 elif v[0].vers != CURVERSION: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1474 v[0].vers = CURVERSION |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1475 self.reindex = 1 |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1476 if self.reindex: |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1477 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
|
1478 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
|
1479 self.db.commit() |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1480 self.reindex = 1 |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1481 self.changed = 0 |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1482 self.propcache = {} |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1483 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1484 def force_reindex(self): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1485 v = self.db.view('ids') |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1486 v[:] = [] |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1487 v = self.db.view('index') |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1488 v[:] = [] |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1489 self.db.commit() |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1490 self.reindex = 1 |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1491 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1492 def should_reindex(self): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1493 return self.reindex |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1494 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1495 def _getprops(self, classname): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1496 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
|
1497 if props is None: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1498 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
|
1499 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
|
1500 self.propcache[classname] = props |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1501 return props |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1502 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1503 def _getpropid(self, classname, propname): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1504 return self._getprops(classname).index(propname) |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1505 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1506 def _getpropname(self, classname, propid): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1507 return self._getprops(classname)[propid] |
| 1143 | 1508 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1509 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
|
1510 if mime_type != 'text/plain': |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1511 return |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1512 classname, nodeid, property = identifier |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1513 tbls = self.datadb.view('tables') |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1514 tblid = tbls.find(name=classname) |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1515 if tblid < 0: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1516 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
|
1517 nodeid = int(nodeid) |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1518 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
|
1519 ids = self.db.view('ids') |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1520 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
|
1521 if oldpos > -1: |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1522 ids[oldpos].ignore = 1 |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1523 self.changed = 1 |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1524 pos = ids.append(tblid=tblid,nodeid=nodeid,propid=propid) |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1525 |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1526 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
|
1527 words = {} |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1528 for word in wordlist: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1529 if not self.disallows.has_key(word): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1530 words[word] = 1 |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1531 words = words.keys() |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1532 |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1533 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
|
1534 for word in words: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1535 ndx = index.find(word=word) |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1536 if ndx < 0: |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1537 index.append(word=word) |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1538 ndx = index.find(word=word) |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1539 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
|
1540 self.changed = 1 |
| 1143 | 1541 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1542 def find(self, wordlist): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1543 hits = None |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1544 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
|
1545 for word in wordlist: |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1546 word = word.upper() |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1547 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
|
1548 continue |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1549 ndx = index.find(word=word) |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1550 if ndx < 0: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1551 return {} |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1552 if hits is None: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1553 hits = index[ndx].hits |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1554 else: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1555 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
|
1556 if len(hits) == 0: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1557 return {} |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1558 if hits is None: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1559 return {} |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1560 rslt = {} |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1561 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
|
1562 tbls = self.datadb.view('tables') |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1563 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
|
1564 hit = ids[i] |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1565 if not hit.ignore: |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1566 classname = tbls[hit.tblid].name |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1567 nodeid = str(hit.nodeid) |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1568 property = self._getpropname(classname, hit.propid) |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1569 rslt[i] = (classname, nodeid, property) |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1570 return rslt |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1571 |
|
892
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1572 def save_index(self): |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1573 if self.changed: |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1574 self.db.commit() |
|
44eb237a8b3e
An indexer that uses Metakit for storage.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
880
diff
changeset
|
1575 self.changed = 0 |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1576 |
|
1243
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1577 def rollback(self): |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1578 if self.changed: |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1579 self.db.rollback() |
|
3a028d2f7830
Fix (re)indexing & find in back_metakit.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
1232
diff
changeset
|
1580 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
|
1581 self.changed = 0 |
|
1333
80d27b7d6db5
implemented whole-database locking
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1582 |
