diff --git a/zodbtools/zodbcmp.py b/zodbtools/zodbcmp.py index 7db5558bcac1298030d36ab151bf909841ff3b53..4324e4083017252b543cb992db5f8d227a2c4e4e 100644 --- a/zodbtools/zodbcmp.py +++ b/zodbtools/zodbcmp.py @@ -34,6 +34,7 @@ from __future__ import print_function from zodbtools.util import ashex, inf, nextitem, txnobjv, parse_tidrange, TidRangeInvalid, \ storageFromURL from time import time +from ZODB.FileStorage import FileIterator # compare two storage transactions # 0 - equal, 1 - non-equal @@ -63,10 +64,7 @@ def txncmp(txn1, txn2): # compare two storages # 0 - equal, 1 - non-equal -def storcmp(stor1, stor2, tidmin, tidmax, verbose=False): - iter1 = stor1.iterator(tidmin, tidmax) - iter2 = stor2.iterator(tidmin, tidmax) - +def storcmp(iter1, iter2, verbose=False): Tprev = time() txncount = 0 while 1: @@ -116,10 +114,13 @@ summary = "compare two ZODB databases" def usage(out): print("""\ -Usage: zodb cmp [OPTIONS] [tidmin..tidmax] +Usage: zodb cmp [OPTIONS] [@] [@] [tidmin..tidmax] Compare two ZODB databases. is an URL (see 'zodb help zurl') of a ZODB-storage. +It can also be the path of a FileStorage DB, in which case an optional +specifies a file offset from where iteration starts. must point to the +beginning of a transaction. Options: @@ -144,12 +145,6 @@ def main2(argv): if opt in ("-v", "--verbose"): verbose = True - try: - storurl1, storurl2 = argv[0:2] - except ValueError: - usage(sys.stderr) - sys.exit(2) - # parse tidmin..tidmax tidmin = tidmax = None if len(argv) > 2: @@ -159,10 +154,28 @@ def main2(argv): print("E: invalid tidrange: %s" % e, file=sys.stderr) sys.exit(2) - stor1 = storageFromURL(storurl1, read_only=True) - stor2 = storageFromURL(storurl2, read_only=True) + elif len(argv) < 2: + usage(sys.stderr) + sys.exit(2) - zcmp = storcmp(stor1, stor2, tidmin, tidmax, verbose) + istor = [] + for url in argv[:2]: + if "://" in url: + istor.append(storageFromURL(url, read_only=True).iterator( + tidmin, tidmax)) + continue + url = url.rsplit('@', 1) + if len(url) > 1: + try: + args = int(url[1]), + except ValueError: + print("E: invalid file offset: %s" % url[1], file=sys.stderr) + sys.exit(2) + else: + args = () + istor.append(FileIterator(url[0], tidmin, tidmax, *args)) + + zcmp = storcmp(istor[0], istor[1], verbose) sys.exit(1 if zcmp else 0) def main(argv):