def compare_truncated(self, src, dest): """Confirm that dest is a truncated copy of src. The copy process should have dropped all old revisions of objects in src. Also note that the dest does not retain transaction metadata. """ missing = object() src_objects = {} # {oid: (tid, data, blob or None)} for txn in src.iterator(): for rec in txn: if is_blob_record(rec.data): try: fn = src.loadBlob(rec.oid, rec.tid) except ZODB.POSException.POSKeyError: blob = None else: blob = open(fn, 'rb').read() else: blob = None src_objects[rec.oid] = (rec.tid, rec.data, blob) unchecked = set(src_objects) for txn in dest.iterator(): for rec in txn: if is_blob_record(rec.data): try: fn = dest.loadBlob(rec.oid, rec.tid) except ZODB.POSException.POSKeyError: blob = None else: blob = open(fn, 'rb').read() else: blob = None dst_object = (rec.tid, rec.data, blob) src_object = src_objects[rec.oid] self.assertEqual(src_object, dst_object) unchecked.remove(rec.oid) self.assertEqual(len(unchecked), 0)
def _call(self, *args, **kw): from relstorage.blobhelper import is_blob_record return is_blob_record(*args, **kw)
def compare_exact(self, storage1, storage2): """Confirm that storage1 and storage2 contain equivalent data""" eq = self.assertEqual missing = object() iter1 = storage1.iterator() iter2 = storage2.iterator() for txn1, txn2 in izip(iter1, iter2): eq(txn1.tid, txn2.tid) eq(txn1.status, txn2.status) eq(txn1.user, txn2.user) eq(txn1.description, txn2.description) # b/w compat on the 'extension' attribute e1 = getattr(txn1, 'extension', missing) if e1 is missing: # old attribute name e1 = txn1._extension e2 = getattr(txn2, 'extension', missing) if e2 is missing: # old attribute name e2 = txn2._extension eq(e1, e2) # compare the objects in the transaction, but disregard # the order of the objects and any duplicated records # since those are not important. recs1 = dict([(r.oid, r) for r in txn1]) recs2 = dict([(r.oid, r) for r in txn2]) eq(len(recs1), len(recs2)) recs1 = list(recs1.items()) recs1.sort() recs2 = list(recs2.items()) recs2.sort() for (oid1, rec1), (oid2, rec2) in izip(recs1, recs2): eq(rec1.oid, rec2.oid) eq(rec1.tid, rec2.tid) eq(rec1.data, rec2.data) if is_blob_record(rec1.data): try: fn1 = storage1.loadBlob(rec1.oid, rec1.tid) except ZODB.POSException.POSKeyError: self.assertRaises( ZODB.POSException.POSKeyError, storage2.loadBlob, rec1.oid, rec1.tid) else: fn2 = storage2.loadBlob(rec1.oid, rec1.tid) self.assert_(fn1 != fn2) eq(open(fn1, 'rb').read(), open(fn2, 'rb').read()) # Make sure ther are no more records left in txn1 and txn2, meaning # they were the same length try: iter1.next() except (IndexError, StopIteration): pass else: self.fail("storage1 has more records") try: iter2.next() except (IndexError, StopIteration): pass else: self.fail("storage2 has more records") iter1.close() iter2.close()