[Checkins] SVN: z3c.blobfile/trunk/src/z3c/blobfile/generations/evolve1.py Tried an evolution script with lower memory needs.

Uwe Oestermeier u.oestermeier at iwm-kmrc.de
Wed Nov 14 12:08:10 EST 2007


Log message for revision 81842:
  Tried an evolution script with lower memory needs.

Changed:
  U   z3c.blobfile/trunk/src/z3c/blobfile/generations/evolve1.py

-=-
Modified: z3c.blobfile/trunk/src/z3c/blobfile/generations/evolve1.py
===================================================================
--- z3c.blobfile/trunk/src/z3c/blobfile/generations/evolve1.py	2007-11-14 16:06:32 UTC (rev 81841)
+++ z3c.blobfile/trunk/src/z3c/blobfile/generations/evolve1.py	2007-11-14 17:08:10 UTC (rev 81842)
@@ -1,4 +1,5 @@
 import logging
+import transaction
 
 import zope.interface
 import zope.component
@@ -13,6 +14,22 @@
 import z3c.blobfile.image
 
 
+def changeImplementation(file, klass):
+    file._blob = Blob()
+    _data = file.__dict__['_data']
+    del file.__dict__['_data']
+    file.__class__ = klass
+    fp = file.open('w')
+    if isinstance(_data, zope.app.file.file.FileChunk):
+        fp.write(_data._data)
+        del _data._data
+        _data = _data.next
+    else:
+        fp.write(_data)
+    del _data
+    fp.close()
+            
+    
 def evolveZopeAppFile(root):
     """Replaces the classes and data of zope.app.file objects.
     
@@ -20,25 +37,18 @@
     Doesn't throw an ObjectModify event.
     """
     for file in findObjectsProviding(root, IFile):
-        data = file.data
-        file._blob = Blob()
-        
         if isinstance(file, zope.app.file.File):
-            file.__class__ = z3c.blobfile.file.File
-            file.data = data
-            continue
-            
-        if isinstance(file, zope.app.file.Image):
-            file.__class__ = z3c.blobfile.image.Image
-            file.data = data 
-            continue
-        
-        logging.getLogger('z3c.blobfile.generations').warn(
+            changeImplementation(file, z3c.blobfile.file.File)
+        elif isinstance(file, zope.app.file.Image):
+            changeImplementation(file, z3c.blobfile.image.Image)
+        else:
+            logging.getLogger('z3c.blobfile.generations').warn(
             'Unknown zope.app.file.interfaces.IFile implementation %s.%s' % (
                 file.__class__.__module__,
                 file.__class__.__name__))
          
-    
+        transaction.savepoint(optimistic=True)
+        
 def evolve(context):
     """
     Replaces all zope.app.file content objects with z3c.blobfile counterparts.



More information about the Checkins mailing list