[Zodb-checkins] CVS: StandaloneZODB/ZODB - fsdump.py:1.1.2.1 TimeStamp.c:1.10.18.1

Barry Warsaw barry@wooz.org
Wed, 23 Jan 2002 17:14:55 -0500


Update of /cvs-repository/StandaloneZODB/ZODB
In directory cvs.zope.org:/tmp/cvs-serv20371

Modified Files:
      Tag: Recovery
	TimeStamp.c 
Added Files:
      Tag: Recovery
	fsdump.py 
Log Message:
Adding two files that existed on the trunk before the Recovery branch
was created.

Also, TimeStamp.c was modified on the trunk, so I'm merging those
changes into this branch.



=== Added File StandaloneZODB/ZODB/fsdump.py ===
from ZODB.FileStorage import FileIterator
from ZODB.TimeStamp import TimeStamp
from ZODB.utils import U64
from ZODB.tests.StorageTestBase import zodb_unpickle

from cPickle import Unpickler
from cStringIO import StringIO
import md5
import types

def get_pickle_metadata(data):
    # ZODB's data records contain two pickles.  The first is the class
    # of the object, the second is the object.
    if data.startswith('(c'):
        # Don't actually unpickle a class, because it will attempt to
        # load the class.  Just break open the pickle and get the
        # module and class from it.
        modname, classname, rest = data.split('\n', 2)
        modname = modname[2:]
        return modname, classname
    f = StringIO(data)
    u = Unpickler(f)
    try:
        class_info = u.load()
    except Exception, err:
        print "Error", err
        return '', ''
    if isinstance(class_info, types.TupleType):
        if isinstance(class_info[0], types.TupleType):
            modname, classname = class_info[0]
        else:
            modname, classname = class_info
    else:
        # XXX not sure what to do here
        modname = repr(class_info)
        classname = ''
    return modname, classname

def fsdump(path, file=None, with_offset=1):
    i = 0
    for trans in FileIterator(path):
        if with_offset:
            print >> file, "Trans #%05d tid=%016x time=%s offset=%d" % \
                  (i, U64(trans.tid), str(TimeStamp(trans.tid)), trans._pos)
        else:
            print >> file, "Trans #%05d tid=%016x time=%s" % \
                  (i, U64(trans.tid), str(TimeStamp(trans.tid)))
        print >> file, "\tstatus=%s user=%s description=%s" % \
              (`trans.status`, trans.user, trans.description)
        j = 0
        for rec in trans:
            modname, classname = get_pickle_metadata(rec.data)
            dig = md5.new(rec.data).hexdigest()
            fullclass = "%s.%s" % (modname, classname)
            # special case for testing purposes
            if fullclass == "ZODB.tests.MinPO.MinPO":
                obj = zodb_unpickle(rec.data)
                fullclass = "%s %s" % (fullclass, obj.value)
            if rec.version:
                version = "version=%s " % rec.version
            else:
                version = ''
            print >> file, "  data #%05d oid=%016x %sclass=%s" % \
                  (j, U64(rec.oid), version, fullclass)
            j += 1
        print >> file
        i += 1
            


=== StandaloneZODB/ZODB/TimeStamp.c 1.10 => 1.10.18.1 ===
 
   TimeStamp_parts(self);
-  l=sprintf(buf, "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%f",
+  l=sprintf(buf, "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%09.6f",
 	    TimeStamp_y, TimeStamp_m, TimeStamp_d, 
 	    TimeStamp_mi/60, TimeStamp_mi%60, TimeStamp_sec(self));