diff roundup/backends/back_anydbm.py @ 2906:a8808157f892

fix some bugs introduced in refactoring of blobfiles filename() unless in debug mode, keep a single persistent connection through a single web or mailgw request fix enabling of DEBUG logging in db_test_case (no cmdline switch yet)
author Richard Jones <richard@users.sourceforge.net>
date Fri, 12 Nov 2004 04:07:05 +0000
parents 09a4d6dd6dcb
children 95813789cf70
line wrap: on
line diff
--- a/roundup/backends/back_anydbm.py	Thu Nov 11 21:36:07 2004 +0000
+++ b/roundup/backends/back_anydbm.py	Fri Nov 12 04:07:05 2004 +0000
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 #
-#$Id: back_anydbm.py,v 1.175 2004-11-11 06:04:58 richard Exp $
+#$Id: back_anydbm.py,v 1.176 2004-11-12 04:07:04 richard Exp $
 '''This module defines a backend that saves the hyperdatabase in a
 database chosen by anydbm. It is guaranteed to always be available in python
 versions >2.1.1 (the dumbdbm fallback in 2.1.1 and earlier has several
@@ -39,9 +39,6 @@
 from sessions_dbm import Sessions, OneTimeKeys
 from indexer_dbm import Indexer
 from roundup.backends import locking
-from roundup.hyperdb import String, Password, Date, Interval, Link, \
-    Multilink, DatabaseError, Boolean, Number, Node
-from roundup.date import Range, Date
 
 def db_exists(config):
     # check for the user db
@@ -205,7 +202,7 @@
         if os.path.exists(path):
             db_type = whichdb.whichdb(path)
             if not db_type:
-                raise DatabaseError, "Couldn't identify database type"
+                raise hyperdb.DatabaseError, "Couldn't identify database type"
         elif os.path.exists(path+'.db'):
             # if the path ends in '.db', it's a dbm database, whether
             # anydbm says it's dbhash or not!
@@ -230,7 +227,7 @@
         try:
             dbm = __import__(db_type)
         except ImportError:
-            raise DatabaseError, \
+            raise hyperdb.DatabaseError, \
                 "Couldn't open database - the required module '%s'"\
                 " is not available"%db_type
         if __debug__:
@@ -390,11 +387,11 @@
             # get the property spec
             prop = properties[k]
 
-            if isinstance(prop, Password) and v is not None:
+            if isinstance(prop, hyperdb.Password) and v is not None:
                 d[k] = str(v)
-            elif isinstance(prop, Date) and v is not None:
+            elif isinstance(prop, hyperdb.Date) and v is not None:
                 d[k] = v.serialise()
-            elif isinstance(prop, Interval) and v is not None:
+            elif isinstance(prop, hyperdb.Interval) and v is not None:
                 d[k] = v.serialise()
             else:
                 d[k] = v
@@ -415,11 +412,11 @@
             # get the property spec
             prop = properties[k]
 
-            if isinstance(prop, Date) and v is not None:
+            if isinstance(prop, hyperdb.Date) and v is not None:
                 d[k] = date.Date(v)
-            elif isinstance(prop, Interval) and v is not None:
+            elif isinstance(prop, hyperdb.Interval) and v is not None:
                 d[k] = date.Interval(v)
-            elif isinstance(prop, Password) and v is not None:
+            elif isinstance(prop, hyperdb.Password) and v is not None:
                 p = password.Password()
                 p.unpack(v)
                 d[k] = p
@@ -472,10 +469,15 @@
             'create' or 'set' -- 'params' is a dictionary of property values
             'link' or 'unlink' -- 'params' is (classname, nodeid, propname)
             'retire' -- 'params' is None
+
+            'creator' -- the user performing the action, which defaults to
+            the current user.
         '''
         if __debug__:
             self.config.logging.getLogger('hyperdb').debug('addjournal %s%s %s %r %s %r'%(classname,
                 nodeid, action, params, creator, creation))
