[Zope-Checkins] CVS: StandaloneZODB/ZODB - FileStorage.py:1.76.8.5

Jeremy Hylton jeremy@zope.com
Mon, 7 Jan 2002 18:04:41 -0500


Update of /cvs-repository/StandaloneZODB/ZODB
In directory cvs.zope.org:/tmp/cvs-serv8272/ZODB

Modified Files:
      Tag: Standby-branch
	FileStorage.py 
Log Message:
Implement isReadOnly() for FileStorage.

A FileStorage now raises ReadOnlyError when an update is attempted on
a read_only storage.  It used to fail with an IOError when an attempt
was made to write() a read-only file.


=== StandaloneZODB/ZODB/FileStorage.py 1.76.8.4 => 1.76.8.5 ===
 
         if read_only:
+            self._is_read_only = 1
             if create:
                 raise ValueError, "can\'t create a read-only file"
         elif stop is not None:
@@ -408,6 +409,8 @@
         
     def commitVersion(self, src, dest, transaction, abort=None):
         # We are going to commit by simply storing back pointers.
+        if self._is_read_only:
+            raise POSException.ReadOnlyError()
         if not (src and isinstance(src, StringType)
                 and isinstance(dest, StringType)):
             raise POSException.VersionCommitError('Invalid source version')
@@ -618,6 +621,8 @@
         finally: self._lock_release()
 
     def store(self, oid, serial, data, version, transaction):
+        if self._is_read_only:
+            raise POSException.ReadOnlyError()
         if transaction is not self._transaction:
             raise POSException.StorageTransactionError(self, transaction)
 
@@ -683,8 +688,11 @@
         finally:
             self._lock_release()
 
-    def supportsUndo(self): return 1
-    def supportsVersions(self): return 1
+    def supportsUndo(self):
+        return 1
+    
+    def supportsVersions(self):
+        return 1
 
     def _clear_temp(self):
         self._tindex.clear()
@@ -773,6 +781,8 @@
             self._nextpos=0
 
     def undo(self, transaction_id):
+        if self._is_read_only:
+            raise POSException.ReadOnlyError()
         self._lock_acquire()
         try:
             self._clear_index()
@@ -820,7 +830,8 @@
             return t.keys()            
         finally: self._lock_release()
 
-    def supportsTransactionalUndo(self): return 1
+    def supportsTransactionalUndo(self):
+        return 1
 
     def _undoDataInfo(self, oid, pos, tpos):
         """Return the serial, data pointer, data, and version for the oid
@@ -942,7 +953,9 @@
         # writing a file position rather than a pickle. Sometimes, we
         # may do conflict resolution, in which case we actually copy
         # new data that results from resolution.
-        
+
+        if self._is_read_only:
+            raise POSException.ReadOnlyError()
         if transaction is not self._transaction:
             raise POSException.StorageTransactionError(self, transaction)
         
@@ -1187,6 +1200,8 @@
         the associated data are copied, since the old records are not copied.
         """
 
+        if self._is_read_only:
+            raise POSException.ReadOnlyError()
         # Ugh, this seems long
         
         packing=1 # are we in the packing phase (or the copy phase)