Mercurial > p > roundup > code
annotate roundup/backends/back_gadfly.py @ 1156:d0da32fbdedc
gadfly backend now complete
can handle schema changes in non-Multilinks (though only one at a time
at present)
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Mon, 16 Sep 2002 08:04:46 +0000 |
| parents | 81941abedb0a |
| children | 14467c765167 |
| rev | line source |
|---|---|
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
1 # $Id: back_gadfly.py,v 1.21 2002-09-16 08:04:46 richard Exp $ |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
2 __doc__ = ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
3 About Gadfly |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
4 ============ |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
5 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
6 Gadfly is a collection of python modules that provides relational |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
7 database functionality entirely implemented in Python. It supports a |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
8 subset of the intergalactic standard RDBMS Structured Query Language |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
9 SQL. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
10 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
11 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
12 Basic Structure |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
13 =============== |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
14 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
15 We map roundup classes to relational tables. Automatically detect schema |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
16 changes and modify the gadfly table schemas appropriately. Multilinks |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
17 (which represent a many-to-many relationship) are handled through |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
18 intermediate tables. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
19 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
20 Journals are stored adjunct to the per-class tables. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
22 Table names and columns have "_" prepended so the names can't |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
23 clash with restricted names (like "order"). Retirement is determined by the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
24 __retired__ column being true. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
25 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
26 All columns are defined as VARCHAR, since it really doesn't matter what |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
27 type they're defined as. We stuff all kinds of data in there ;) [as long as |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
28 it's marshallable, gadfly doesn't care] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
29 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
30 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
31 Additional Instance Requirements |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
32 ================================ |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
33 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 The instance configuration must specify where the database is. It does this |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 with GADFLY_DATABASE, which is used as the arguments to the gadfly.gadfly() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 method: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 Using an on-disk database directly (not a good idea): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
39 GADFLY_DATABASE = (database name, directory) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
40 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 Using a network database (much better idea): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
42 GADFLY_DATABASE = (policy, password, address, port) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
43 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 Because multiple accesses directly to a gadfly database aren't handled, but |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
45 multiple network accesses are, it's strongly advised that the latter setup be |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
46 used. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
47 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
48 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
49 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
50 # standard python modules |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
51 import sys, os, time, re, errno, weakref, copy |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
52 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
53 # roundup modules |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
54 from roundup import hyperdb, date, password, roundupdb, security |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
55 from roundup.hyperdb import String, Password, Date, Interval, Link, \ |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
56 Multilink, DatabaseError, Boolean, Number |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
57 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
58 # the all-important gadfly :) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
59 import gadfly |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
60 import gadfly.client |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
61 import gadfly.database |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
62 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
63 # support |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 from blobfiles import FileStorage |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
65 from roundup.indexer import Indexer |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
66 from sessions import Sessions |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
67 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
68 class Database(FileStorage, hyperdb.Database, roundupdb.Database): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
69 # flag to set on retired entries |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
70 RETIRED_FLAG = '__hyperdb_retired' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
71 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
72 def __init__(self, config, journaltag=None): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
73 ''' Open the database and load the schema from it. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
74 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
75 self.config, self.journaltag = config, journaltag |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 self.dir = config.DATABASE |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
77 self.classes = {} |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
78 self.indexer = Indexer(self.dir) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
79 self.sessions = Sessions(self.config) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
80 self.security = security.Security(self) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
81 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
82 # additional transaction support for external files and the like |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
83 self.transactions = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
84 |
|
1109
0971a614ff1b
default value for GADFLY_DATABASE
Richard Jones <richard@users.sourceforge.net>
parents:
1088
diff
changeset
|
85 db = getattr(config, 'GADFLY_DATABASE', ('database', self.dir)) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
86 if len(db) == 2: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
87 # ensure files are group readable and writable |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
88 os.umask(0002) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
89 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
90 self.conn = gadfly.gadfly(*db) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
91 except IOError, error: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
92 if error.errno != errno.ENOENT: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
93 raise |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
94 self.database_schema = {} |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
95 self.conn = gadfly.gadfly() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
96 self.conn.startup(*db) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
97 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
98 cursor.execute('create table schema (schema varchar)') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
99 cursor.execute('create table ids (name varchar, num integer)') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
100 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
101 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
102 cursor.execute('select schema from schema') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
103 self.database_schema = cursor.fetchone()[0] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
104 else: |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
105 self.conn = gadfly.client.gfclient(*db) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
106 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
107 cursor.execute('select schema from schema') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
108 self.database_schema = cursor.fetchone()[0] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
109 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
110 def __repr__(self): |
|
1032
dd51e435fa9e
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
1025
diff
changeset
|
111 return '<roundfly 0x%x>'%id(self) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
112 |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
113 def post_init(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
114 ''' Called once the schema initialisation has finished. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
115 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
116 We should now confirm that the schema defined by our "classes" |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
117 attribute actually matches the schema in the database. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
118 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
119 # now detect changes in the schema |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
120 for classname, spec in self.classes.items(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
121 if self.database_schema.has_key(classname): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
122 dbspec = self.database_schema[classname] |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
123 self.update_class(spec, dbspec) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
124 self.database_schema[classname] = spec.schema() |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
125 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
126 self.create_class(spec) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
127 self.database_schema[classname] = spec.schema() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
128 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
129 for classname in self.database_schema.keys(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
130 if not self.classes.has_key(classname): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
131 self.drop_class(classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
132 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
133 # update the database version of the schema |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
134 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
135 cursor.execute('delete from schema') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
136 cursor.execute('insert into schema values (?)', (self.database_schema,)) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
137 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
138 # reindex the db if necessary |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
139 if self.indexer.should_reindex(): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
140 self.reindex() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
141 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
142 # commit |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
143 self.conn.commit() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
144 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
145 def reindex(self): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
146 for klass in self.classes.values(): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
147 for nodeid in klass.list(): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
148 klass.index(nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
149 self.indexer.save_index() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
150 |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
151 def determine_columns(self, properties): |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
152 ''' Figure the column names and multilink properties from the spec |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
153 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
154 "properties" is a list of (name, prop) where prop may be an |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
155 instance of a hyperdb "type" _or_ a string repr of that type. |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
156 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
157 cols = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
158 mls = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
159 # add the multilinks separately |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
160 for col, prop in properties: |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
161 if isinstance(prop, Multilink): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
162 mls.append(col) |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
163 elif isinstance(prop, type('')) and prop.find('Multilink') != -1: |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
164 mls.append(col) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
165 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
166 cols.append('_'+col) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
167 cols.sort() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
168 return cols, mls |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
169 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
170 def update_class(self, spec, dbspec): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
171 ''' Determine the differences between the current spec and the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
172 database version of the spec, and update where necessary |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
173 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
174 spec_schema = spec.schema() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
175 if spec_schema == dbspec: |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
176 return |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
177 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
178 print >>hyperdb.DEBUG, 'update_class FIRING' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
179 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
180 # key property changed? |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
181 if dbspec[0] != spec_schema[0]: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
182 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
183 print >>hyperdb.DEBUG, 'update_class setting keyprop', `spec[0]` |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
184 # XXX turn on indexing for the key property |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
185 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
186 # dict 'em up |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
187 spec_propnames,spec_props = [],{} |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
188 for propname,prop in spec_schema[1]: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
189 spec_propnames.append(propname) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
190 spec_props[propname] = prop |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
191 dbspec_propnames,dbspec_props = [],{} |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
192 for propname,prop in dbspec[1]: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
193 dbspec_propnames.append(propname) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
194 dbspec_props[propname] = prop |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
195 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
196 # we're going to need one of these |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
197 cursor = self.conn.cursor() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
198 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
199 # now compare |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
200 for propname in spec_propnames: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
201 prop = spec_props[propname] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
202 if dbspec_props.has_key(propname) and prop==dbspec_props[propname]: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
203 continue |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
204 if __debug__: |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
205 print >>hyperdb.DEBUG, 'update_class ADD', (propname, prop) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
206 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
207 if not dbspec_props.has_key(propname): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
208 # add the property |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
209 if isinstance(prop, Multilink): |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
210 # all we have to do here is create a new table, easy! |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
211 self.create_multilink_table(cursor, spec, propname) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
212 continue |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
213 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
214 # no ALTER TABLE, so we: |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
215 # 1. pull out the data, including an extra None column |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
216 oldcols, x = self.determine_columns(dbspec[1]) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
217 oldcols.append('id') |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
218 oldcols.append('__retired__') |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
219 cn = spec.classname |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
220 sql = 'select %s,? from _%s'%(','.join(oldcols), cn) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
221 if __debug__: |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
222 print >>hyperdb.DEBUG, 'update_class', (self, sql, None) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
223 cursor.execute(sql, (None,)) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
224 olddata = cursor.fetchall() |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
225 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
226 # 2. drop the old table |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
227 cursor.execute('drop table _%s'%cn) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
228 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
229 # 3. create the new table |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
230 cols, mls = self.create_class_table(cursor, spec) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
231 # ensure the new column is last |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
232 cols.remove('_'+propname) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
233 assert oldcols == cols, "Column lists don't match!" |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
234 cols.append('_'+propname) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
235 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
236 # 4. populate with the data from step one |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
237 s = ','.join(['?' for x in cols]) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
238 scols = ','.join(cols) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
239 sql = 'insert into _%s (%s) values (%s)'%(cn, scols, s) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
240 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
241 # GAH, nothing had better go wrong from here on in... but |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
242 # we have to commit the drop... |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
243 self.conn.commit() |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
244 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
245 # we're safe to insert now |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
246 if __debug__: |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
247 print >>hyperdb.DEBUG, 'update_class', (self, sql, olddata) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
248 cursor.execute(sql, olddata) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
249 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
250 else: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
251 # modify the property |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
252 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
253 print >>hyperdb.DEBUG, 'update_class NOOP' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
254 pass # NOOP in gadfly |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
255 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
256 # and the other way - only worry about deletions here |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
257 for propname in dbspec_propnames: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
258 prop = dbspec_props[propname] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
259 if spec_props.has_key(propname): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
260 continue |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
261 if __debug__: |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
262 print >>hyperdb.DEBUG, 'update_class REMOVE', `prop` |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
263 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
264 # delete the property |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
265 if isinstance(prop, Multilink): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
266 sql = 'drop table %s_%s'%(spec.classname, prop) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
267 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
268 print >>hyperdb.DEBUG, 'update_class', (self, sql) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
269 cursor.execute(sql) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
270 else: |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
271 # no ALTER TABLE, so we: |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
272 # 1. pull out the data, excluding the removed column |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
273 oldcols, x = self.determine_columns(spec.properties.items()) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
274 oldcols.append('id') |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
275 oldcols.append('__retired__') |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
276 # remove the missing column |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
277 oldcols.remove('_'+propname) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
278 cn = spec.classname |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
279 sql = 'select %s from _%s'%(','.join(oldcols), cn) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
280 cursor.execute(sql, (None,)) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
281 olddata = sql.fetchall() |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
282 |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
283 # 2. drop the old table |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
284 cursor.execute('drop table _%s'%cn) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
285 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
286 # 3. create the new table |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
287 cols, mls = self.create_class_table(self, cursor, spec) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
288 assert oldcols != cols, "Column lists don't match!" |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
289 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
290 # 4. populate with the data from step one |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
291 qs = ','.join(['?' for x in cols]) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
292 sql = 'insert into _%s values (%s)'%(cn, s) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
293 cursor.execute(sql, olddata) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
294 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
295 def create_class_table(self, cursor, spec): |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
296 ''' create the class table for the given spec |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
297 ''' |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
298 cols, mls = self.determine_columns(spec.properties.items()) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
299 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
300 # add on our special columns |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
301 cols.append('id') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
302 cols.append('__retired__') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
303 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
304 # create the base table |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
305 scols = ','.join(['%s varchar'%x for x in cols]) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
306 sql = 'create table _%s (%s)'%(spec.classname, scols) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
307 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
308 print >>hyperdb.DEBUG, 'create_class', (self, sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
309 cursor.execute(sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
310 |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
311 return cols, mls |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
312 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
313 def create_journal_table(self, cursor, spec): |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
314 ''' create the journal table for a class given the spec and |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
315 already-determined cols |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
316 ''' |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
317 # journal table |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
318 cols = ','.join(['%s varchar'%x |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
319 for x in 'nodeid date tag action params'.split()]) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
320 sql = 'create table %s__journal (%s)'%(spec.classname, cols) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
321 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
322 print >>hyperdb.DEBUG, 'create_class', (self, sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
323 cursor.execute(sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
324 |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
325 def create_multilink_table(self, cursor, spec, ml): |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
326 ''' Create a multilink table for the "ml" property of the class |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
327 given by the spec |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
328 ''' |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
329 sql = 'create table %s_%s (linkid varchar, nodeid varchar)'%( |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
330 spec.classname, ml) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
331 if __debug__: |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
332 print >>hyperdb.DEBUG, 'create_class', (self, sql) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
333 cursor.execute(sql) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
334 |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
335 def create_class(self, spec): |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
336 ''' Create a database table according to the given spec. |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
337 ''' |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
338 cursor = self.conn.cursor() |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
339 cols, mls = self.create_class_table(cursor, spec) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
340 self.create_journal_table(cursor, spec) |
|
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
341 |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
342 # now create the multilink tables |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
343 for ml in mls: |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
344 self.create_multilink_table(cursor, spec, ml) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
345 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
346 # ID counter |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
347 sql = 'insert into ids (name, num) values (?,?)' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
348 vals = (spec.classname, 1) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
349 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
350 print >>hyperdb.DEBUG, 'create_class', (self, sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
351 cursor.execute(sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
352 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
353 def drop_class(self, spec): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
354 ''' Drop the given table from the database. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
355 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
356 Drop the journal and multilink tables too. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
357 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
358 # figure the multilinks |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
359 mls = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
360 for col, prop in spec.properties.items(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
361 if isinstance(prop, Multilink): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
362 mls.append(col) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
363 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
364 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
365 sql = 'drop table _%s'%spec.classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
366 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
367 print >>hyperdb.DEBUG, 'drop_class', (self, sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
368 cursor.execute(sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
369 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
370 sql = 'drop table %s__journal'%spec.classname |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
371 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
372 print >>hyperdb.DEBUG, 'drop_class', (self, sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
373 cursor.execute(sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
374 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
375 for ml in mls: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
376 sql = 'drop table %s_%s'%(spec.classname, ml) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
377 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
378 print >>hyperdb.DEBUG, 'drop_class', (self, sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
379 cursor.execute(sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
380 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
381 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
382 # Classes |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
383 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
384 def __getattr__(self, classname): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
385 ''' A convenient way of calling self.getclass(classname). |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
386 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
387 if self.classes.has_key(classname): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
388 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
389 print >>hyperdb.DEBUG, '__getattr__', (self, classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
390 return self.classes[classname] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
391 raise AttributeError, classname |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
392 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
393 def addclass(self, cl): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
394 ''' Add a Class to the hyperdatabase. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
395 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
396 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
397 print >>hyperdb.DEBUG, 'addclass', (self, cl) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
398 cn = cl.classname |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
399 if self.classes.has_key(cn): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
400 raise ValueError, cn |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
401 self.classes[cn] = cl |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
402 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
403 def getclasses(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
404 ''' Return a list of the names of all existing classes. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
405 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
406 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
407 print >>hyperdb.DEBUG, 'getclasses', (self,) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
408 l = self.classes.keys() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
409 l.sort() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
410 return l |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
411 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
412 def getclass(self, classname): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
413 '''Get the Class object representing a particular class. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
414 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
415 If 'classname' is not a valid class name, a KeyError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
416 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
417 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
418 print >>hyperdb.DEBUG, 'getclass', (self, classname) |
|
1145
81941abedb0a
nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents:
1143
diff
changeset
|
419 try: |
|
81941abedb0a
nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents:
1143
diff
changeset
|
420 return self.classes[classname] |
|
81941abedb0a
nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents:
1143
diff
changeset
|
421 except KeyError: |
|
81941abedb0a
nicer error message for invalid class lookup
Richard Jones <richard@users.sourceforge.net>
parents:
1143
diff
changeset
|
422 raise KeyError, 'There is no class called "%s"'%classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
423 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
424 def clear(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
425 ''' Delete all database contents. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
426 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
427 Note: I don't commit here, which is different behaviour to the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
428 "nuke from orbit" behaviour in the *dbms. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
429 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
430 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
431 print >>hyperdb.DEBUG, 'clear', (self,) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
432 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
433 for cn in self.classes.keys(): |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
434 sql = 'delete from _%s'%cn |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
435 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
436 print >>hyperdb.DEBUG, 'clear', (self, sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
437 cursor.execute(sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
438 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
439 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
440 # Node IDs |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
441 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
442 def newid(self, classname): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
443 ''' Generate a new id for the given class |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
444 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
445 # get the next ID |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
446 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
447 sql = 'select num from ids where name=?' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
448 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
449 print >>hyperdb.DEBUG, 'newid', (self, sql, classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
450 cursor.execute(sql, (classname, )) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
451 newid = cursor.fetchone()[0] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
452 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
453 # update the counter |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
454 sql = 'update ids set num=? where name=?' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
455 vals = (newid+1, classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
456 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
457 print >>hyperdb.DEBUG, 'newid', (self, sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
458 cursor.execute(sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
459 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
460 # return as string |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
461 return str(newid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
462 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
463 def setid(self, classname, setid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
464 ''' Set the id counter: used during import of database |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
465 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
466 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
467 sql = 'update ids set num=? where name=?' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
468 vals = (setid, spec.classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
469 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
470 print >>hyperdb.DEBUG, 'setid', (self, sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
471 cursor.execute(sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
472 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
473 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
474 # Nodes |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
475 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
476 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
477 def addnode(self, classname, nodeid, node): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
478 ''' Add the specified node to its class's db. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
479 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
480 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
481 print >>hyperdb.DEBUG, 'addnode', (self, classname, nodeid, node) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
482 # gadfly requires values for all non-multilink columns |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
483 cl = self.classes[classname] |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
484 cols, mls = self.determine_columns(cl.properties.items()) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
485 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
486 # default the non-multilink columns |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
487 for col, prop in cl.properties.items(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
488 if not isinstance(col, Multilink): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
489 if not node.has_key(col): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
490 node[col] = None |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
491 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
492 node = self.serialise(classname, node) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
493 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
494 # make sure the ordering is correct for column name -> column value |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
495 vals = tuple([node[col[1:]] for col in cols]) + (nodeid, 0) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
496 s = ','.join(['?' for x in cols]) + ',?,?' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
497 cols = ','.join(cols) + ',id,__retired__' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
498 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
499 # perform the inserts |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
500 cursor = self.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
501 sql = 'insert into _%s (%s) values (%s)'%(classname, cols, s) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
502 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
503 print >>hyperdb.DEBUG, 'addnode', (self, sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
504 cursor.execute(sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
505 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
506 # insert the multilink rows |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
507 for col in mls: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
508 t = '%s_%s'%(classname, col) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
509 for entry in node[col]: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
510 sql = 'insert into %s (linkid, nodeid) values (?,?)'%t |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
511 vals = (entry, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
512 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
513 print >>hyperdb.DEBUG, 'addnode', (self, sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
514 cursor.execute(sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
515 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
516 # make sure we do the commit-time extra stuff for this node |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
517 self.transactions.append((self.doSaveNode, (classname, nodeid, node))) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
518 |
|
976
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
519 def setnode(self, classname, nodeid, node, multilink_changes): |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
520 ''' Change the specified node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
521 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
522 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
523 print >>hyperdb.DEBUG, 'setnode', (self, classname, nodeid, node) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
524 node = self.serialise(classname, node) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
525 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
526 cl = self.classes[classname] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
527 cols = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
528 mls = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
529 # add the multilinks separately |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
530 for col in node.keys(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
531 prop = cl.properties[col] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
532 if isinstance(prop, Multilink): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
533 mls.append(col) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
534 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
535 cols.append('_'+col) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
536 cols.sort() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
537 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
538 # make sure the ordering is correct for column name -> column value |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
539 vals = tuple([node[col[1:]] for col in cols]) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
540 s = ','.join(['%s=?'%x for x in cols]) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
541 cols = ','.join(cols) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
542 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
543 # perform the update |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
544 cursor = self.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
545 sql = 'update _%s set %s'%(classname, s) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
546 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
547 print >>hyperdb.DEBUG, 'setnode', (self, sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
548 cursor.execute(sql, vals) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
549 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
550 # now the fun bit, updating the multilinks ;) |
|
976
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
551 for col, (add, remove) in multilink_changes.items(): |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
552 tn = '%s_%s'%(classname, col) |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
553 if add: |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
554 sql = 'insert into %s (nodeid, linkid) values (?,?)'%tn |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
555 vals = [(nodeid, addid) for addid in add] |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
556 if __debug__: |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
557 print >>hyperdb.DEBUG, 'setnode (add)', (self, sql, vals) |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
558 cursor.execute(sql, vals) |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
559 if remove: |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
560 sql = 'delete from %s where nodeid=? and linkid=?'%tn |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
561 vals = [(nodeid, removeid) for removeid in remove] |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
562 if __debug__: |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
563 print >>hyperdb.DEBUG, 'setnode (rem)', (self, sql, vals) |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
564 cursor.execute(sql, vals) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
565 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
566 # make sure we do the commit-time extra stuff for this node |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
567 self.transactions.append((self.doSaveNode, (classname, nodeid, node))) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
568 |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
569 def getnode(self, classname, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
570 ''' Get a node from the database. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
571 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
572 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
573 print >>hyperdb.DEBUG, 'getnode', (self, classname, nodeid) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
574 # figure the columns we're fetching |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
575 cl = self.classes[classname] |
|
1156
d0da32fbdedc
gadfly backend now complete
Richard Jones <richard@users.sourceforge.net>
parents:
1145
diff
changeset
|
576 cols, mls = self.determine_columns(cl.properties.items()) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
577 scols = ','.join(cols) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
578 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
579 # perform the basic property fetch |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
580 cursor = self.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
581 sql = 'select %s from _%s where id=?'%(scols, classname) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
582 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
583 print >>hyperdb.DEBUG, 'getnode', (self, sql, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
584 cursor.execute(sql, (nodeid,)) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
585 try: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
586 values = cursor.fetchone() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
587 except gadfly.database.error, message: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
588 if message == 'no more results': |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
589 raise IndexError, 'no such %s node %s'%(classname, nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
590 raise |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
591 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
592 # make up the node |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
593 node = {} |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
594 for col in range(len(cols)): |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
595 node[cols[col][1:]] = values[col] |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
596 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
597 # now the multilinks |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
598 for col in mls: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
599 # get the link ids |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
600 sql = 'select linkid from %s_%s where nodeid=?'%(classname, col) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
601 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
602 print >>hyperdb.DEBUG, 'getnode', (self, sql, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
603 cursor.execute(sql, (nodeid,)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
604 # extract the first column from the result |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
605 node[col] = [x[0] for x in cursor.fetchall()] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
606 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
607 return self.unserialise(classname, node) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
608 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
609 def destroynode(self, classname, nodeid): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
610 '''Remove a node from the database. Called exclusively by the |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
611 destroy() method on Class. |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
612 ''' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
613 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
614 print >>hyperdb.DEBUG, 'destroynode', (self, classname, nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
615 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
616 # make sure the node exists |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
617 if not self.hasnode(classname, nodeid): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
618 raise IndexError, '%s has no node %s'%(classname, nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
619 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
620 # see if there's any obvious commit actions that we should get rid of |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
621 for entry in self.transactions[:]: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
622 if entry[1][:2] == (classname, nodeid): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
623 self.transactions.remove(entry) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
624 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
625 # now do the SQL |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
626 cursor = self.conn.cursor() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
627 sql = 'delete from _%s where id=?'%(classname) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
628 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
629 print >>hyperdb.DEBUG, 'destroynode', (self, sql, nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
630 cursor.execute(sql, (nodeid,)) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
631 |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
632 def serialise(self, classname, node): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
633 '''Copy the node contents, converting non-marshallable data into |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
634 marshallable data. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
635 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
636 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
637 print >>hyperdb.DEBUG, 'serialise', classname, node |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
638 properties = self.getclass(classname).getprops() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
639 d = {} |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
640 for k, v in node.items(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
641 # if the property doesn't exist, or is the "retired" flag then |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
642 # it won't be in the properties dict |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
643 if not properties.has_key(k): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
644 d[k] = v |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
645 continue |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
646 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
647 # get the property spec |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
648 prop = properties[k] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
649 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
650 if isinstance(prop, Password): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
651 d[k] = str(v) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
652 elif isinstance(prop, Date) and v is not None: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
653 d[k] = v.serialise() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
654 elif isinstance(prop, Interval) and v is not None: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
655 d[k] = v.serialise() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
656 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
657 d[k] = v |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
658 return d |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
659 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
660 def unserialise(self, classname, node): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
661 '''Decode the marshalled node data |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
662 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
663 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
664 print >>hyperdb.DEBUG, 'unserialise', classname, node |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
665 properties = self.getclass(classname).getprops() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
666 d = {} |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
667 for k, v in node.items(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
668 # if the property doesn't exist, or is the "retired" flag then |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
669 # it won't be in the properties dict |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
670 if not properties.has_key(k): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
671 d[k] = v |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
672 continue |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
673 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
674 # get the property spec |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
675 prop = properties[k] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
676 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
677 if isinstance(prop, Date) and v is not None: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
678 d[k] = date.Date(v) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
679 elif isinstance(prop, Interval) and v is not None: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
680 d[k] = date.Interval(v) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
681 elif isinstance(prop, Password): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
682 p = password.Password() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
683 p.unpack(v) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
684 d[k] = p |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
685 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
686 d[k] = v |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
687 return d |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
688 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
689 def hasnode(self, classname, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
690 ''' Determine if the database has a given node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
691 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
692 cursor = self.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
693 sql = 'select count(*) from _%s where id=?'%classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
694 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
695 print >>hyperdb.DEBUG, 'hasnode', (self, sql, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
696 cursor.execute(sql, (nodeid,)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
697 return cursor.fetchone()[0] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
698 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
699 def countnodes(self, classname): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
700 ''' Count the number of nodes that exist for a particular Class. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
701 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
702 cursor = self.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
703 sql = 'select count(*) from _%s'%classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
704 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
705 print >>hyperdb.DEBUG, 'countnodes', (self, sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
706 cursor.execute(sql) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
707 return cursor.fetchone()[0] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
708 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
709 def getnodeids(self, classname, retired=0): |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
710 ''' Retrieve all the ids of the nodes for a particular Class. |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
711 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
712 Set retired=None to get all nodes. Otherwise it'll get all the |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
713 retired or non-retired nodes, depending on the flag. |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
714 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
715 cursor = self.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
716 # flip the sense of the flag if we don't want all of them |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
717 if retired is not None: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
718 retired = not retired |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
719 sql = 'select id from _%s where __retired__ <> ?'%classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
720 if __debug__: |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
721 print >>hyperdb.DEBUG, 'getnodeids', (self, sql, retired) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
722 cursor.execute(sql, (retired,)) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
723 return [x[0] for x in cursor.fetchall()] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
724 |
| 1143 | 725 def addjournal(self, classname, nodeid, action, params, creator=None, |
| 726 creation=None): | |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
727 ''' Journal the Action |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
728 'action' may be: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
729 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
730 'create' or 'set' -- 'params' is a dictionary of property values |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
731 'link' or 'unlink' -- 'params' is (classname, nodeid, propname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
732 'retire' -- 'params' is None |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
733 ''' |
| 1143 | 734 # serialise the parameters now if necessary |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
735 if isinstance(params, type({})): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
736 if action in ('set', 'create'): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
737 params = self.serialise(classname, params) |
| 1143 | 738 |
| 739 # handle supply of the special journalling parameters (usually | |
| 740 # supplied on importing an existing database) | |
| 741 if creator: | |
| 742 journaltag = creator | |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
743 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
744 journaltag = self.journaltag |
| 1143 | 745 if creation: |
| 746 journaldate = creation.serialise() | |
| 747 else: | |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
748 journaldate = date.Date().serialise() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
749 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
750 # create the journal entry |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
751 cols = ','.join('nodeid date tag action params'.split()) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
752 entry = (nodeid, journaldate, journaltag, action, params) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
753 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
754 if __debug__: |
| 1143 | 755 print >>hyperdb.DEBUG, 'addjournal', entry |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
756 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
757 # do the insert |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
758 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
759 sql = 'insert into %s__journal (%s) values (?,?,?,?,?)'%(classname, |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
760 cols) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
761 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
762 print >>hyperdb.DEBUG, 'addjournal', (self, sql, entry) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
763 cursor.execute(sql, entry) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
764 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
765 def getjournal(self, classname, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
766 ''' get the journal for id |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
767 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
768 # make sure the node exists |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
769 if not self.hasnode(classname, nodeid): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
770 raise IndexError, '%s has no node %s'%(classname, nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
771 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
772 # now get the journal entries |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
773 cols = ','.join('nodeid date tag action params'.split()) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
774 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
775 sql = 'select %s from %s__journal where nodeid=?'%(cols, classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
776 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
777 print >>hyperdb.DEBUG, 'getjournal', (self, sql, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
778 cursor.execute(sql, (nodeid,)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
779 res = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
780 for nodeid, date_stamp, user, action, params in cursor.fetchall(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
781 res.append((nodeid, date.Date(date_stamp), user, action, params)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
782 return res |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
783 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
784 def pack(self, pack_before): |
|
974
84216d63ed9c
ahhh, I understand now
Richard Jones <richard@users.sourceforge.net>
parents:
972
diff
changeset
|
785 ''' Delete all journal entries except "create" before 'pack_before'. |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
786 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
787 # get a 'yyyymmddhhmmss' version of the date |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
788 date_stamp = pack_before.serialise() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
789 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
790 # do the delete |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
791 cursor = self.conn.cursor() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
792 for classname in self.classes.keys(): |
|
974
84216d63ed9c
ahhh, I understand now
Richard Jones <richard@users.sourceforge.net>
parents:
972
diff
changeset
|
793 sql = "delete from %s__journal where date<? and "\ |
|
84216d63ed9c
ahhh, I understand now
Richard Jones <richard@users.sourceforge.net>
parents:
972
diff
changeset
|
794 "action<>'create'"%classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
795 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
796 print >>hyperdb.DEBUG, 'pack', (self, sql, date_stamp) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
797 cursor.execute(sql, (date_stamp,)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
798 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
799 def commit(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
800 ''' Commit the current transactions. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
801 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
802 Save all data changed since the database was opened or since the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
803 last commit() or rollback(). |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
804 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
805 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
806 print >>hyperdb.DEBUG, 'commit', (self,) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
807 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
808 # commit gadfly |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
809 self.conn.commit() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
810 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
811 # now, do all the other transaction stuff |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
812 reindex = {} |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
813 for method, args in self.transactions: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
814 reindex[method(*args)] = 1 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
815 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
816 # reindex the nodes that request it |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
817 for classname, nodeid in filter(None, reindex.keys()): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
818 print >>hyperdb.DEBUG, 'commit.reindex', (classname, nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
819 self.getclass(classname).index(nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
820 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
821 # save the indexer state |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
822 self.indexer.save_index() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
823 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
824 # clear out the transactions |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
825 self.transactions = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
826 |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
827 def rollback(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
828 ''' Reverse all actions from the current transaction. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
829 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
830 Undo all the changes made since the database was opened or the last |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
831 commit() or rollback() was performed. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
832 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
833 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
834 print >>hyperdb.DEBUG, 'rollback', (self,) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
835 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
836 # roll back gadfly |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
837 self.conn.rollback() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
838 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
839 # roll back "other" transaction stuff |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
840 for method, args in self.transactions: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
841 # delete temporary files |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
842 if method == self.doStoreFile: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
843 self.rollbackStoreFile(*args) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
844 self.transactions = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
845 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
846 def doSaveNode(self, classname, nodeid, node): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
847 ''' dummy that just generates a reindex event |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
848 ''' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
849 # return the classname, nodeid so we reindex this content |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
850 return (classname, nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
851 |
|
1131
92e92ae58494
add close() methods where they are missing!
Richard Jones <richard@users.sourceforge.net>
parents:
1127
diff
changeset
|
852 def close(self): |
|
92e92ae58494
add close() methods where they are missing!
Richard Jones <richard@users.sourceforge.net>
parents:
1127
diff
changeset
|
853 ''' Close off the connection. |
|
92e92ae58494
add close() methods where they are missing!
Richard Jones <richard@users.sourceforge.net>
parents:
1127
diff
changeset
|
854 ''' |
|
92e92ae58494
add close() methods where they are missing!
Richard Jones <richard@users.sourceforge.net>
parents:
1127
diff
changeset
|
855 self.conn.close() |
|
92e92ae58494
add close() methods where they are missing!
Richard Jones <richard@users.sourceforge.net>
parents:
1127
diff
changeset
|
856 |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
857 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
858 # The base Class class |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
859 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
860 class Class(hyperdb.Class): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
861 ''' The handle to a particular class of nodes in a hyperdatabase. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
862 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
863 All methods except __repr__ and getnode must be implemented by a |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
864 concrete backend Class. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
865 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
866 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
867 def __init__(self, db, classname, **properties): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
868 '''Create a new class with a given name and property specification. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
869 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
870 'classname' must not collide with the name of an existing class, |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
871 or a ValueError is raised. The keyword arguments in 'properties' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
872 must map names to property objects, or a TypeError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
873 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
874 if (properties.has_key('creation') or properties.has_key('activity') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
875 or properties.has_key('creator')): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
876 raise ValueError, '"creation", "activity" and "creator" are '\ |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
877 'reserved' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
878 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
879 self.classname = classname |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
880 self.properties = properties |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
881 self.db = weakref.proxy(db) # use a weak ref to avoid circularity |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
882 self.key = '' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
883 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
884 # should we journal changes (default yes) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
885 self.do_journal = 1 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
886 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
887 # do the db-related init stuff |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
888 db.addclass(self) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
889 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
890 self.auditors = {'create': [], 'set': [], 'retire': []} |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
891 self.reactors = {'create': [], 'set': [], 'retire': []} |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
892 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
893 def schema(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
894 ''' A dumpable version of the schema that we can store in the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
895 database |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
896 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
897 return (self.key, [(x, repr(y)) for x,y in self.properties.items()]) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
898 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
899 def enableJournalling(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
900 '''Turn journalling on for this class |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
901 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
902 self.do_journal = 1 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
903 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
904 def disableJournalling(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
905 '''Turn journalling off for this class |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
906 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
907 self.do_journal = 0 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
908 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
909 # Editing nodes: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
910 def create(self, **propvalues): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
911 ''' Create a new node of this class and return its id. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
912 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
913 The keyword arguments in 'propvalues' map property names to values. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
914 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
915 The values of arguments must be acceptable for the types of their |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
916 corresponding properties or a TypeError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
917 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
918 If this class has a key property, it must be present and its value |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
919 must not collide with other key strings or a ValueError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
920 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
921 Any other properties on this class that are missing from the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
922 'propvalues' dictionary are set to None. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
923 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
924 If an id in a link or multilink property does not refer to a valid |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
925 node, an IndexError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
926 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
927 if propvalues.has_key('id'): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
928 raise KeyError, '"id" is reserved' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
929 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
930 if self.db.journaltag is None: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
931 raise DatabaseError, 'Database open read-only' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
932 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
933 if propvalues.has_key('creation') or propvalues.has_key('activity'): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
934 raise KeyError, '"creation" and "activity" are reserved' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
935 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
936 self.fireAuditors('create', None, propvalues) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
937 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
938 # new node's id |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
939 newid = self.db.newid(self.classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
940 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
941 # validate propvalues |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
942 num_re = re.compile('^\d+$') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
943 for key, value in propvalues.items(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
944 if key == self.key: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
945 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
946 self.lookup(value) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
947 except KeyError: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
948 pass |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
949 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
950 raise ValueError, 'node with key "%s" exists'%value |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
951 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
952 # try to handle this property |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
953 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
954 prop = self.properties[key] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
955 except KeyError: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
956 raise KeyError, '"%s" has no property "%s"'%(self.classname, |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
957 key) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
958 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
959 if value is not None and isinstance(prop, Link): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
960 if type(value) != type(''): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
961 raise ValueError, 'link value must be String' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
962 link_class = self.properties[key].classname |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
963 # if it isn't a number, it's a key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
964 if not num_re.match(value): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
965 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
966 value = self.db.classes[link_class].lookup(value) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
967 except (TypeError, KeyError): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
968 raise IndexError, 'new property "%s": %s not a %s'%( |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
969 key, value, link_class) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
970 elif not self.db.getclass(link_class).hasnode(value): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
971 raise IndexError, '%s has no node %s'%(link_class, value) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
972 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
973 # save off the value |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
974 propvalues[key] = value |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
975 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
976 # register the link with the newly linked node |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
977 if self.do_journal and self.properties[key].do_journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
978 self.db.addjournal(link_class, value, 'link', |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
979 (self.classname, newid, key)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
980 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
981 elif isinstance(prop, Multilink): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
982 if type(value) != type([]): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
983 raise TypeError, 'new property "%s" not a list of ids'%key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
984 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
985 # clean up and validate the list of links |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
986 link_class = self.properties[key].classname |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
987 l = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
988 for entry in value: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
989 if type(entry) != type(''): |
| 1049 | 990 raise ValueError, '"%s" multilink value (%r) '\ |
|
1045
0564eb2f4bda
better error message
Richard Jones <richard@users.sourceforge.net>
parents:
1038
diff
changeset
|
991 'must contain Strings'%(key, value) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
992 # if it isn't a number, it's a key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
993 if not num_re.match(entry): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
994 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
995 entry = self.db.classes[link_class].lookup(entry) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
996 except (TypeError, KeyError): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
997 raise IndexError, 'new property "%s": %s not a %s'%( |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
998 key, entry, self.properties[key].classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
999 l.append(entry) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1000 value = l |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1001 propvalues[key] = value |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1002 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1003 # handle additions |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1004 for nodeid in value: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1005 if not self.db.getclass(link_class).hasnode(nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1006 raise IndexError, '%s has no node %s'%(link_class, |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1007 nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1008 # register the link with the newly linked node |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1009 if self.do_journal and self.properties[key].do_journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1010 self.db.addjournal(link_class, nodeid, 'link', |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1011 (self.classname, newid, key)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1012 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1013 elif isinstance(prop, String): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1014 if type(value) != type(''): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1015 raise TypeError, 'new property "%s" not a string'%key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1016 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1017 elif isinstance(prop, Password): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1018 if not isinstance(value, password.Password): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1019 raise TypeError, 'new property "%s" not a Password'%key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1020 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1021 elif isinstance(prop, Date): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1022 if value is not None and not isinstance(value, date.Date): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1023 raise TypeError, 'new property "%s" not a Date'%key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1024 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1025 elif isinstance(prop, Interval): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1026 if value is not None and not isinstance(value, date.Interval): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1027 raise TypeError, 'new property "%s" not an Interval'%key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1028 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1029 elif value is not None and isinstance(prop, Number): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1030 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1031 float(value) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1032 except ValueError: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1033 raise TypeError, 'new property "%s" not numeric'%key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1034 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1035 elif value is not None and isinstance(prop, Boolean): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1036 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1037 int(value) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1038 except ValueError: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1039 raise TypeError, 'new property "%s" not boolean'%key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1040 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1041 # make sure there's data where there needs to be |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1042 for key, prop in self.properties.items(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1043 if propvalues.has_key(key): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1044 continue |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1045 if key == self.key: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1046 raise ValueError, 'key property "%s" is required'%key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1047 if isinstance(prop, Multilink): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1048 propvalues[key] = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1049 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1050 propvalues[key] = None |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1051 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1052 # done |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1053 self.db.addnode(self.classname, newid, propvalues) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1054 if self.do_journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1055 self.db.addjournal(self.classname, newid, 'create', propvalues) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1056 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1057 self.fireReactors('create', newid, None) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1058 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1059 return newid |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1060 |
| 1143 | 1061 def export_list(self, propnames, nodeid): |
| 1062 ''' Export a node - generate a list of CSV-able data in the order | |
| 1063 specified by propnames for the given node. | |
| 1064 ''' | |
| 1065 properties = self.getprops() | |
| 1066 l = [] | |
| 1067 for prop in propnames: | |
| 1068 proptype = properties[prop] | |
| 1069 value = self.get(nodeid, prop) | |
| 1070 # "marshal" data where needed | |
| 1071 if value is None: | |
| 1072 pass | |
| 1073 elif isinstance(proptype, hyperdb.Date): | |
| 1074 value = value.get_tuple() | |
| 1075 elif isinstance(proptype, hyperdb.Interval): | |
| 1076 value = value.get_tuple() | |
| 1077 elif isinstance(proptype, hyperdb.Password): | |
| 1078 value = str(value) | |
| 1079 l.append(repr(value)) | |
| 1080 return l | |
| 1081 | |
| 1082 def import_list(self, propnames, proplist): | |
| 1083 ''' Import a node - all information including "id" is present and | |
| 1084 should not be sanity checked. Triggers are not triggered. The | |
| 1085 journal should be initialised using the "creator" and "created" | |
| 1086 information. | |
| 1087 | |
| 1088 Return the nodeid of the node imported. | |
| 1089 ''' | |
| 1090 if self.db.journaltag is None: | |
| 1091 raise DatabaseError, 'Database open read-only' | |
| 1092 properties = self.getprops() | |
| 1093 | |
| 1094 # make the new node's property map | |
| 1095 d = {} | |
| 1096 for i in range(len(propnames)): | |
| 1097 # Use eval to reverse the repr() used to output the CSV | |
| 1098 value = eval(proplist[i]) | |
| 1099 | |
| 1100 # Figure the property for this column | |
| 1101 propname = propnames[i] | |
| 1102 prop = properties[propname] | |
| 1103 | |
| 1104 # "unmarshal" where necessary | |
| 1105 if propname == 'id': | |
| 1106 newid = value | |
| 1107 continue | |
| 1108 elif value is None: | |
| 1109 # don't set Nones | |
| 1110 continue | |
| 1111 elif isinstance(prop, hyperdb.Date): | |
| 1112 value = date.Date(value) | |
| 1113 elif isinstance(prop, hyperdb.Interval): | |
| 1114 value = date.Interval(value) | |
| 1115 elif isinstance(prop, hyperdb.Password): | |
| 1116 pwd = password.Password() | |
| 1117 pwd.unpack(value) | |
| 1118 value = pwd | |
| 1119 d[propname] = value | |
| 1120 | |
| 1121 # extract the extraneous journalling gumpf and nuke it | |
| 1122 if d.has_key('creator'): | |
| 1123 creator = d['creator'] | |
| 1124 del d['creator'] | |
| 1125 if d.has_key('creation'): | |
| 1126 creation = d['creation'] | |
| 1127 del d['creation'] | |
| 1128 if d.has_key('activity'): | |
| 1129 del d['activity'] | |
| 1130 | |
| 1131 # add the node and journal | |
| 1132 self.db.addnode(self.classname, newid, d) | |
| 1133 self.db.addjournal(self.classname, newid, 'create', d, creator, | |
| 1134 creation) | |
| 1135 return newid | |
| 1136 | |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1137 _marker = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1138 def get(self, nodeid, propname, default=_marker, cache=1): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1139 '''Get the value of a property on an existing node of this class. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1140 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1141 'nodeid' must be the id of an existing node of this class or an |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1142 IndexError is raised. 'propname' must be the name of a property |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1143 of this class or a KeyError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1144 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1145 'cache' indicates whether the transaction cache should be queried |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1146 for the node. If the node has been modified and you need to |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1147 determine what its values prior to modification are, you need to |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1148 set cache=0. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1149 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1150 if propname == 'id': |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1151 return nodeid |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1152 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1153 if propname == 'creation': |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1154 if not self.do_journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1155 raise ValueError, 'Journalling is disabled for this class' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1156 journal = self.db.getjournal(self.classname, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1157 if journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1158 return self.db.getjournal(self.classname, nodeid)[0][1] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1159 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1160 # on the strange chance that there's no journal |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1161 return date.Date() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1162 if propname == 'activity': |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1163 if not self.do_journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1164 raise ValueError, 'Journalling is disabled for this class' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1165 journal = self.db.getjournal(self.classname, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1166 if journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1167 return self.db.getjournal(self.classname, nodeid)[-1][1] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1168 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1169 # on the strange chance that there's no journal |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1170 return date.Date() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1171 if propname == 'creator': |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1172 if not self.do_journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1173 raise ValueError, 'Journalling is disabled for this class' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1174 journal = self.db.getjournal(self.classname, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1175 if journal: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1176 name = self.db.getjournal(self.classname, nodeid)[0][2] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1177 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1178 return None |
|
1022
56fbe66a27e1
handle disappearing users for journaltags
Richard Jones <richard@users.sourceforge.net>
parents:
1014
diff
changeset
|
1179 try: |
|
56fbe66a27e1
handle disappearing users for journaltags
Richard Jones <richard@users.sourceforge.net>
parents:
1014
diff
changeset
|
1180 return self.db.user.lookup(name) |
|
56fbe66a27e1
handle disappearing users for journaltags
Richard Jones <richard@users.sourceforge.net>
parents:
1014
diff
changeset
|
1181 except KeyError: |
|
56fbe66a27e1
handle disappearing users for journaltags
Richard Jones <richard@users.sourceforge.net>
parents:
1014
diff
changeset
|
1182 # the journaltag user doesn't exist any more |
| 1025 | 1183 return None |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1184 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1185 # get the property (raises KeyErorr if invalid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1186 prop = self.properties[propname] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1187 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1188 # get the node's dict |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1189 d = self.db.getnode(self.classname, nodeid) #, cache=cache) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1190 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1191 if not d.has_key(propname): |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1192 if default is self._marker: |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1193 if isinstance(prop, Multilink): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1194 return [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1195 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1196 return None |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1197 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1198 return default |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1199 |
|
1014
8816534e6a1a
Fixed nasty bug that was preventing changes to multilinks going through.
Richard Jones <richard@users.sourceforge.net>
parents:
1002
diff
changeset
|
1200 # don't pass our list to other code |
|
8816534e6a1a
Fixed nasty bug that was preventing changes to multilinks going through.
Richard Jones <richard@users.sourceforge.net>
parents:
1002
diff
changeset
|
1201 if isinstance(prop, Multilink): |
|
8816534e6a1a
Fixed nasty bug that was preventing changes to multilinks going through.
Richard Jones <richard@users.sourceforge.net>
parents:
1002
diff
changeset
|
1202 return d[propname][:] |
|
8816534e6a1a
Fixed nasty bug that was preventing changes to multilinks going through.
Richard Jones <richard@users.sourceforge.net>
parents:
1002
diff
changeset
|
1203 |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1204 return d[propname] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1205 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1206 def getnode(self, nodeid, cache=1): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1207 ''' Return a convenience wrapper for the node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1208 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1209 'nodeid' must be the id of an existing node of this class or an |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1210 IndexError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1211 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1212 'cache' indicates whether the transaction cache should be queried |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1213 for the node. If the node has been modified and you need to |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1214 determine what its values prior to modification are, you need to |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1215 set cache=0. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1216 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1217 return Node(self, nodeid, cache=cache) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1218 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1219 def set(self, nodeid, **propvalues): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1220 '''Modify a property on an existing node of this class. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1221 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1222 'nodeid' must be the id of an existing node of this class or an |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1223 IndexError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1224 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1225 Each key in 'propvalues' must be the name of a property of this |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1226 class or a KeyError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1227 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1228 All values in 'propvalues' must be acceptable types for their |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1229 corresponding properties or a TypeError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1230 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1231 If the value of the key property is set, it must not collide with |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1232 other key strings or a ValueError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1233 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1234 If the value of a Link or Multilink property contains an invalid |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1235 node id, a ValueError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1236 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1237 if not propvalues: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1238 return propvalues |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1239 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1240 if propvalues.has_key('creation') or propvalues.has_key('activity'): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1241 raise KeyError, '"creation" and "activity" are reserved' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1242 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1243 if propvalues.has_key('id'): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1244 raise KeyError, '"id" is reserved' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1245 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1246 if self.db.journaltag is None: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1247 raise DatabaseError, 'Database open read-only' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1248 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1249 self.fireAuditors('set', nodeid, propvalues) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1250 # Take a copy of the node dict so that the subsequent set |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1251 # operation doesn't modify the oldvalues structure. |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1252 # XXX used to try the cache here first |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1253 oldvalues = copy.deepcopy(self.db.getnode(self.classname, nodeid)) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1254 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1255 node = self.db.getnode(self.classname, nodeid) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1256 if self.is_retired(nodeid): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1257 raise IndexError |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1258 num_re = re.compile('^\d+$') |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1259 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1260 # if the journal value is to be different, store it in here |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1261 journalvalues = {} |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1262 |
|
976
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
1263 # remember the add/remove stuff for multilinks, making it easier |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
1264 # for the Database layer to do its stuff |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
1265 multilink_changes = {} |
|
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
1266 |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1267 for propname, value in propvalues.items(): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1268 # check to make sure we're not duplicating an existing key |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1269 if propname == self.key and node[propname] != value: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1270 try: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1271 self.lookup(value) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1272 except KeyError: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1273 pass |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1274 else: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1275 raise ValueError, 'node with key "%s" exists'%value |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1276 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1277 # this will raise the KeyError if the property isn't valid |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1278 # ... we don't use getprops() here because we only care about |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1279 # the writeable properties. |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1280 prop = self.properties[propname] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1281 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1282 # if the value's the same as the existing value, no sense in |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1283 # doing anything |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1284 if node.has_key(propname) and value == node[propname]: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1285 del propvalues[propname] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1286 continue |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1287 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1288 # do stuff based on the prop type |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1289 if isinstance(prop, Link): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1290 link_class = prop.classname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1291 # if it isn't a number, it's a key |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1292 if value is not None and not isinstance(value, type('')): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1293 raise ValueError, 'property "%s" link value be a string'%( |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1294 propname) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1295 if isinstance(value, type('')) and not num_re.match(value): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1296 try: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1297 value = self.db.classes[link_class].lookup(value) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1298 except (TypeError, KeyError): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1299 raise IndexError, 'new property "%s": %s not a %s'%( |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1300 propname, value, prop.classname) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1301 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1302 if (value is not None and |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1303 not self.db.getclass(link_class).hasnode(value)): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1304 raise IndexError, '%s has no node %s'%(link_class, value) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1305 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1306 if self.do_journal and prop.do_journal: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1307 # register the unlink with the old linked node |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1308 if node[propname] is not None: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1309 self.db.addjournal(link_class, node[propname], 'unlink', |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1310 (self.classname, nodeid, propname)) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1311 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1312 # register the link with the newly linked node |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1313 if value is not None: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1314 self.db.addjournal(link_class, value, 'link', |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1315 (self.classname, nodeid, propname)) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1316 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1317 elif isinstance(prop, Multilink): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1318 if type(value) != type([]): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1319 raise TypeError, 'new property "%s" not a list of'\ |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1320 ' ids'%propname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1321 link_class = self.properties[propname].classname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1322 l = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1323 for entry in value: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1324 # if it isn't a number, it's a key |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1325 if type(entry) != type(''): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1326 raise ValueError, 'new property "%s" link value ' \ |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1327 'must be a string'%propname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1328 if not num_re.match(entry): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1329 try: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1330 entry = self.db.classes[link_class].lookup(entry) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1331 except (TypeError, KeyError): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1332 raise IndexError, 'new property "%s": %s not a %s'%( |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1333 propname, entry, |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1334 self.properties[propname].classname) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1335 l.append(entry) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1336 value = l |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1337 propvalues[propname] = value |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1338 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1339 # figure the journal entry for this property |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1340 add = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1341 remove = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1342 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1343 # handle removals |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1344 if node.has_key(propname): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1345 l = node[propname] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1346 else: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1347 l = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1348 for id in l[:]: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1349 if id in value: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1350 continue |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1351 # register the unlink with the old linked node |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1352 if self.do_journal and self.properties[propname].do_journal: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1353 self.db.addjournal(link_class, id, 'unlink', |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1354 (self.classname, nodeid, propname)) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1355 l.remove(id) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1356 remove.append(id) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1357 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1358 # handle additions |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1359 for id in value: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1360 if not self.db.getclass(link_class).hasnode(id): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1361 raise IndexError, '%s has no node %s'%(link_class, id) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1362 if id in l: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1363 continue |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1364 # register the link with the newly linked node |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1365 if self.do_journal and self.properties[propname].do_journal: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1366 self.db.addjournal(link_class, id, 'link', |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1367 (self.classname, nodeid, propname)) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1368 l.append(id) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1369 add.append(id) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1370 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1371 # figure the journal entry |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1372 l = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1373 if add: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1374 l.append(('+', add)) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1375 if remove: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1376 l.append(('-', remove)) |
|
976
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
1377 multilink_changes[propname] = (add, remove) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1378 if l: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1379 journalvalues[propname] = tuple(l) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1380 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1381 elif isinstance(prop, String): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1382 if value is not None and type(value) != type(''): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1383 raise TypeError, 'new property "%s" not a string'%propname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1384 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1385 elif isinstance(prop, Password): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1386 if not isinstance(value, password.Password): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1387 raise TypeError, 'new property "%s" not a Password'%propname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1388 propvalues[propname] = value |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1389 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1390 elif value is not None and isinstance(prop, Date): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1391 if not isinstance(value, date.Date): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1392 raise TypeError, 'new property "%s" not a Date'% propname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1393 propvalues[propname] = value |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1394 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1395 elif value is not None and isinstance(prop, Interval): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1396 if not isinstance(value, date.Interval): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1397 raise TypeError, 'new property "%s" not an '\ |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1398 'Interval'%propname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1399 propvalues[propname] = value |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1400 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1401 elif value is not None and isinstance(prop, Number): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1402 try: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1403 float(value) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1404 except ValueError: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1405 raise TypeError, 'new property "%s" not numeric'%propname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1406 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1407 elif value is not None and isinstance(prop, Boolean): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1408 try: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1409 int(value) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1410 except ValueError: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1411 raise TypeError, 'new property "%s" not boolean'%propname |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1412 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1413 node[propname] = value |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1414 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1415 # nothing to do? |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1416 if not propvalues: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1417 return propvalues |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1418 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1419 # do the set, and journal it |
|
976
8c2036dace08
implemented multilink changes (and a unit test)
Richard Jones <richard@users.sourceforge.net>
parents:
975
diff
changeset
|
1420 self.db.setnode(self.classname, nodeid, node, multilink_changes) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1421 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1422 if self.do_journal: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1423 propvalues.update(journalvalues) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1424 self.db.addjournal(self.classname, nodeid, 'set', propvalues) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1425 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1426 self.fireReactors('set', nodeid, oldvalues) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1427 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1428 return propvalues |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1429 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1430 def retire(self, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1431 '''Retire a node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1432 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1433 The properties on the node remain available from the get() method, |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1434 and the node's id is never reused. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1435 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1436 Retired nodes are not returned by the find(), list(), or lookup() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1437 methods, and other nodes may reuse the values of their key properties. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1438 ''' |
|
975
2ab4d496d936
fixed read-only gadfly retire()
Richard Jones <richard@users.sourceforge.net>
parents:
974
diff
changeset
|
1439 if self.db.journaltag is None: |
|
2ab4d496d936
fixed read-only gadfly retire()
Richard Jones <richard@users.sourceforge.net>
parents:
974
diff
changeset
|
1440 raise DatabaseError, 'Database open read-only' |
|
2ab4d496d936
fixed read-only gadfly retire()
Richard Jones <richard@users.sourceforge.net>
parents:
974
diff
changeset
|
1441 |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1442 cursor = self.db.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1443 sql = 'update _%s set __retired__=1 where id=?'%self.classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1444 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1445 print >>hyperdb.DEBUG, 'retire', (self, sql, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1446 cursor.execute(sql, (nodeid,)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1447 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1448 def is_retired(self, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1449 '''Return true if the node is rerired |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1450 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1451 cursor = self.db.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1452 sql = 'select __retired__ from _%s where id=?'%self.classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1453 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1454 print >>hyperdb.DEBUG, 'is_retired', (self, sql, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1455 cursor.execute(sql, (nodeid,)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1456 return cursor.fetchone()[0] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1457 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1458 def destroy(self, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1459 '''Destroy a node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1460 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1461 WARNING: this method should never be used except in extremely rare |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1462 situations where there could never be links to the node being |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1463 deleted |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1464 WARNING: use retire() instead |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1465 WARNING: the properties of this node will not be available ever again |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1466 WARNING: really, use retire() instead |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1467 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1468 Well, I think that's enough warnings. This method exists mostly to |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1469 support the session storage of the cgi interface. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1470 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1471 The node is completely removed from the hyperdb, including all journal |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1472 entries. It will no longer be available, and will generally break code |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1473 if there are any references to the node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1474 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1475 if self.db.journaltag is None: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1476 raise DatabaseError, 'Database open read-only' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1477 self.db.destroynode(self.classname, nodeid) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1478 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1479 def history(self, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1480 '''Retrieve the journal of edits on a particular node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1481 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1482 'nodeid' must be the id of an existing node of this class or an |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1483 IndexError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1484 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1485 The returned list contains tuples of the form |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1486 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1487 (date, tag, action, params) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1488 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1489 'date' is a Timestamp object specifying the time of the change and |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1490 'tag' is the journaltag specified when the database was opened. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1491 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1492 if not self.do_journal: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1493 raise ValueError, 'Journalling is disabled for this class' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1494 return self.db.getjournal(self.classname, nodeid) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1495 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1496 # Locating nodes: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1497 def hasnode(self, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1498 '''Determine if the given nodeid actually exists |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1499 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1500 return self.db.hasnode(self.classname, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1501 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1502 def setkey(self, propname): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1503 '''Select a String property of this class to be the key property. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1504 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1505 'propname' must be the name of a String property of this class or |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1506 None, or a TypeError is raised. The values of the key property on |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1507 all existing nodes must be unique or a ValueError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1508 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1509 # XXX create an index on the key prop column |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1510 prop = self.getprops()[propname] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1511 if not isinstance(prop, String): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1512 raise TypeError, 'key properties must be String' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1513 self.key = propname |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1514 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1515 def getkey(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1516 '''Return the name of the key property for this class or None.''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1517 return self.key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1518 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1519 def labelprop(self, default_to_id=0): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1520 ''' Return the property name for a label for the given node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1521 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1522 This method attempts to generate a consistent label for the node. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1523 It tries the following in order: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1524 1. key property |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1525 2. "name" property |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1526 3. "title" property |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1527 4. first property from the sorted property name list |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1528 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1529 k = self.getkey() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1530 if k: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1531 return k |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1532 props = self.getprops() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1533 if props.has_key('name'): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1534 return 'name' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1535 elif props.has_key('title'): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1536 return 'title' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1537 if default_to_id: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1538 return 'id' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1539 props = props.keys() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1540 props.sort() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1541 return props[0] |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1542 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1543 def lookup(self, keyvalue): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1544 '''Locate a particular node by its key property and return its id. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1545 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1546 If this class has no key property, a TypeError is raised. If the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1547 'keyvalue' matches one of the values for the key property among |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1548 the nodes in this class, the matching node's id is returned; |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1549 otherwise a KeyError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1550 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1551 if not self.key: |
|
1127
22517f9e3b1e
nicer error message
Richard Jones <richard@users.sourceforge.net>
parents:
1109
diff
changeset
|
1552 raise TypeError, 'No key property set for class %s'%self.classname |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1553 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1554 cursor = self.db.conn.cursor() |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1555 sql = 'select id from _%s where _%s=?'%(self.classname, self.key) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1556 if __debug__: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1557 print >>hyperdb.DEBUG, 'lookup', (self, sql, keyvalue) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1558 cursor.execute(sql, (keyvalue,)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1559 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1560 # see if there was a result |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1561 l = cursor.fetchall() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1562 if not l: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1563 raise KeyError, keyvalue |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1564 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1565 # return the id |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1566 return l[0][0] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1567 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1568 def find(self, **propspec): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1569 '''Get the ids of nodes in this class which link to the given nodes. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1570 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1571 'propspec' consists of keyword args propname={nodeid:1,} |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1572 'propname' must be the name of a property in this class, or a |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1573 KeyError is raised. That property must be a Link or Multilink |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1574 property, or a TypeError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1575 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1576 Any node in this class whose 'propname' property links to any of the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1577 nodeids will be returned. Used by the full text indexing, which knows |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1578 that "foo" occurs in msg1, msg3 and file7, so we have hits on these |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1579 issues: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1580 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1581 db.issue.find(messages={'1':1,'3':1}, files={'7':1}) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1582 ''' |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1583 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1584 print >>hyperdb.DEBUG, 'find', (self, propspec) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1585 if not propspec: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1586 return [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1587 queries = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1588 tables = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1589 allvalues = () |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1590 for prop, values in propspec.items(): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1591 allvalues += tuple(values.keys()) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1592 tables.append('select nodeid from %s_%s where linkid in (%s)'%( |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1593 self.classname, prop, ','.join(['?' for x in values.keys()]))) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1594 sql = '\nintersect\n'.join(tables) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1595 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1596 print >>hyperdb.DEBUG, 'find', (self, sql, allvalues) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1597 cursor = self.db.conn.cursor() |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1598 cursor.execute(sql, allvalues) |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1599 try: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1600 l = [x[0] for x in cursor.fetchall()] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1601 except gadfly.database.error, message: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1602 if message == 'no more results': |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1603 l = [] |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1604 raise |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1605 if __debug__: |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1606 print >>hyperdb.DEBUG, 'find ... ', l |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1607 return l |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1608 |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1609 def list(self): |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1610 ''' Return a list of the ids of the active nodes in this class. |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1611 ''' |
|
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1612 return self.db.getnodeids(self.classname, retired=0) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1613 |
|
989
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1614 def filter(self, search_matches, filterspec, sort, group): |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1615 ''' Return a list of the ids of the active nodes in this class that |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1616 match the 'filter' spec, sorted by the group spec and then the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1617 sort spec |
|
989
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1618 |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1619 "filterspec" is {propname: value(s)} |
| 1002 | 1620 "sort" and "group" are (dir, prop) where dir is '+', '-' or None |
| 1621 and prop is a prop name or None | |
|
989
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1622 "search_matches" is {nodeid: marker} |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1623 ''' |
|
989
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1624 cn = self.classname |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1625 |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1626 # figure the WHERE clause from the filterspec |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1627 props = self.getprops() |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1628 frum = ['_'+cn] |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1629 where = [] |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1630 args = [] |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1631 for k, v in filterspec.items(): |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1632 propclass = props[k] |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1633 if isinstance(propclass, Multilink): |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1634 tn = '%s_%s'%(cn, k) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1635 frum.append(tn) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1636 if isinstance(v, type([])): |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1637 s = ','.join(['?' for x in v]) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1638 where.append('id=%s.nodeid and %s.linkid in (%s)'%(tn,tn,s)) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1639 args = args + v |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1640 else: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1641 where.append('id=%s.nodeid and %s.linkid = ?'%(tn, tn)) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1642 args.append(v) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1643 else: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1644 if isinstance(v, type([])): |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1645 s = ','.join(['?' for x in v]) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1646 where.append('_%s in (%s)'%(k, s)) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1647 args = args + v |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1648 else: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1649 where.append('_%s=?'%k) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1650 args.append(v) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1651 |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1652 # add results of full text search |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1653 if search_matches is not None: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1654 v = search_matches.keys() |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1655 s = ','.join(['?' for x in v]) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1656 where.append('id in (%s)'%s) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1657 args = args + v |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1658 |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1659 # figure the order by clause |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1660 orderby = [] |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1661 ordercols = [] |
| 1038 | 1662 if sort[0] is not None and sort[1] is not None: |
| 1002 | 1663 if sort[0] != '-': |
| 1664 orderby.append('_'+sort[1]) | |
| 1665 ordercols.append(sort[1]) | |
| 1666 else: | |
| 1667 orderby.append('_'+sort[1]+' desc') | |
| 1668 ordercols.append(sort[1]) | |
|
989
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1669 |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1670 # figure the group by clause |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1671 groupby = [] |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1672 groupcols = [] |
| 1038 | 1673 if group[0] is not None and group[1] is not None: |
| 1002 | 1674 if group[0] != '-': |
| 1675 groupby.append('_'+group[1]) | |
| 1676 groupcols.append(group[1]) | |
| 1677 else: | |
| 1678 groupby.append('_'+group[1]+' desc') | |
| 1679 groupcols.append(group[1]) | |
|
989
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1680 |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1681 # construct the SQL |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1682 frum = ','.join(frum) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1683 where = ' and '.join(where) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1684 cols = ['id'] |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1685 if orderby: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1686 cols = cols + ordercols |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1687 order = ' order by %s'%(','.join(orderby)) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1688 else: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1689 order = '' |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1690 if groupby: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1691 cols = cols + groupcols |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1692 group = ' group by %s'%(','.join(groupby)) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1693 else: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1694 group = '' |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1695 cols = ','.join(cols) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1696 sql = 'select %s from %s where %s%s%s'%(cols, frum, where, order, |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1697 group) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1698 args = tuple(args) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1699 if __debug__: |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1700 print >>hyperdb.DEBUG, 'find', (self, sql, args) |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1701 cursor = self.db.conn.cursor() |
|
8fd80699fa3c
very basic filter support
Richard Jones <richard@users.sourceforge.net>
parents:
976
diff
changeset
|
1702 cursor.execute(sql, args) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1703 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1704 def count(self): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1705 '''Get the number of nodes in this class. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1706 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1707 If the returned integer is 'numnodes', the ids of all the nodes |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1708 in this class run from 1 to numnodes, and numnodes+1 will be the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1709 id of the next node to be created in this class. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1710 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1711 return self.db.countnodes(self.classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1712 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1713 # Manipulating properties: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1714 def getprops(self, protected=1): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1715 '''Return a dictionary mapping property names to property objects. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1716 If the "protected" flag is true, we include protected properties - |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1717 those which may not be modified. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1718 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1719 d = self.properties.copy() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1720 if protected: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1721 d['id'] = String() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1722 d['creation'] = hyperdb.Date() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1723 d['activity'] = hyperdb.Date() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1724 d['creator'] = hyperdb.Link("user") |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1725 return d |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1726 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1727 def addprop(self, **properties): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1728 '''Add properties to this class. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1729 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1730 The keyword arguments in 'properties' must map names to property |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1731 objects, or a TypeError is raised. None of the keys in 'properties' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1732 may collide with the names of existing properties, or a ValueError |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1733 is raised before any properties have been added. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1734 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1735 for key in properties.keys(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1736 if self.properties.has_key(key): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1737 raise ValueError, key |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1738 self.properties.update(properties) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1739 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1740 def index(self, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1741 '''Add (or refresh) the node to search indexes |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1742 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1743 # find all the String properties that have indexme |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1744 for prop, propclass in self.getprops().items(): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1745 if isinstance(propclass, String) and propclass.indexme: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1746 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1747 value = str(self.get(nodeid, prop)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1748 except IndexError: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1749 # node no longer exists - entry should be removed |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1750 self.db.indexer.purge_entry((self.classname, nodeid, prop)) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1751 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1752 # and index them under (classname, nodeid, property) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1753 self.db.indexer.add_text((self.classname, nodeid, prop), |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1754 value) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1755 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1756 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1757 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1758 # Detector interface |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1759 # |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1760 def audit(self, event, detector): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1761 '''Register a detector |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1762 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1763 l = self.auditors[event] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1764 if detector not in l: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1765 self.auditors[event].append(detector) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1766 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1767 def fireAuditors(self, action, nodeid, newvalues): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1768 '''Fire all registered auditors. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1769 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1770 for audit in self.auditors[action]: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1771 audit(self.db, self, nodeid, newvalues) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1772 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1773 def react(self, event, detector): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1774 '''Register a detector |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1775 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1776 l = self.reactors[event] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1777 if detector not in l: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1778 self.reactors[event].append(detector) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1779 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1780 def fireReactors(self, action, nodeid, oldvalues): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1781 '''Fire all registered reactors. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1782 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1783 for react in self.reactors[action]: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1784 react(self.db, self, nodeid, oldvalues) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1785 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1786 class FileClass(Class): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1787 '''This class defines a large chunk of data. To support this, it has a |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1788 mandatory String property "content" which is typically saved off |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1789 externally to the hyperdb. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1790 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1791 The default MIME type of this data is defined by the |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1792 "default_mime_type" class attribute, which may be overridden by each |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1793 node if the class defines a "type" String property. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1794 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1795 default_mime_type = 'text/plain' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1796 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1797 def create(self, **propvalues): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1798 ''' snaffle the file propvalue and store in a file |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1799 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1800 content = propvalues['content'] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1801 del propvalues['content'] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1802 newid = Class.create(self, **propvalues) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1803 self.db.storefile(self.classname, newid, None, content) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1804 return newid |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1805 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1806 def import_list(self, propnames, proplist): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1807 ''' Trap the "content" property... |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1808 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1809 # dupe this list so we don't affect others |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1810 propnames = propnames[:] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1811 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1812 # extract the "content" property from the proplist |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1813 i = propnames.index('content') |
| 1143 | 1814 content = eval(proplist[i]) |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1815 del propnames[i] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1816 del proplist[i] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1817 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1818 # do the normal import |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1819 newid = Class.import_list(self, propnames, proplist) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1820 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1821 # save off the "content" file |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1822 self.db.storefile(self.classname, newid, None, content) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1823 return newid |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1824 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1825 _marker = [] |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1826 def get(self, nodeid, propname, default=_marker, cache=1): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1827 ''' trap the content propname and get it from the file |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1828 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1829 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1830 poss_msg = 'Possibly a access right configuration problem.' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1831 if propname == 'content': |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1832 try: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1833 return self.db.getfile(self.classname, nodeid, None) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1834 except IOError, (strerror): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1835 # BUG: by catching this we donot see an error in the log. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1836 return 'ERROR reading file: %s%s\n%s\n%s'%( |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1837 self.classname, nodeid, poss_msg, strerror) |
|
972
ca0a542b2d19
That's gadfly done, mostly.
Richard Jones <richard@users.sourceforge.net>
parents:
968
diff
changeset
|
1838 if default is not self._marker: |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1839 return Class.get(self, nodeid, propname, default, cache=cache) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1840 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1841 return Class.get(self, nodeid, propname, cache=cache) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1842 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1843 def getprops(self, protected=1): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1844 ''' In addition to the actual properties on the node, these methods |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1845 provide the "content" property. If the "protected" flag is true, |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1846 we include protected properties - those which may not be |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1847 modified. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1848 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1849 d = Class.getprops(self, protected=protected).copy() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1850 if protected: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1851 d['content'] = hyperdb.String() |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1852 return d |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1853 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1854 def index(self, nodeid): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1855 ''' Index the node in the search index. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1856 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1857 We want to index the content in addition to the normal String |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1858 property indexing. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1859 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1860 # perform normal indexing |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1861 Class.index(self, nodeid) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1862 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1863 # get the content to index |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1864 content = self.get(nodeid, 'content') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1865 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1866 # figure the mime type |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1867 if self.properties.has_key('type'): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1868 mime_type = self.get(nodeid, 'type') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1869 else: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1870 mime_type = self.default_mime_type |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1871 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1872 # and index! |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1873 self.db.indexer.add_text((self.classname, nodeid, 'content'), content, |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1874 mime_type) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1875 |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1876 # XXX deviation from spec - was called ItemClass |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1877 class IssueClass(Class, roundupdb.IssueClass): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1878 # Overridden methods: |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1879 def __init__(self, db, classname, **properties): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1880 '''The newly-created class automatically includes the "messages", |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1881 "files", "nosy", and "superseder" properties. If the 'properties' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1882 dictionary attempts to specify any of these properties or a |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1883 "creation" or "activity" property, a ValueError is raised. |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1884 ''' |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1885 if not properties.has_key('title'): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1886 properties['title'] = hyperdb.String(indexme='yes') |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1887 if not properties.has_key('messages'): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1888 properties['messages'] = hyperdb.Multilink("msg") |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1889 if not properties.has_key('files'): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1890 properties['files'] = hyperdb.Multilink("file") |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1891 if not properties.has_key('nosy'): |
| 1002 | 1892 # note: journalling is turned off as it really just wastes |
| 1893 # space. this behaviour may be overridden in an instance | |
| 1894 properties['nosy'] = hyperdb.Multilink("user", do_journal="no") | |
|
968
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1895 if not properties.has_key('superseder'): |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1896 properties['superseder'] = hyperdb.Multilink(classname) |
|
07d8a4e296f8
Whee! It's not finished yet, but I can create a new instance...
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1897 Class.__init__(self, db, classname, **properties) |