+        if creator is None:
+            creator = self.getuid()
         self.transactions.append((self.doSaveJournal, (classname, nodeid,
             action, params, creator, creation)))
 
@@ -653,10 +655,7 @@
 
         # handle supply of the special journalling parameters (usually
         # supplied on importing an existing database)
-        if creator:
-            journaltag = creator
-        else:
-            journaltag = self.getuid()
+        journaltag = creator
         if creation:
             journaldate = creation.serialise()
         else:
@@ -802,7 +801,7 @@
             raise KeyError, '"id" is reserved'
 
         if self.db.journaltag is None:
-            raise DatabaseError, 'Database open read-only'
+            raise hyperdb.DatabaseError, 'Database open read-only'
 
         if propvalues.has_key('creation') or propvalues.has_key('activity'):
             raise KeyError, '"creation" and "activity" are reserved'
@@ -827,7 +826,7 @@
                 raise KeyError, '"%s" has no property "%s"'%(self.classname,
                     key)
 
-            if value is not None and isinstance(prop, Link):
+            if value is not None and isinstance(prop, hyperdb.Link):
                 if type(value) != type(''):
                     raise ValueError, 'link value must be String'
                 link_class = self.properties[key].classname
@@ -849,7 +848,7 @@
                     self.db.addjournal(link_class, value, 'link',
                         (self.classname, newid, key))
 
-            elif isinstance(prop, Multilink):
+            elif isinstance(prop, hyperdb.Multilink):
                 if type(value) != type([]):
                     raise TypeError, 'new property "%s" not a list of ids'%key
 
@@ -881,32 +880,32 @@
                         self.db.addjournal(link_class, nodeid, 'link',
                             (self.classname, newid, key))
 
-            elif isinstance(prop, String):
+            elif isinstance(prop, hyperdb.String):
                 if type(value) != type('') and type(value) != type(u''):
                     raise TypeError, 'new property "%s" not a string'%key
                 if prop.indexme:
                     self.db.indexer.add_text((self.classname, newid, key),
                         value)
 
-            elif isinstance(prop, Password):
+            elif isinstance(prop, hyperdb.Password):
                 if not isinstance(value, password.Password):
                     raise TypeError, 'new property "%s" not a Password'%key
 
-            elif isinstance(prop, Date):
+            elif isinstance(prop, hyperdb.Date):
                 if value is not None and not isinstance(value, date.Date):
                     raise TypeError, 'new property "%s" not a Date'%key
 
-            elif isinstance(prop, Interval):
+            elif isinstance(prop, hyperdb.Interval):
                 if value is not None and not isinstance(value, date.Interval):
                     raise TypeError, 'new property "%s" not an Interval'%key
 
-            elif value is not None and isinstance(prop, Number):
+            elif value is not None and isinstance(prop, hyperdb.Number):
                 try:
                     float(value)
                 except ValueError:
                     raise TypeError, 'new property "%s" not numeric'%key
 
-            elif value is not None and isinstance(prop, Boolean):
+            elif value is not None and isinstance(prop, hyperdb.Boolean):
                 try:
                     int(value)
                 except ValueError:
@@ -918,7 +917,7 @@
                 continue
             if key == self.key:
                 raise ValueError, 'key property "%s" is required'%key
-            if isinstance(prop, Multilink):
+            if isinstance(prop, hyperdb.Multilink):
                 propvalues[key] = []
 
         # done
@@ -1015,7 +1014,7 @@
 
         if not d.has_key(propname):
             if default is _marker:
-                if isinstance(prop, Multilink):
+                if isinstance(prop, hyperdb.Multilink):
                     return []
                 else:
                     return None
@@ -1023,7 +1022,7 @@
                 return default
 
         # return a dupe of the list so code doesn't get confused
-        if isinstance(prop, Multilink):
+        if isinstance(prop, hyperdb.Multilink):
             return d[propname][:]
 
         return d[propname]
