Commit 5c4db60a authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 3d3017c5
// Copyright (C) 2016-2017 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// This program is free software: you can Use, Study, Modify and Redistribute
// it under the terms of the GNU General Public License version 3, or (at your
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
package zodb
// serialization compatibility with ZODB/py
import (
"bytes"
"fmt"
pickle "github.com/kisielk/og-rek"
)
// PyData represent data stored into ZODB by Python applications.
//
// The format is based on python pickles. Basically every sirialized object has
// two parts: class description and object state. See
//
// https://github.com/zopefoundation/ZODB/blob/a89485c1/src/ZODB/serialize.py
//
// for format description.
type PyData []byte
// ClassString returns fully-qualified python class name used for object type
// The format is "module.class"
// If pickle decoding fails "?.?" is returned.
// TODO tests
func (d PyData) ClassString() string {
// see ObjectReader.getClassName & get_pickle_metadata in zodb/py
p := pickle.NewDecoder(bytes.NewReader([]byte(d)))
xklass, err := p.Decode()
if err != nil {
return "?.?"
}
if t, ok := xklass.(pickle.Tuple); ok {
if len(t) != 2 { // (klass, args)
return "?.?"
}
xklass = t[0]
if t, ok := xklass.(pickle.Tuple); ok {
// py: "old style reference"
if len(t) != 2 {
return "?.?" // (modname, classname)
}
return fmt.Sprintf("%s.%s", t...)
}
}
if klass, ok := xklass.(pickle.Class); ok {
return klass.Module + "." + klass.Name
}
return "?.?"
}
......@@ -28,6 +28,7 @@ import (
"log"
"os"
"lab.nexedi.com/kirr/neo/go/zodb"
"lab.nexedi.com/kirr/neo/go/zodb/storage/fs1"
"lab.nexedi.com/kirr/go123/xbytes"
......@@ -183,9 +184,7 @@ func (d *DumperFsDump) DumpTxn(buf *xfmt.Buffer, it *fs1.Iter) error {
if data == nil {
buf .S(" class=undo or abort of object creation")
} else {
//modname, classname = zodb.GetPickleMetadata(...) // XXX
//fullclass = "%s.%s" % (modname, classname)
fullclass := "AAA.BBB" // FIXME stub
fullclass := zodb.PyData(data).ClassString()
buf .S(" size=") .D64(dh.DataLen)
buf .S(" class=") .S(fullclass)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment