[Uludag-commits] r4931 - trunk/pisi/pisi

svn-uludag at uludag.org.tr svn-uludag at uludag.org.tr
11 Ara 2005 Paz 14:33:16 EET


Author: exa
Date: Sun Dec 11 14:33:15 2005
New Revision: 4931

Modified:
   trunk/pisi/pisi/dbshelve.py
   trunk/pisi/pisi/lockeddbshelve.py
Log:
* fix: use non-transactional access in read-only mode...


Modified: trunk/pisi/pisi/dbshelve.py
=================================================================
--- trunk/pisi/pisi/dbshelve.py	(original)
+++ trunk/pisi/pisi/dbshelve.py	Sun Dec 11 14:33:15 2005
@@ -59,13 +59,16 @@
     def txn_proc(self, proc, txn):
         # can be used to txn protect a method automatically
         if not txn:
-            autotxn = self.dbenv.txn_begin()
-            try:
-                retval = proc(autotxn)
-            except db.DBError, e:
-                autotxn.abort()
-                raise e
-            autotxn.commit()
+            if self.dbenv:
+                autotxn = self.dbenv.txn_begin()
+                try:
+                    retval = proc(autotxn)
+                except db.DBError, e:
+                    autotxn.abort()
+                    raise e
+                autotxn.commit()
+            else: # execute without transactions
+                proc(None)
             return retval
         else:
             return proc(txn)
@@ -96,26 +99,16 @@
         return len(self.db)
         
     def __getitem__(self, key):
-        txn = self.dbenv.txn_begin()
-        try:
+        def proc(txn):
             data = self.db.get(key)
-        except db.DBError, e:
-            txn.abort()
-            raise e
-        txn.commit()
-        return cPickle.loads(data)
+            return cPickle.loads(data)
+        return self.txn_proc(proc, txn)
 
     def __setitem__(self, key, value):
         # hyperdandik transactions
-        txn = self.dbenv.txn_begin()
-        data = cPickle.dumps(value, self.binary)
-        try:
+        def proc(txn):
             self.db.put(key,data,txn)
-            #print 'put', value
-        except db.DBError, e:
-            txn.abort()
-            raise e
-        txn.commit()
+        return self.txn_proc(proc, txn)
 
     def __delitem__(self, key):
         txn = self.dbenv.txn_begin()

Modified: trunk/pisi/pisi/lockeddbshelve.py
=================================================================
--- trunk/pisi/pisi/lockeddbshelve.py	(original)
+++ trunk/pisi/pisi/lockeddbshelve.py	Sun Dec 11 14:33:15 2005
@@ -34,12 +34,6 @@
     pass
 
 def init_dbenv():
-    ctx.dbenv = dbobj.DBEnv()
-    flags =  (db.DB_INIT_MPOOL |      # cache
-              db.DB_INIT_TXN |        # transaction subsystem
-              db.DB_INIT_LOG |        # logging subsystem
-              db.DB_RECOVER |         # run normal recovery
-              db.DB_CREATE)           # allow db to create files
     if os.access(pisi.context.config.db_dir(), os.R_OK):
         # try to read version
         verfn = join_path(pisi.context.config.db_dir(), 'dbversion')
@@ -63,8 +57,15 @@
     else:
         raise Error(_('Cannot attain read access to database environment'))
     if os.access(pisi.context.config.db_dir(), os.W_OK):
-        pass # TODO: is it possible to have read-only txnal dbs?
-    ctx.dbenv.open(pisi.context.config.db_dir(), flags)
+        ctx.dbenv = dbobj.DBEnv()
+        flags =  (db.DB_INIT_MPOOL |      # cache
+                  db.DB_INIT_TXN |        # transaction subsystem
+                  db.DB_INIT_LOG |        # logging subsystem
+                  db.DB_RECOVER |         # run normal recovery
+                  db.DB_CREATE)           # allow db to create files
+        ctx.dbenv.open(pisi.context.config.db_dir(), flags)
+    else:
+        ctx.dbenv = None
 
 #def open(filename, flags='r', mode = 0644, filetype = db.DB_BTREE):
 #    db = LockedDBShelf(None, mode, filetype, None, True)
@@ -82,6 +83,8 @@
         filename = join_path(pisi.context.config.db_dir(), dbname + '.bdb')
         if os.access(os.path.dirname(filename), os.W_OK):
             flags = 'w'
+            if not self.dbenv:
+                raise Error(_('Database writes not allowed without transactions'))
         elif os.access(filename, os.R_OK):
             flags = 'r'
         else:


Uludag-commits mesaj listesiyle ilgili daha fazla bilgi