Skip to content

Commit 9143d98

Browse files
author
Richard Jones
committed
Moved the data stringification up into the hyperdb.Class class's...
...get, set and create methods. This means that the data is also stringified for the journal call, and removes duplication of code from the backends. The backend code now only sees strings.
1 parent 66d41a5 commit 9143d98

File tree

5 files changed

+51
-80
lines changed

5 files changed

+51
-80
lines changed

roundup/backends/back_anydbm.py

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
#$Id: back_anydbm.py,v 1.9 2001-10-09 07:25:59 richard Exp $
18+
#$Id: back_anydbm.py,v 1.10 2001-10-09 23:58:10 richard Exp $
1919

2020
import anydbm, os, marshal
2121
from roundup import hyperdb, date, password
@@ -96,17 +96,6 @@ def addnode(self, classname, nodeid, node):
9696
''' add the specified node to its class's db
9797
'''
9898
db = self.getclassdb(classname, 'c')
99-
100-
# convert the instance data to builtin types
101-
properties = self.classes[classname].properties
102-
for key in properties.keys():
103-
if isinstance(properties[key], hyperdb.Date):
104-
node[key] = node[key].get_tuple()
105-
elif isinstance(properties[key], hyperdb.Interval):
106-
node[key] = node[key].get_tuple()
107-
elif isinstance(properties[key], hyperdb.Password):
108-
node[key] = str(node[key])
109-
11099
# now save the marshalled data
111100
db[nodeid] = marshal.dumps(node)
112101
db.close()
@@ -119,20 +108,6 @@ def getnode(self, classname, nodeid, cldb=None):
119108
if not db.has_key(nodeid):
120109
raise IndexError, nodeid
121110
res = marshal.loads(db[nodeid])
122-
123-
# convert the marshalled data to instances
124-
properties = self.classes[classname].properties
125-
for key in properties.keys():
126-
if key == self.RETIRED_FLAG: continue
127-
if isinstance(properties[key], hyperdb.Date):
128-
res[key] = date.Date(res[key])
129-
elif isinstance(properties[key], hyperdb.Interval):
130-
res[key] = date.Interval(res[key])
131-
elif isinstance(properties[key], hyperdb.Password):
132-
p = password.Password()
133-
p.unpack(res[key])
134-
res[key] = p
135-
136111
if not cldb: db.close()
137112
return res
138113

@@ -226,6 +201,10 @@ def rollback(self):
226201

227202
#
228203
#$Log: not supported by cvs2svn $
204+
#Revision 1.9 2001/10/09 07:25:59 richard
205+
#Added the Password property type. See "pydoc roundup.password" for
206+
#implementation details. Have updated some of the documentation too.
207+
#
229208
#Revision 1.8 2001/09/29 13:27:00 richard
230209
#CGI interfaces now spit up a top-level index of all the instances they can
231210
#serve.

roundup/backends/back_bsddb.py

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
#$Id: back_bsddb.py,v 1.10 2001-10-09 07:25:59 richard Exp $
18+
#$Id: back_bsddb.py,v 1.11 2001-10-09 23:58:10 richard Exp $
1919

2020
import bsddb, os, marshal
2121
from roundup import hyperdb, date, password
@@ -95,18 +95,6 @@ def addnode(self, classname, nodeid, node):
9595
''' add the specified node to its class's db
9696
'''
9797
db = self.getclassdb(classname, 'c')
98-
99-
# convert the instance data to builtin types
100-
properties = self.classes[classname].properties
101-
for key in properties.keys():
102-
if isinstance(properties[key], hyperdb.Date):
103-
node[key] = node[key].get_tuple()
104-
elif isinstance(properties[key], hyperdb.Interval):
105-
node[key] = node[key].get_tuple()
106-
elif isinstance(properties[key], hyperdb.Password):
107-
node[key] = str(node[key])
108-
109-
# now save the marshalled data
11098
db[nodeid] = marshal.dumps(node)
11199
db.close()
112100
setnode = addnode
@@ -118,19 +106,6 @@ def getnode(self, classname, nodeid, cldb=None):
118106
if not db.has_key(nodeid):
119107
raise IndexError, nodeid
120108
res = marshal.loads(db[nodeid])
121-
122-
# convert the marshalled data to instances
123-
properties = self.classes[classname].properties
124-
for key in properties.keys():
125-
if isinstance(properties[key], hyperdb.Date):
126-
res[key] = date.Date(res[key])
127-
elif isinstance(properties[key], hyperdb.Interval):
128-
res[key] = date.Interval(res[key])
129-
elif isinstance(properties[key], hyperdb.Password):
130-
p = password.Password()
131-
p.unpack(res[key])
132-
res[key] = p
133-
134109
if not cldb: db.close()
135110
return res
136111

