[Checkins] SVN: Sandbox/ctheune/zodbupgrade/src/zodbupgrade/ Clean up output, provide more options.

Christian Theune ct at gocept.com
Mon Jun 8 02:57:12 EDT 2009


Log message for revision 100724:
  Clean up output, provide more options.
  

Changed:
  U   Sandbox/ctheune/zodbupgrade/src/zodbupgrade/analyze.py
  U   Sandbox/ctheune/zodbupgrade/src/zodbupgrade/main.py

-=-
Modified: Sandbox/ctheune/zodbupgrade/src/zodbupgrade/analyze.py
===================================================================
--- Sandbox/ctheune/zodbupgrade/src/zodbupgrade/analyze.py	2009-06-07 17:57:37 UTC (rev 100723)
+++ Sandbox/ctheune/zodbupgrade/src/zodbupgrade/analyze.py	2009-06-08 06:57:11 UTC (rev 100724)
@@ -29,6 +29,10 @@
 KNOWN_HARD = 'ci'
 
 
+class MissingClasses(ValueError):
+    pass
+
+
 def find_factory_references(pickle):
     """Analyze a pickle for moved or missing factory references.
 
@@ -82,6 +86,7 @@
     updating, a list of classes that are missing, and a list of rewrites.
 
     """
+    logger.info('Analyzing database ...')
     missing_classes = set()
     rewrites_found = dict()
     oids_rewrite = set()
@@ -95,8 +100,8 @@
 
         if not count % 5000:
             logger.info(
-                'Analyzed %i objects. Found %i moved classes and %i missing '
-                'classes so far.' % (count, len(rewrites_found), len(missing_classes)))
+                '    %i objects - %i moved classes - %i classes missing'
+                % (count, len(rewrites_found), len(missing_classes)))
 
         # ZODB records consist of two concatenated pickles, so the following
         # needs to be done twice:
@@ -109,19 +114,26 @@
 
         if next is None:
             break
+    logger.info('    Analyzation completed.')
     return missing_classes, rewrites_found, oids_rewrite
 
 
-def update_storage(storage):
+def update_storage(storage, ignore_missing=False, dry=False):
     missing_classes, rewrites_found, oids = analyze_storage(storage)
-    if missing_classes:
-        raise ValueError(missing_classes)
+    if missing_classes and not ignore_missing:
+        raise MissingClasses(missing_classes)
 
-    logger.info("Rewriting database with mapping:")
+    if rewrites_found:
+        logger.info("Found moved classes:")
     for (old_mod, old_name), (new_mod, new_name) in rewrites_found.items():
         logger.info("%s.%s -> %s.%s" % (old_mod, old_name, new_mod, new_name))
-    logger.info("%i objects need rewriting" % len(oids))
+    logger.info("%i objects need updating" % len(oids))
 
+    if dry:
+        logger.info('Dry run selected, aborting.')
+        return
+
+    logger.info('Starting database update')
     db = DB(storage)
     connection = db.open()
     for oid in oids:
@@ -131,3 +143,4 @@
     t.note('Class references updated by `zodbupgrade`')
     transaction.commit()
     db.close()
+    logger.info('Database update completed')

Modified: Sandbox/ctheune/zodbupgrade/src/zodbupgrade/main.py
===================================================================
--- Sandbox/ctheune/zodbupgrade/src/zodbupgrade/main.py	2009-06-07 17:57:37 UTC (rev 100723)
+++ Sandbox/ctheune/zodbupgrade/src/zodbupgrade/main.py	2009-06-08 06:57:11 UTC (rev 100724)
@@ -12,17 +12,52 @@
 #
 ##############################################################################
 
+import ZODB.config
+import ZODB.FileStorage
+import logging
+import optparse
 import sys
 import zodbupgrade.analyze
-import ZODB.FileStorage
-import logging
 
 
-logging.getLogger().addHandler(logging.StreamHandler())
-logging.getLogger().setLevel(0)
+parser = optparse.OptionParser(
+    description="Updates all references to classes to their canonical location.")
+parser.add_option("-f", "--file",
+                  help="load FileStorage")
+parser.add_option("-c", "--config",
+                  help="load storage from config file")
+parser.add_option("-n", "--dry-run", action="store_true",
+                  help="perform a trial run with no changes made")
+parser.add_option("--ignore-missing", action="store_true",
+                  help="update database even if classes are missing")
+parser.add_option("-q", "--quiet", action="store_true",
+                  help="suppress non-error messages")
 
+def main():
+    options, args = parser.parse_args()
 
-def main():
-    db = sys.argv[1]
-    storage = ZODB.FileStorage.FileStorage('Data.fs')
-    zodbupgrade.analyze.update_storage(storage)
+    if options.file and options.config:
+        raise SystemExit(
+            'Exactly one of --file or --config must be given.')
+
+    if options.file:
+        storage = ZODB.FileStorage.FileStorage(options.file)
+    elif options.config:
+        storage = ZODB.config.storageFromURL(options.config)
+    else:
+        raise SystemExit(
+            'Exactly one of --file or --config must be given.')
+
+    if options.quiet:
+        level = logging.ERROR
+    else:
+        level = logging.INFO
+    logging.getLogger().addHandler(logging.StreamHandler())
+    logging.getLogger().setLevel(level)
+
+    try:
+        zodbupgrade.analyze.update_storage(
+            storage, options.ignore_missing, options.dry_run)
+    except zodbupgrade.analyze.MissingClasses, e:
+        for class_ in e.args[0]:
+            zodbupgrade.analyze.logger.error('Missing class: %s' % class_)



More information about the Checkins mailing list