comparison roundup/backends/back_sqlite.py @ 1168:94620e088e3a

fixes to the rdbms backends
author Richard Jones <richard@users.sourceforge.net>
date Wed, 18 Sep 2002 07:04:39 +0000
parents 14467c765167
children af104fa52746
comparison
equal deleted inserted replaced
1167:75e5f2055ca9 1168:94620e088e3a
1 # $Id: back_sqlite.py,v 1.1 2002-09-18 05:07:47 richard Exp $ 1 # $Id: back_sqlite.py,v 1.2 2002-09-18 07:04:37 richard Exp $
2 __doc__ = ''' 2 __doc__ = '''
3 See https://pysqlite.sourceforge.net/ for pysqlite info 3 See https://pysqlite.sourceforge.net/ for pysqlite info
4 ''' 4 '''
5 import base64, marshal 5 import base64, marshal
6 from roundup.backends.rdbms_common import * 6 from roundup.backends.rdbms_common import *
86 for nodeid, date_stamp, user, action, params in cursor.fetchall(): 86 for nodeid, date_stamp, user, action, params in cursor.fetchall():
87 params = eval(params) 87 params = eval(params)
88 res.append((nodeid, date.Date(date_stamp), user, action, params)) 88 res.append((nodeid, date.Date(date_stamp), user, action, params))
89 return res 89 return res
90 90
91 def unserialise(self, classname, node):
92 ''' Decode the marshalled node data
93
94 SQLite stringifies _everything_... so we need to re-numberificate
95 Booleans and Numbers.
96 '''
97 if __debug__:
98 print >>hyperdb.DEBUG, 'unserialise', classname, node
99 properties = self.getclass(classname).getprops()
100 d = {}
101 for k, v in node.items():
102 # if the property doesn't exist, or is the "retired" flag then
103 # it won't be in the properties dict
104 if not properties.has_key(k):
105 d[k] = v
106 continue
107
108 # get the property spec
109 prop = properties[k]
110
111 if isinstance(prop, Date) and v is not None:
112 d[k] = date.Date(v)
113 elif isinstance(prop, Interval) and v is not None:
114 d[k] = date.Interval(v)
115 elif isinstance(prop, Password):
116 p = password.Password()
117 p.unpack(v)
118 d[k] = p
119 elif isinstance(prop, Boolean) and v is not None:
120 d[k] = int(v)
121 elif isinstance(prop, Number) and v is not None:
122 # try int first, then assume it's a float
123 try:
124 d[k] = int(v)
125 except ValueError:
126 d[k] = float(v)
127 else:
128 d[k] = v
129 return d
130
131 class Class(Class):
132 _marker = []
133 def get(self, nodeid, propname, default=_marker, cache=1):
134 '''Get the value of a property on an existing node of this class.
135
136 'nodeid' must be the id of an existing node of this class or an
137 IndexError is raised. 'propname' must be the name of a property
138 of this class or a KeyError is raised.
139
140 'cache' indicates whether the transaction cache should be queried
141 for the node. If the node has been modified and you need to
142 determine what its values prior to modification are, you need to
143 set cache=0.
144 '''
145 if propname == 'id':
146 return nodeid
147
148 if propname == 'creation':
149 if not self.do_journal:
150 raise ValueError, 'Journalling is disabled for this class'
151 journal = self.db.getjournal(self.classname, nodeid)
152 if journal:
153 return self.db.getjournal(self.classname, nodeid)[0][1]
154 else:
155 # on the strange chance that there's no journal
156 return date.Date()
157 if propname == 'activity':
158 if not self.do_journal:
159 raise ValueError, 'Journalling is disabled for this class'
160 journal = self.db.getjournal(self.classname, nodeid)
161 if journal:
162 return self.db.getjournal(self.classname, nodeid)[-1][1]
163 else:
164 # on the strange chance that there's no journal
165 return date.Date()
166 if propname == 'creator':
167 if not self.do_journal:
168 raise ValueError, 'Journalling is disabled for this class'
169 journal = self.db.getjournal(self.classname, nodeid)
170 if journal:
171 name = self.db.getjournal(self.classname, nodeid)[0][2]
172 else:
173 return None
174 try:
175 return self.db.user.lookup(name)
176 except KeyError:
177 # the journaltag user doesn't exist any more
178 return None
179
180 # get the property (raises KeyErorr if invalid)
181 prop = self.properties[propname]
182
183 # get the node's dict
184 d = self.db.getnode(self.classname, nodeid) #, cache=cache)
185
186 if not d.has_key(propname):
187 if default is self._marker:
188 if isinstance(prop, Multilink):
189 return []
190 else:
191 return None
192 else:
193 return default
194
195 # special handling for some types
196 if isinstance(prop, Multilink):
197 # don't pass our list to other code
198 return d[propname][:]
199 elif d[propname] is None:
200 # always return None right now, no conversion
201 return None
202 elif isinstance(prop, Boolean) or isinstance(prop, Number):
203 # turn Booleans and Numbers into integers
204 return int(d[propname])
205
206 return d[propname]
207

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