@@ -225,6 +200,10 @@ def rollback(self):
225200

226201
#
227202
#$Log: not supported by cvs2svn $
203+
#Revision 1.10 2001/10/09 07:25:59 richard
204+
#Added the Password property type. See "pydoc roundup.password" for
205+
#implementation details. Have updated some of the documentation too.
206+
#
228207
#Revision 1.9 2001/08/12 06:32:36 richard
229208
#using isinstance(blah, Foo) now instead of isFooType
230209
#

roundup/backends/back_bsddb3.py

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
#$Id: back_bsddb3.py,v 1.8 2001-10-09 07:25:59 richard Exp $
18+
#$Id: back_bsddb3.py,v 1.9 2001-10-09 23:58:10 richard Exp $
1919

2020
import bsddb3, os, marshal
2121
from roundup import hyperdb, date, password
@@ -95,17 +95,6 @@ def addnode(self, classname, nodeid, node):
9595
''' add the specified node to its class's db
9696
'''
9797
db = self.getclassdb(classname, 'c')
98-
99-
# convert the instance data to builtin types
100-
properties = self.classes[classname].properties
101-
for key in properties.keys():
102-
if isinstance(properties[key], hyperdb.Date):
103-
node[key] = node[key].get_tuple()
104-
elif isinstance(properties[key], hyperdb.Interval):
105-
node[key] = node[key].get_tuple()
106-
elif isinstance(properties[key], hyperdb.Password):
107-
node[key] = str(node[key])
108-
10998
# now save the marshalled data
11099
db[nodeid] = marshal.dumps(node)
111100
db.close()
@@ -118,19 +107,6 @@ def getnode(self, classname, nodeid, cldb=None):
118107
if not db.has_key(nodeid):
119108
raise IndexError, nodeid
120109
res = marshal.loads(db[nodeid])
121-
122-
# convert the marshalled data to instances
123-
properties = self.classes[classname].properties
124-
for key in properties.keys():
125-
if isinstance(properties[key], hyperdb.Date):
126-
res[key] = date.Date(res[key])
127-
elif isinstance(properties[key], hyperdb.Interval):
128-
res[key] = date.Interval(res[key])
129-
elif isinstance(properties[key], hyperdb.Password):
130-
p = password.Password()
131-
p.unpack(res[key])
132-
res[key] = p
133-
134110
if not cldb: db.close()
135111
return res
136112

@@ -225,6 +201,10 @@ def rollback(self):
225201

226202
#
227203
#$Log: not supported by cvs2svn $
204+
#Revision 1.8 2001/10/09 07:25:59 richard
205+
#Added the Password property type. See "pydoc roundup.password" for
206+
#implementation details. Have updated some of the documentation too.
207+
#
228208
#Revision 1.7 2001/08/12 06:32:36 richard
229209
#using isinstance(blah, Foo) now instead of isFooType
230210
#

roundup/hyperdb.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
# $Id: hyperdb.py,v 1.22 2001-10-09 07:25:59 richard Exp $
18+
# $Id: hyperdb.py,v 1.23 2001-10-09 23:58:10 richard Exp $
1919

2020
# standard python modules
2121
import cPickle, re, string
@@ -206,6 +206,7 @@ def create(self, **propvalues):
206206
if not isinstance(value, date.Interval):
207207
raise TypeError, 'new property "%s" not an Interval'%key
208208

