Mercurial > p > roundup > code
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 |
