[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