Ignore:
Timestamp:
22 May 2013, 01:00:57 (12 years ago)
Author:
uli
Message:

Sketch of a diff tool for two Data.fs files.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/trunk/src/waeup/kofa/maintenance.py

    r8719 r10182  
    55"""
    66import sys
    7 from ZODB.scripts.analyze import report, analyze
     7from ZODB.FileStorage import FileStorage
     8from ZODB.scripts.analyze import report, analyze, shorten
    89from zope.component.hooks import setSite
    910from zope.component import getUtility
    1011from zope.catalog.interfaces import ICatalog
    1112from zope.intid.interfaces import IIntIds
     13
    1214
    1315def db_analyze(args=None):
     
    5759        cat.index_doc(doc_id, ob)
    5860    return cat
     61
     62def db_diff(args=None):
     63    """Run the analyze tool from ZODB package to find diffs between
     64       two ZODBs.
     65    """
     66    if args is None:
     67        args = sys.argv[1:]
     68
     69    zodb_path1, zodb_path2 = (None, None)
     70    if len(args) > 1:
     71        zodb_path1, zodb_path2 = args[0:2]
     72    else:
     73        print
     74        print "Analyze two ZODB files and print statistics"
     75        print "about contained objects, sizes, etc."
     76        print "Shows only differences."
     77        print
     78        print "Usage: %s <path-to-Data1.fs> <path-to-Data2.fs>" % sys.argv[0]
     79        print
     80        sys.exit(0)
     81
     82    a1 = analyze(zodb_path1)
     83    a2 = analyze(zodb_path2)
     84
     85    diff_report(a1, a2)
     86
     87
     88def diff_report(rep1, rep2):
     89    print "Processed %d (%d, %d) records in %d (%d, %d) transactions" % (
     90        rep1.OIDS + rep2.OIDS, rep1.OIDS, rep2.OIDS,
     91        rep1.TIDS + rep2.TIDS, rep2.TIDS, rep2.TIDS)
     92    print "Types used:"
     93    fmt = "  %-44s %7s %9s %6s %7s"
     94    fmtp = "%-44s %+7d %9d %5.1f%% %7.2f" # per-class format
     95    fmtpplus = "+ %-44s %+7d %+9d %+5.1f%% %7.2f" # per-class format
     96    fmtpminus = "- %-44s %+7d %+9d %+5.1f%% %7.2f" # per-class format
     97    fmts = "  %44s %+7d %+8dk %+5.1f%% %+7.2f" # summary format
     98    typemap1, typemap2 = rep1.TYPEMAP.keys(), rep2.TYPEMAP.keys()
     99    typemap1.sort()
     100    typemap2.sort()
     101    typemap = list(set(typemap1 + typemap2))
     102    typemap.sort()
     103    print fmt % ("Class Name", "Count", "TBytes", "Pct", "AvgSize")
     104    print fmt % ('-'*44, '-'*7, '-'*9, '-'*5, '-'*7)
     105    for t in typemap:
     106        if t in typemap1 and t in typemap2 and (
     107            rep1.TYPESIZE[t] == rep2.TYPESIZE[t]) and (
     108            rep1.TYPEMAP[t] == rep2.TYPEMAP[t]):
     109            continue
     110        if t not in typemap1:
     111            cnt = rep2.TYPEMAP[t]
     112            pct = rep2.TYPESIZE[t] * 100.0 / rep2.DBYTES
     113            print fmtpplus % (shorten(t, 44), cnt, rep2.TYPESIZE[t],
     114                      pct, rep2.TYPESIZE[t] * 1.0 / rep2.TYPEMAP[t])
     115
     116        elif t not in typemap2:
     117            cnt = -rep1.TYPEMAP[t]
     118            pct = rep1.TYPESIZE[t] * 100.0 / rep1.DBYTES
     119            print fmtpminus % (shorten(t, 44), cnt, -rep1.TYPESIZE[t],
     120                      pct, rep1.TYPESIZE[t] * 1.0 / rep1.TYPEMAP[t])
     121        else:
     122            cnt = rep2.TYPEMAP[t] - rep1.TYPEMAP[t]
     123            pct1 = rep1.TYPESIZE[t] * 100.0 / rep1.DBYTES
     124            pct2 = rep2.TYPESIZE[t] * 100.0 / rep2.DBYTES
     125            pct = pct2 - pct1
     126            size = rep2.TYPESIZE[t] - rep1.TYPESIZE[t]
     127            if cnt > 0:
     128                print fmtpplus % (
     129                    shorten(t, 44), cnt, size,
     130                    pct, rep2.TYPESIZE[t] * 1.0 / rep2.TYPEMAP[t])
     131            else:
     132                print fmtpminus % (
     133                    shorten(t, 44), cnt, size,
     134                    pct, rep1.TYPESIZE[t] * 1.0 / rep1.TYPEMAP[t])
     135
     136
     137    print fmt % ('='*44, '='*7, '='*9, '='*5, '='*7)
     138    print fmts % ('Current Objects', rep2.COIDS - rep1.COIDS,
     139                  (rep2.CBYTES / 1024.0) - (rep1.CBYTES / 1024.0),
     140                  (rep2.CBYTES * 100.0 / rep2.DBYTES) - (
     141                      rep1.CBYTES * 100.0 / rep1.DBYTES),
     142                  (rep2.CBYTES * 1.0 / rep2.COIDS) - (
     143                      rep1.CBYTES * 1.0 / rep1.COIDS))
     144    #if rep1.FOIDS and rep2.FOIDS:
     145    fbytes = (rep2.FBYTES / 1024.0) - (rep1.FBYTES / 1024.0)
     146    rep1_fpct = (rep1.DBYTES and
     147                 (rep1.FBYTES * 100.0 / (rep1.DBYTES)) or 0.0)
     148    rep2_fpct = (rep2.DBYTES and
     149                 (rep2.FBYTES * 100.0 / (rep2.DBYTES)) or 0.0)
     150    print fmts % ('Old Objects', rep2.FOIDS - rep1.FOIDS,
     151                  fbytes, rep2_fpct - rep1_fpct,
     152                  (rep2.FBYTES * 1.0 / (rep2.FOIDS or 1.0)) - (
     153                      rep1.FBYTES * 1.0 / (rep1.FOIDS or 1.0)))
     154    return
     155
Note: See TracChangeset for help on using the changeset viewer.