209+
# make sure there's data where there needs to be
209210
for key, prop in self.properties.items():
210211
if propvalues.has_key(key):
211212
continue
@@ -216,6 +217,15 @@ def create(self, **propvalues):
216217
else:
217218
propvalues[key] = None
218219

220+
# convert all data to strings
221+
for key, prop in self.properties.items():
222+
if isinstance(prop, Date):
223+
propvalues[key] = propvalues[key].get_tuple()
224+
elif isinstance(prop, Interval):
225+
propvalues[key] = propvalues[key].get_tuple()
226+
elif isinstance(prop, Password):
227+
propvalues[key] = str(propvalues[key])
228+
219229
# done
220230
self.db.addnode(self.classname, newid, propvalues)
221231
self.db.addjournal(self.classname, newid, 'create', propvalues)
@@ -229,6 +239,18 @@ def get(self, nodeid, propname, default=_marker):
229239
of this class or a KeyError is raised.
230240
"""
231241
d = self.db.getnode(self.classname, nodeid)
242+
243+
# convert the marshalled data to instances
244+
for key, prop in self.properties.items():
245+
if isinstance(prop, Date):
246+
d[key] = date.Date(d[key])
247+
elif isinstance(prop, Interval):
248+
d[key] = date.Interval(d[key])
249+
elif isinstance(prop, Password):
250+
p = password.Password()
251+
p.unpack(d[key])
252+
d[key] = p
253+
232254
if propname == 'id':
233255
return nodeid
234256
if not d.has_key(propname) and default is not _marker:
@@ -359,14 +381,17 @@ class or a KeyError is raised.
359381
elif isinstance(prop, Password):
360382
if not isinstance(value, password.Password):
361383
raise TypeError, 'new property "%s" not a Password'% key
384+
propvalues[key] = value = str(value)
362385

363386
elif isinstance(prop, Date):
364387
if not isinstance(value, date.Date):
365388
raise TypeError, 'new property "%s" not a Date'% key
389+
propvalues[key] = value = value.get_tuple()
366390

367391
elif isinstance(prop, Interval):
368392
if not isinstance(value, date.Interval):
369393
raise TypeError, 'new property "%s" not an Interval'% key
394+
propvalues[key] = value = value.get_tuple()
370395

371396
node[key] = value
372397

@@ -814,6 +839,10 @@ def Choice(name, *options):
814839

815840
#
816841
# $Log: not supported by cvs2svn $
842+
# Revision 1.22 2001/10/09 07:25:59 richard
843+
# Added the Password property type. See "pydoc roundup.password" for
844+
# implementation details. Have updated some of the documentation too.
845+
#
817846
# Revision 1.21 2001/10/05 02:23:24 richard
818847
# . roundup-admin create now prompts for property info if none is supplied
819848
# on the command-line.

roundup/password.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
# $Id: password.py,v 1.1 2001-10-09 07:25:59 richard Exp $
18+
# $Id: password.py,v 1.2 2001-10-09 23:58:10 richard Exp $
1919

2020
import sha, re
2121

@@ -75,7 +75,7 @@ def unpack(self, encrypted):
7575
self.password = m.group(2)
7676
else:
7777
# currently plaintext - encrypt
78-
self.password = encodePassword(plaintext, self.default_scheme)
78+
self.password = encodePassword(encrypted, self.default_scheme)
7979
self.scheme = self.default_scheme
8080

8181
def setPassword(self, plaintext):
@@ -106,6 +106,10 @@ def test():
106106

107107
#
108108
# $Log: not supported by cvs2svn $
109+
# Revision 1.1 2001/10/09 07:25:59 richard
110+
# Added the Password property type. See "pydoc roundup.password" for
111+
# implementation details. Have updated some of the documentation too.
112+
#
109113
#
110114
#
111115
# vim: set filetype=python ts=4 sw=4 et si

0 commit comments

Comments
 (0)