Mercurial > p > roundup > code
diff roundup/backends/back_anydbm.py @ 690:509a101305da
node ids are now generated from a lockable store - no more race conditions
We're using the portalocker code by Jonathan Feinberg that was contributed
to the ASPN Python cookbook. This gives us locking across Unix and Windows.
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Mon, 15 Apr 2002 23:25:15 +0000 |
| parents | bc46480e2a2b |
| children | 210e1ae39ab1 |
line wrap: on
line diff
--- a/roundup/backends/back_anydbm.py Mon Apr 15 06:37:31 2002 +0000 +++ b/roundup/backends/back_anydbm.py Mon Apr 15 23:25:15 2002 +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.31 2002-04-03 05:54:31 richard Exp $ +#$Id: back_anydbm.py,v 1.32 2002-04-15 23:25:15 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 @@ -26,6 +26,7 @@ import whichdb, anydbm, os, marshal from roundup import hyperdb, date from blobfiles import FileStorage +from locking import acquire_lock, release_lock # # Now the database @@ -130,6 +131,7 @@ ''' if hyperdb.DEBUG: print '_opendb', (self, name, mode) + # determine which DB wrote the class file db_type = '' path = os.path.join(os.getcwd(), self.dir, name) @@ -159,6 +161,31 @@ print "_opendb %r.open(%r, %r)"%(db_type, path, mode) return dbm.open(path, mode) + def _lockdb(self, name): + ''' Lock a database file + ''' + path = os.path.join(os.getcwd(), self.dir, '%s.lock'%name) + return acquire_lock(path) + + # + # Node IDs + # + def newid(self, classname): + ''' Generate a new id for the given class + ''' + # open the ids DB - create if if doesn't exist + lock = self._lockdb('_ids') + db = self._opendb('_ids', 'c') + if db.has_key(classname): + newid = db[classname] = str(int(db[classname]) + 1) + else: + # the count() bit is transitional - older dbs won't start at 1 + newid = str(self.getclass(classname).count()+1) + db[classname] = newid + db.close() + release_lock(lock) + return newid + # # Nodes # @@ -442,6 +469,14 @@ # #$Log: not supported by cvs2svn $ +#Revision 1.31 2002/04/03 05:54:31 richard +#Fixed serialisation problem by moving the serialisation step out of the +#hyperdb.Class (get, set) into the hyperdb.Database. +# +#Also fixed htmltemplate after the showid changes I made yesterday. +# +#Unit tests for all of the above written. +# #Revision 1.30 2002/02/27 03:40:59 richard #Ran it through pychecker, made fixes #