@@ -1054,7 +1053,7 @@
         for name,prop in self.getprops(protected=0).items():
             if oldvalues.has_key(name):
                 continue
-            if isinstance(prop, Multilink):
+            if isinstance(prop, hyperdb.Multilink):
                 oldvalues[name] = []
             else:
                 oldvalues[name] = None
@@ -1075,7 +1074,7 @@
             raise KeyError, '"id" is reserved'
 
         if self.db.journaltag is None:
-            raise DatabaseError, 'Database open read-only'
+            raise hyperdb.DatabaseError, 'Database open read-only'
 
         node = self.db.getnode(self.classname, nodeid)
         if node.has_key(self.db.RETIRED_FLAG):
@@ -1113,7 +1112,7 @@
             journalvalues[propname] = current
 
             # do stuff based on the prop type
-            if isinstance(prop, Link):
+            if isinstance(prop, hyperdb.Link):
                 link_class = prop.classname
                 # if it isn't a number, it's a key
                 if value is not None and not isinstance(value, type('')):
@@ -1141,7 +1140,7 @@
                         self.db.addjournal(link_class, value, 'link',
                             (self.classname, nodeid, propname))
 
-            elif isinstance(prop, Multilink):
+            elif isinstance(prop, hyperdb.Multilink):
                 if type(value) != type([]):
                     raise TypeError, 'new property "%s" not a list of'\
                         ' ids'%propname
@@ -1204,36 +1203,36 @@
                 if l:
                     journalvalues[propname] = tuple(l)
 
-            elif isinstance(prop, String):
+            elif isinstance(prop, hyperdb.String):
                 if value is not None and type(value) != type('') and type(value) != type(u''):
                     raise TypeError, 'new property "%s" not a string'%propname
                 if prop.indexme:
                     self.db.indexer.add_text((self.classname, nodeid, propname),
                         value)
 
-            elif isinstance(prop, Password):
+            elif isinstance(prop, hyperdb.Password):
                 if not isinstance(value, password.Password):
                     raise TypeError, 'new property "%s" not a Password'%propname
                 propvalues[propname] = value
 
-            elif value is not None and isinstance(prop, Date):
+            elif value is not None and isinstance(prop, hyperdb.Date):
                 if not isinstance(value, date.Date):
                     raise TypeError, 'new property "%s" not a Date'% propname
                 propvalues[propname] = value
 
-            elif value is not None and isinstance(prop, Interval):
+            elif value is not None and isinstance(prop, hyperdb.Interval):
                 if not isinstance(value, date.Interval):
                     raise TypeError, 'new property "%s" not an '\
                         'Interval'%propname
                 propvalues[propname] = value
 
-            elif value is not None and isinstance(prop, Number):
+            elif value is not None and isinstance(prop, hyperdb.Number):
                 try:
                     float(value)
                 except ValueError:
                     raise TypeError, 'new property "%s" not numeric'%propname
 
-            elif value is not None and isinstance(prop, Boolean):
+            elif value is not None and isinstance(prop, hyperdb.Boolean):
                 try:
                     int(value)
                 except ValueError:
@@ -1266,7 +1265,7 @@
         to modify the "creation" or "activity" properties cause a KeyError.
         '''
         if self.db.journaltag is None:
-            raise DatabaseError, 'Database open read-only'
+            raise hyperdb.DatabaseError, 'Database open read-only'
 
         self.fireAuditors('retire', nodeid, None)
 
@@ -1284,7 +1283,7 @@
         Make node available for all operations like it was before retirement.
         '''
         if self.db.journaltag is None:
-            raise DatabaseError, 'Database open read-only'
+            raise hyperdb.DatabaseError, 'Database open read-only'
 
         node = self.db.getnode(self.classname, nodeid)
         # check if key property was overrided
@@ -1330,7 +1329,7 @@
         support the session storage of the cgi interface.
         '''
         if self.db.journaltag is None:
-            raise DatabaseError, 'Database open read-only'
+            raise hyperdb.DatabaseError, 'Database open read-only'
         self.db.destroynode(self.classname, nodeid)
 
     def history(self, nodeid):
@@ -1365,7 +1364,7 @@
         property doesn't exist, KeyError is raised.
         '''
         prop = self.getprops()[propname]
-        if not isinstance(prop, String):
+        if not isinstance(prop, hyperdb.String):
             raise TypeError, 'key properties must be String'
         self.key = propname
 
@@ -1445,7 +1444,7 @@
         for propname, itemids in propspec:
             # check the prop is OK
             prop = self.properties[propname]
-            if not isinstance(prop, Link) and not isinstance(prop, Multilink):
+            if not isinstance(prop, hyperdb.Link) and not isinstance(prop, hyperdb.Multilink):
                 raise TypeError, "'%s' not a Link/Multilink property"%propname
 
         # ok, now do the find
@@ -1470,10 +1469,10 @@
                     # grab the property definition and its value on this item
                     prop = self.properties[propname]
                     value = item[propname]
-                    if isinstance(prop, Link) and itemids.has_key(value):
+                    if isinstance(prop, hyperdb.Link) and itemids.has_key(value):
                         l.append(id)
                         break
-                    elif isinstance(prop, Multilink):
+                    elif isinstance(prop, hyperdb.Multilink):
                         hit = 0
                         for v in value:
                             if itemids.has_key(v):
@@ -1496,7 +1495,7 @@
         '''
         for propname in requirements.keys():
             prop = self.properties[propname]
-            if not isinstance(prop, String):
+            if not isinstance(prop, hyperdb.String):
                 raise TypeError, "'%s' not a String property"%propname
             requirements[propname] = requirements[propname].lower()
         l = []
@@ -1590,7 +1589,7 @@
         timezone = self.db.getUserTimezone()
         for k, v in filterspec.items():
             propclass = props[k]
-            if isinstance(propclass, Link):
+            if isinstance(propclass, hyperdb.Link):
                 if type(v) is not type([]):
                     v = [v]
                 u = []
@@ -1600,14 +1599,14 @@
                         entry = None
                     u.append(entry)
                 l.append((LINK, k, u))
-            elif isinstance(propclass, Multilink):
+            elif isinstance(propclass, hyperdb.Multilink):
                 # the value -1 is a special "not set" sentinel
                 if v in ('-1', ['-1']):
                     v = []
                 elif type(v) is not type([]):
                     v = [v]
                 l.append((MULTILINK, k, v))
-            elif isinstance(propclass, String) and k != 'id':
+            elif isinstance(propclass, hyperdb.String) and k != 'id':
                 if type(v) is not type([]):
                     v = [v]
                 m = []
@@ -1619,22 +1618,22 @@
                     m.append(v)
                 m = re.compile('(%s)'%('|'.join(m)), re.I)
                 l.append((STRING, k, m))
-            elif isinstance(propclass, Date):
+            elif isinstance(propclass, hyperdb.Date):
                 try:
-                    date_rng = Range(v, date.Date, offset=timezone)
+                    date_rng = date.Range(v, date.Date, offset=timezone)
                     l.append((DATE, k, date_rng))
                 except ValueError:
                     # If range creation fails - ignore that search parameter
                     pass
-            elif isinstance(propclass, Interval):
+            elif isinstance(propclass, hyperdb.Interval):
                 try:
-                    intv_rng = Range(v, date.Interval)
+                    intv_rng = date.Range(v, date.Interval)
                     l.append((INTERVAL, k, intv_rng))
                 except ValueError:
                     # If range creation fails - ignore that search parameter
                     pass
 
-            elif isinstance(propclass, Boolean):
+            elif isinstance(propclass, hyperdb.Boolean):
                 if type(v) != type([]):
                     v = v.split(',')
                 bv = []
@@ -1650,7 +1649,7 @@
                     v = v.split(',')
                 l.append((OTHER, k, [str(int(val)) for val in v]))
 
-            elif isinstance(propclass, Number):
+            elif isinstance(propclass, hyperdb.Number):
                 if type(v) != type([]):
                     v = v.split(',')
                 l.append((OTHER, k, [float(val) for val in v]))
@@ -1764,7 +1763,7 @@
                             else:
                                 # the node doesn't have a value for this
                                 # property
-                                if isinstance(propclass, Multilink): v = []
+                                if isinstance(propclass, hyperdb.Multilink): v = []
                                 else: v = None
                                 entry.insert(0, v)
                                 continue
@@ -1774,12 +1773,12 @@
                             entry.insert(0, v)
                             continue
 
-                        if isinstance(propclass, String):
+                        if isinstance(propclass, hyperdb.String):
                             # it might be a string that's really an integer
                             try: tv = int(v)
                             except: v = v.lower()
                             else: v = tv
-                        elif isinstance(propclass, Link):
+                        elif isinstance(propclass, hyperdb.Link):
                             lcn = propclass.classname
                             link = self.db.classes[lcn]
                             key = None
@@ -1855,7 +1854,7 @@
         '''
         d = self.properties.copy()
         if protected:
-            d['id'] = String()
+            d['id'] = hyperdb.String()
             d['creation'] = hyperdb.Date()
             d['activity'] = hyperdb.Date()
             d['creator'] = hyperdb.Link('user')
@@ -1955,7 +1954,7 @@
             Return the nodeid of the node imported.
         '''
         if self.db.journaltag is None:
-            raise DatabaseError, 'Database open read-only'
+            raise hyperdb.DatabaseError, 'Database open read-only'
         properties = self.getprops()
 
         # make the new node's property map
@@ -2019,11 +2018,11 @@
                         # make sure the params are eval()'able
                         if value is None:
                             pass
-                        elif isinstance(prop, Date):
+                        elif isinstance(prop, hyperdb.Date):
                             value = value.get_tuple()
-                        elif isinstance(prop, Interval):
+                        elif isinstance(prop, hyperdb.Interval):
                             value = value.get_tuple()
-                        elif isinstance(prop, Password):
+                        elif isinstance(prop, hyperdb.Password):
                             value = str(value)
                         params[propname] = value
                 l = [nodeid, date, user, action, params]
@@ -2045,14 +2044,14 @@
                     prop = properties[propname]
                     if value is None:
                         pass
-                    elif isinstance(prop, Date):
+                    elif isinstance(prop, hyperdb.Date):
                         if type(value) == type(()):
                             print 'warning: invalid date tuple %r'%(value,)
-                            value = Date( "2000-1-1" )
+                            value = date.Date( "2000-1-1" )
                         value = date.Date(value)
-                    elif isinstance(prop, Interval):
+                    elif isinstance(prop, hyperdb.Interval):
                         value = date.Interval(value)
-                    elif isinstance(prop, Password):
+                    elif isinstance(prop, hyperdb.Password):
                         pwd = password.Password()
                         pwd.unpack(value)
                         value = pwd
@@ -2107,7 +2106,7 @@
             try:
                 return self.db.getfile(self.classname, nodeid, None)
             except IOError, (strerror):
-                # XXX by catching this we donot see an error in the log.
+                # XXX by catching this we don't see an error in the log.
                 return 'ERROR reading file: %s%s\n%s\n%s'%(
                         self.classname, nodeid, poss_msg, strerror)
         if default is not _marker:
@@ -2125,7 +2124,7 @@
         for name,prop in self.getprops(protected=0).items():
             if oldvalues.has_key(name):
                 continue
-            if isinstance(prop, Multilink):
+            if isinstance(prop, hyperdb.Multilink):
                 oldvalues[name] = []
             else:
                 oldvalues[name] = None

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