Commit 80559a94 authored by Jérome Perrin's avatar Jérome Perrin Committed by Kirill Smelkov

zodbdump: support --pretty option with a format to show pickles disassembly

Showing pickle disassembly can sometimes be useful to analyse details of
the pickle content. We realized that in some data structures used in
ERP5 the same string was saved multiple times in the same pickle and by
using the exact same string (ie. for which `s1 is s2` is True), the
pickle will have the string only once and pickles are a bit smaller. For
more reference, the context was
nexedi/erp5!1560 (comment 154825)

This introduces a new --pretty option that we will be able to extend
later with more output formats.
Co-authored-by: Kirill Smelkov's avatarKirill Smelkov <kirr@nexedi.com>
Reviewed-on: nexedi/zodbtools!22
parent aa7e1966
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2017-2020 Nexedi SA and Contributors. # Copyright (C) 2017-2022 Nexedi SA and Contributors.
# Kirill Smelkov <kirr@nexedi.com> # Kirill Smelkov <kirr@nexedi.com>
# Jérome Perrin <jerome@nexedi.com> # Jérome Perrin <jerome@nexedi.com>
# #
...@@ -31,19 +31,20 @@ from io import BytesIO ...@@ -31,19 +31,20 @@ from io import BytesIO
from os.path import dirname from os.path import dirname
from zodbtools.test.testutil import zext_supported from zodbtools.test.testutil import zext_supported
from pytest import raises, xfail from pytest import mark, raises, xfail
# verify zodbdump output against golden # verify zodbdump output against golden
def test_zodbdump(zext): @mark.parametrize('pretty', ('raw', 'zpickledis'))
def test_zodbdump(zext, pretty):
tdir = dirname(__file__) tdir = dirname(__file__)
zkind = '_!zext' if zext.disabled else '' zkind = '_!zext' if zext.disabled else ''
stor = FileStorage('%s/testdata/1%s.fs' % (tdir, zkind), read_only=True) stor = FileStorage('%s/testdata/1%s.fs' % (tdir, zkind), read_only=True)
with open('%s/testdata/1%s.zdump.ok' % (tdir, zkind), 'rb') as f: with open('%s/testdata/1%s.zdump.%s.ok' % (tdir, zkind, pretty), 'rb') as f:
dumpok = f.read() dumpok = f.read()
out = BytesIO() out = BytesIO()
zodbdump(stor, None, None, out=out) zodbdump(stor, None, None, pretty=pretty, out=out)
assert out.getvalue() == dumpok assert out.getvalue() == dumpok
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2021 Nexedi SA and Contributors. # Copyright (C) 2021-2022 Nexedi SA and Contributors.
# Kirill Smelkov <kirr@nexedi.com> # Kirill Smelkov <kirr@nexedi.com>
# #
# This program is free software: you can Use, Study, Modify and Redistribute # This program is free software: you can Use, Study, Modify and Redistribute
...@@ -40,7 +40,7 @@ def test_zodbrestore(zext): ...@@ -40,7 +40,7 @@ def test_zodbrestore(zext):
tdata = dirname(__file__) + "/testdata" tdata = dirname(__file__) + "/testdata"
@func @func
def _(): def _():
zdump = open("%s/1%s.zdump.ok" % (tdata, zkind), 'rb') zdump = open("%s/1%s.zdump.raw.ok" % (tdata, zkind), 'rb')
defer(zdump.close) defer(zdump.close)
stor = storageFromURL('%s/2.fs' % tmpd) stor = storageFromURL('%s/2.fs' % tmpd)
......
txn 0285cbac258bf266 " "
user ""
description "initial database creation"
extension ""
obj 0000000000000000 61 sha1:664e6de0f153d8eaeda638d616a320c6e3c5feb1
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: s SETITEM
60: . STOP
highest protocol among opcodes = 2
txn 0285cbac3d0369e6 " "
user "user0.0"
description "step 0.0"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieS'
17: U SHORT_BINSTRING 'RF9IE'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (f)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000000 98 sha1:eba252d1984f975ecb636bc1b3a89c953dd20527
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: U SHORT_BINSTRING 'f'
62: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
72: q BINPUT 5
74: c GLOBAL '__main__ Object'
91: q BINPUT 6
93: \x86 TUPLE2
94: Q BINPERSID
95: s SETITEM
96: s SETITEM
97: . STOP
highest protocol among opcodes = 2
obj 0000000000000001 33 sha1:1e4a07534b581b8c84c6d887042b3a3469bd4a5c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f0.0'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac41b4e833 " "
user "user0.1"
description "step 0.1"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieM'
17: U SHORT_BINSTRING 'LWIAR'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (d)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000000 118 sha1:1690c43fd17c00da24ce037dd0ff935a27a764bc
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'd'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'f'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: u SETITEMS (MARK at 59)
116: s SETITEM
117: . STOP
highest protocol among opcodes = 2
obj 0000000000000002 33 sha1:5aa1e99b47fb9f190222f35d8c297ad1602028be
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd0.1'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac46666680 " "
user "user0.2"
description "step 0.2"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-generator'
19: q BINPUT 2
21: U SHORT_BINSTRING 'zodb/py2 (g)'
35: U SHORT_BINSTRING 'x-cookieW'
46: U SHORT_BINSTRING 'ZTWBQ'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000000 137 sha1:f4d83e65109e15c94dc889132b2052b1d20020de
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'd'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'g'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'f'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: u SETITEMS (MARK at 59)
135: s SETITEM
136: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 33 sha1:e1d41cf78ad2cc8f78c0b689fb6969fb6e63629b
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.2'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac4b17e4cc " "
user "user0.3"
description "step 0.3"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieH'
17: U SHORT_BINSTRING '3FLWY'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (d)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000002 33 sha1:197dbea033be32447c915075e46065eb38322499
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd0.3'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac4fc96319 " "
user "user0.4"
description "step 0.4"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieT'
17: U SHORT_BINSTRING 'SJ0PE'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (b)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000000 156 sha1:99ee7f2016d878efeea2b85c52a96efdd818609d
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'b'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'd'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'g'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'f'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: u SETITEMS (MARK at 59)
154: s SETITEM
155: . STOP
highest protocol among opcodes = 2
obj 0000000000000004 33 sha1:b43766925d709c95d71e523cac76b914c59a81ff
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b0.4'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac547ae166 " "
user "user0.5"
description "step 0.5"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie6'
17: U SHORT_BINSTRING 'HV8BV'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000000 175 sha1:e91a78ae65df78376be0cccccc46cd507c0883ba
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'a'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'b'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'd'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'g'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'f'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: u SETITEMS (MARK at 59)
173: s SETITEM
174: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 33 sha1:942565d4293c16a7244816620f36dc7de29613ea
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a0.5'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac592c5fb3 " "
user "user0.6"
description "step 0.6"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieI'
17: U SHORT_BINSTRING 'YSG2B'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (b)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000004 33 sha1:6bc59a113b81cb4a61a66035a981b366c2ab42f2
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b0.6'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac5dddde00 " "
user "user0.7"
description "step 0.7"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieY'
17: U SHORT_BINSTRING 'JPJTJ'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 33 sha1:c32b9a2d79a1557e57ed757889d22e4f5cc29e56
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a0.7'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac628f5c4c " "
user "user0.8"
description "step 0.8"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie6'
17: U SHORT_BINSTRING 'GLDKA'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (e)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000000 194 sha1:8bcaf05126609647586f4299684e34f011f3fe3a
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'a'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'b'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'e'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x06'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'd'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'g'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: U SHORT_BINSTRING 'f'
175: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
185: q BINPUT 11
187: h BINGET 6
189: \x86 TUPLE2
190: Q BINPERSID
191: u SETITEMS (MARK at 59)
192: s SETITEM
193: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 33 sha1:260a873b0e1157c3818eac9016e10ee41f0c1a4c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e0.8'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac6740da99 " "
user "user0.9"
description "step 0.9"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieX'
17: U SHORT_BINSTRING 'NH3RV'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (e)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 33 sha1:18afafa1c0c3856880ca5e6ab31c267bc43f4a2b
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e0.9'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac6bf258e6 " "
user "user0.10"
description "step 0.10"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieT'
17: U SHORT_BINSTRING 'XJEP9'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 34 sha1:4b61abd85c8cd0ca40f4b8c0c847877aac67631e
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.10'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac70a3d733 " "
user "user0.11"
description "step 0.11"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieZ'
17: U SHORT_BINSTRING 'LYKGN'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 34 sha1:484358413b2746e8a05b1e3173051abedd28e1fa
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.11'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac75555580 " "
user "user0.12"
description "step 0.12"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie8'
17: U SHORT_BINSTRING '2MHMU'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (f)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000001 34 sha1:9fae782fe3e33273b520c954925704856ca90dc6
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f0.12'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac7a06d3cc " "
user "user0.13"
description "step 0.13"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie5'
17: U SHORT_BINSTRING '7SBT3'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 34 sha1:704bb7a3e67bdfb32c917020f5209548f96a7870
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a0.13'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac7eb85219 " "
user "user0.14"
description "step 0.14"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieM'
17: U SHORT_BINSTRING 'KWJO0'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 34 sha1:625f66b63030f06ad8e30120b0c06f9089dc8c90
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a0.14'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac8369d066 " "
user "user0.15"
description "step 0.15"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieY'
17: U SHORT_BINSTRING 'EDZ10'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (e)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 34 sha1:5dbf26359289e5a25f9755f832ea91cc8ee76686
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e0.15'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac881b4eb3 " "
user "user0.16"
description "step 0.16"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie3'
17: U SHORT_BINSTRING '7SX0F'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 34 sha1:c34ea64c3df775a27ab7170654d374048192b902
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a0.16'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac8ccccd00 " "
user "user0.17"
description "step 0.17"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie3'
17: U SHORT_BINSTRING 'NC6I1'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (b)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000004 34 sha1:44ffb011e56b252786aaee1f4b88e45a85692623
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b0.17'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac917e4b4c " "
user "user0.18"
description "step 0.18"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-generator'
19: q BINPUT 2
21: U SHORT_BINSTRING 'zodb/py2 (b)'
35: U SHORT_BINSTRING 'x-cookieO'
46: U SHORT_BINSTRING 'CQUX6'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000004 34 sha1:551bc2fad39058879f4ba00a9c53d0d63b127bb1
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b0.18'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac962fc999 " "
user "user0.19"
description "step 0.19"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieF'
17: U SHORT_BINSTRING 'OUC9L'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 34 sha1:9e0a8797eb8f60498563703b1961126fba35be9b
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a0.19'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac9ae147e6 " "
user "user0.20"
description "step 0.20"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieU'
17: U SHORT_BINSTRING 'EKIBC'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (d)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000002 34 sha1:78796607e962019948a250672cea785496a029a7
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd0.20'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac9f92c633 " "
user "user0.21"
description "step 0.21"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie8'
17: U SHORT_BINSTRING '0QC1A'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (d)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000002 34 sha1:009174c1f01142f24495fa13738749ff528fd82c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd0.21'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbaca4444480 " "
user "user0.22"
description "step 0.22"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieP'
17: U SHORT_BINSTRING 'ACYMM'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (c)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000000 213 sha1:6e78a156b0e865cf06da28d637cc3dceba9050d7
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'a'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'c'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x07'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'b'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'e'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x06'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'd'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: U SHORT_BINSTRING 'g'
175: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
185: q BINPUT 11
187: h BINGET 6
189: \x86 TUPLE2
190: Q BINPERSID
191: U SHORT_BINSTRING 'f'
194: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
204: q BINPUT 12
206: h BINGET 6
208: \x86 TUPLE2
209: Q BINPERSID
210: u SETITEMS (MARK at 59)
211: s SETITEM
212: . STOP
highest protocol among opcodes = 2
obj 0000000000000007 34 sha1:688eb65eab5e4c5ee5242b027bb9bfa5e1087598
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c0.22'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbaca8f5c2cc " "
user "user0.23"
description "step 0.23"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieM'
17: U SHORT_BINSTRING 'N06C8'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (c)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000007 34 sha1:623487f55ca5c3970001f4db9b1c6ac5b53c9fce
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c0.23'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbacada74119 " "
user "user0.24"
description "step 0.24"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieN'
17: U SHORT_BINSTRING 'KEEPF'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 34 sha1:e86e4ecd14ec50ec9333a349a99480e38185b21f
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.24'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbacb258bf66 " "
user "root0.0\nYour\nMagesty "
description "undo 0.0\nmore detailed description\n\nzzz ..."
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieK'
17: U SHORT_BINSTRING 'G95IH'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (undo AoXLrKj1wsw=)'
69: u SETITEMS (MARK at 5)
70: . STOP
highest protocol among opcodes = 2
obj 0000000000000007 from 0285cbaca4444480
txn 0285cbacb70a3db3 " "
user "root0.1\nYour\nMagesty "
description "undo 0.1\nmore detailed description\n\nzzz ...\t"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieV'
17: U SHORT_BINSTRING 'VHBGT'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (undo AoXLrK2nQRk=)'
69: u SETITEMS (MARK at 5)
70: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 from 0285cbac70a3d733
txn 0285cbacbbbbbc00 " "
user ""
description "predelete 7"
extension ""
obj 0000000000000000 213 sha1:9eba67326a7fd2393c39966bfc7d7be2a8035dfa
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'a'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'c'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x08'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'b'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'e'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x06'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'd'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: U SHORT_BINSTRING 'g'
175: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
185: q BINPUT 11
187: h BINGET 6
189: \x86 TUPLE2
190: Q BINPERSID
191: U SHORT_BINSTRING 'f'
194: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
204: q BINPUT 12
206: h BINGET 6
208: \x86 TUPLE2
209: Q BINPERSID
210: u SETITEMS (MARK at 59)
211: s SETITEM
212: . STOP
highest protocol among opcodes = 2
obj 0000000000000008 32 sha1:c0517df3bfc49dcda73c2797fb957c92bc651888
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c0*'
29: q BINPUT 2
31: . STOP
highest protocol among opcodes = 2
txn 0285cbacc06d3a4c " "
user "root0\nYour\nRoyal\nMagesty' \x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
description "delete 0\nalpha beta gamma'delta\"lambda\n\nqqq ..."
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieE'
17: U SHORT_BINSTRING 'ZM3QZ'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (delete 7)'
60: u SETITEMS (MARK at 5)
61: . STOP
highest protocol among opcodes = 2
obj 0000000000000007 delete
txn 0285cbacfd70a433 " "
user "user1.0"
description "step 1.0"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie3'
17: U SHORT_BINSTRING '7P0TJ'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (c)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000008 33 sha1:064279cb7fe24286e7ec0c47704a75eedc5dfc85
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c1.0'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad02222280 " "
user "user1.1"
description "step 1.1"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieE'
17: U SHORT_BINSTRING 'VAZ3U'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (e)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 33 sha1:3362a180bda38de9551456e11aba3a50b3ee4063
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e1.1'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad06d3a0cc " "
user "user1.2"
description "step 1.2"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieN'
17: U SHORT_BINSTRING 'GSV4I'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (b)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000004 33 sha1:78395e22e884588e5c8037d6d90a697105722708
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b1.2'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad0b851f19 " "
user "user1.3"
description "step 1.3"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieY'
17: U SHORT_BINSTRING 'A01OK'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 33 sha1:5fb466e36ea6f847b73ad7976def8ad60e00e766
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.3'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad10369d66 " "
user "user1.4"
description "step 1.4"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-generator'
19: q BINPUT 2
21: U SHORT_BINSTRING 'zodb/py2 (g)'
35: U SHORT_BINSTRING 'x-cookieW'
46: U SHORT_BINSTRING '1QPNP'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 33 sha1:15a38343610d25057cd88521669671350eb0c0a8
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.4'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad14e81bb3 " "
user "user1.5"
description "step 1.5"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieC'
17: U SHORT_BINSTRING 'J7L05'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (c)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000008 33 sha1:fd3a56403fb6da1f975676b50d745284f187029d
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c1.5'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad19999a00 " "
user "user1.6"
description "step 1.6"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieA'
17: U SHORT_BINSTRING 'CM15Z'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (f)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000001 33 sha1:4d811fcaaa707127f5f6f49dc368ffd2ebae1018
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f1.6'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad1e4b184c " "
user "user1.7"
description "step 1.7"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieI'
17: U SHORT_BINSTRING 'AH816'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (d)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000002 33 sha1:4c3e1f41eebd1f56c0fef1f609d64e061a137f5a
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd1.7'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad22fc9699 " "
user "user1.8"
description "step 1.8"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieU'
17: U SHORT_BINSTRING 'BE3WH'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (c)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000008 33 sha1:13e366fb1d15d36a62099e6b835638407718229f
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c1.8'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad27ae14e6 " "
user "user1.9"
description "step 1.9"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-generator'
19: q BINPUT 2
21: U SHORT_BINSTRING 'zodb/py2 (c)'
35: U SHORT_BINSTRING 'x-cookieW'
46: U SHORT_BINSTRING 'HPFAQ'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000008 33 sha1:beb7a6ebd477848306328f613a6bc214144ba14a
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c1.9'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad2c5f9333 " "
user "user1.10"
description "step 1.10"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieQ'
17: U SHORT_BINSTRING 'DZM23'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (e)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 34 sha1:3d8eb2e84c17af9e6ffe4c2dab6a8d4180b3717c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e1.10'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad31111180 " "
user "user1.11"
description "step 1.11"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieO'
17: U SHORT_BINSTRING 'EIGHL'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 34 sha1:3e2ce7b87adc999c578dec26c3d9a7148b169d50
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a1.11'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad35c28fcc " "
user "user1.12"
description "step 1.12"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie2'
17: U SHORT_BINSTRING 'Z9RFC'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (c)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000008 34 sha1:d7a594303b8f49334430312211b65f06586d4e72
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c1.12'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad3a740e19 " "
user "user1.13"
description "step 1.13"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie7'
17: U SHORT_BINSTRING 'WGO4E'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (e)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 34 sha1:1b5a346d8929e52eb078f442c300d26e125e4200
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e1.13'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad3f258c66 " "
user "user1.14"
description "step 1.14"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie5'
17: U SHORT_BINSTRING '757DJ'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 34 sha1:e5b3820378e102a61be2b5998ded3182c106c7db
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.14'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad43d70ab3 " "
user "user1.15"
description "step 1.15"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieX'
17: U SHORT_BINSTRING '5EOVH'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 34 sha1:2e9ebc331bf53c095e9573de64a9b31f2b340b2f
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.15'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad48888900 " "
user "user1.16"
description "step 1.16"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieC'
17: U SHORT_BINSTRING 'HO7L7'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (d)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000002 34 sha1:3faf2b3ec22270e84cebb4d3b892e77b02d2ac10
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd1.16'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad4d3a074c " "
user "user1.17"
description "step 1.17"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieU'
17: U SHORT_BINSTRING 'T159S'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 34 sha1:732fac4aa308c29fba8b0da4d0502b6d35e211f4
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.17'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad51eb8599 " "
user "user1.18"
description "step 1.18"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie8'
17: U SHORT_BINSTRING 'T23V1'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (f)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000001 34 sha1:14b40a66bb827f09c17d8a64985788a781886828
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f1.18'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad569d03e6 " "
user "user1.19"
description "step 1.19"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieY'
17: U SHORT_BINSTRING 'UB55N'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 34 sha1:4f226e961b5c4f301a491442b1c820ac7dc3ce1d
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a1.19'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad5b4e8233 " "
user "user1.20"
description "step 1.20"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieZ'
17: U SHORT_BINSTRING 'IKOSR'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 34 sha1:6bfd3298d0bea74cfa3d1f01bb722e958e3f1520
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.20'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad60000080 " "
user "user1.21"
description "step 1.21"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieS'
17: U SHORT_BINSTRING '7JLTH'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (g)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 34 sha1:443fc48b546d0c85d01a485607253180c5624bdf
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.21'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad64b17ecc " "
user "user1.22"
description "step 1.22"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieI'
17: U SHORT_BINSTRING 'USN06'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (e)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 34 sha1:5d3efa2ca7bdf3c57b08ebb4c70344f53d93a0a1
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e1.22'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad6962fd19 " "
user "user1.23"
description "step 1.23"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookie2'
17: U SHORT_BINSTRING 'UXAET'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 34 sha1:1b443228d5a434ddd9616ecb5aa90672c0ce9ba2
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a1.23'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad6e147b66 " "
user "user1.24"
description "step 1.24"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieH'
17: U SHORT_BINSTRING 'AT11F'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (a)'
53: u SETITEMS (MARK at 5)
54: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 34 sha1:ad7f258dfad403eb22ab3a7f28e12ed153c45486
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a1.24'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad77777800 " "
user "root1.0\nYour\nMagesty "
description "undo 1.0\nmore detailed description\n\nzzz ...\t"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieM'
17: U SHORT_BINSTRING '1G51M'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (undo AoXLrWSxfsw=)'
69: u SETITEMS (MARK at 5)
70: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 from 0285cbad3a740e19
txn 0285cbad7c28f64c " "
user "root1.1\nYour\nMagesty "
description "undo 1.1\nmore detailed description\n\nzzz ...\t\t"
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieV'
17: U SHORT_BINSTRING 'JCDRH'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (undo AoXLrW4Ue2Y=)'
69: u SETITEMS (MARK at 5)
70: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 from 0285cbad6962fd19
txn 0285cbad80da7499 " "
user ""
description "predelete 6"
extension ""
obj 0000000000000000 213 sha1:e4b5a7c8f5537b25f27e5b9c4f6eaf6da17fc0a1
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'a'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'c'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x08'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'b'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'e'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\t'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'd'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: U SHORT_BINSTRING 'g'
175: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
185: q BINPUT 11
187: h BINGET 6
189: \x86 TUPLE2
190: Q BINPERSID
191: U SHORT_BINSTRING 'f'
194: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
204: q BINPUT 12
206: h BINGET 6
208: \x86 TUPLE2
209: Q BINPERSID
210: u SETITEMS (MARK at 59)
211: s SETITEM
212: . STOP
highest protocol among opcodes = 2
obj 0000000000000009 32 sha1:1a43b55bc4a19245cce9eb5aa5ad411006f06afe
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e1*'
29: q BINPUT 2
31: . STOP
highest protocol among opcodes = 2
txn 0285cbad858bf2e6 " "
user "root1\nYour\nRoyal\nMagesty' \x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
description "delete 1\nalpha beta gamma'delta\"lambda\n\nqqq ..."
extension
0: \x80 PROTO 2
2: } EMPTY_DICT
3: q BINPUT 1
5: ( MARK
6: U SHORT_BINSTRING 'x-cookieS'
17: U SHORT_BINSTRING 'MC4OM'
24: U SHORT_BINSTRING 'x-generator'
37: q BINPUT 2
39: U SHORT_BINSTRING 'zodb/py2 (delete 6)'
60: u SETITEMS (MARK at 5)
61: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 delete
txn 0285cbac258bf266 " "
user ""
description "initial database creation"
extension ""
obj 0000000000000000 61 sha1:664e6de0f153d8eaeda638d616a320c6e3c5feb1
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: s SETITEM
60: . STOP
highest protocol among opcodes = 2
txn 0285cbac3d0369e6 " "
user "user0.0"
description "step 0.0"
extension ""
obj 0000000000000000 98 sha1:eba252d1984f975ecb636bc1b3a89c953dd20527
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: U SHORT_BINSTRING 'f'
62: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
72: q BINPUT 5
74: c GLOBAL '__main__ Object'
91: q BINPUT 6
93: \x86 TUPLE2
94: Q BINPERSID
95: s SETITEM
96: s SETITEM
97: . STOP
highest protocol among opcodes = 2
obj 0000000000000001 33 sha1:1e4a07534b581b8c84c6d887042b3a3469bd4a5c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f0.0'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac41b4e833 " "
user "user0.1"
description "step 0.1"
extension ""
obj 0000000000000001 33 sha1:a98cfba1b3c03d39864ffe9d4727a07d6438849d
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f0.1'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac46666680 " "
user "user0.2"
description "step 0.2"
extension ""
obj 0000000000000000 118 sha1:7d46a1e5567afaede4e9392309421b6407a20d87
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'c'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'f'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: u SETITEMS (MARK at 59)
116: s SETITEM
117: . STOP
highest protocol among opcodes = 2
obj 0000000000000002 33 sha1:0304fd1cba1ffbfb9cbe86dd1999b8e43973ea82
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c0.2'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac4b17e4cc " "
user "user0.3"
description "step 0.3"
extension ""
obj 0000000000000000 137 sha1:84faa5da0603b10bd948fc0a1704779178d352fb
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'c'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'b'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'f'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: u SETITEMS (MARK at 59)
135: s SETITEM
136: . STOP
highest protocol among opcodes = 2
obj 0000000000000003 33 sha1:b67e803788cfb17f39c88b438500ca10fe958ef5
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b0.3'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac4fc96319 " "
user "user0.4"
description "step 0.4"
extension ""
obj 0000000000000000 156 sha1:25aa06cf55255497df05af639b8a559d224e4a92
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'c'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'b'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'd'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'f'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: u SETITEMS (MARK at 59)
154: s SETITEM
155: . STOP
highest protocol among opcodes = 2
obj 0000000000000004 33 sha1:9bcee0a8fb3d5b216064b707ec1083dfdeda7f75
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd0.4'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac547ae166 " "
user "user0.5"
description "step 0.5"
extension ""
obj 0000000000000002 33 sha1:76391ca5fc2a9bcdafa276d16c6a7b0a2a3c8375
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c0.5'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac592c5fb3 " "
user "user0.6"
description "step 0.6"
extension ""
obj 0000000000000001 33 sha1:fb23da33c75a91be19235ce2c4e9e204a8b26284
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f0.6'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac5dddde00 " "
user "user0.7"
description "step 0.7"
extension ""
obj 0000000000000002 33 sha1:ef901f794a3de022b9eeac216a294c8bbe87340b
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c0.7'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac628f5c4c " "
user "user0.8"
description "step 0.8"
extension ""
obj 0000000000000004 33 sha1:dca08ce1ce3ab22cd6c50d0a9af339f148d37570
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd0.8'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac6740da99 " "
user "user0.9"
description "step 0.9"
extension ""
obj 0000000000000000 175 sha1:2b287f578d0147b0df141756b3db0e60408c0db2
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'c'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'b'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'e'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'd'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'f'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: u SETITEMS (MARK at 59)
173: s SETITEM
174: . STOP
highest protocol among opcodes = 2
obj 0000000000000005 33 sha1:18afafa1c0c3856880ca5e6ab31c267bc43f4a2b
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e0.9'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbac6bf258e6 " "
user "user0.10"
description "step 0.10"
extension ""
obj 0000000000000000 194 sha1:871a66641f3bd2527b3b8cf6f85c9a6790dad365
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'c'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x02'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'b'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'e'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'd'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'g'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x06'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: U SHORT_BINSTRING 'f'
175: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
185: q BINPUT 11
187: h BINGET 6
189: \x86 TUPLE2
190: Q BINPERSID
191: u SETITEMS (MARK at 59)
192: s SETITEM
193: . STOP
highest protocol among opcodes = 2
obj 0000000000000006 34 sha1:4b61abd85c8cd0ca40f4b8c0c847877aac67631e
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.10'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac70a3d733 " "
user "user0.11"
description "step 0.11"
extension ""
obj 0000000000000004 34 sha1:fe21381adc01e51965c3278c6debf52ebd63068c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd0.11'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac75555580 " "
user "user0.12"
description "step 0.12"
extension ""
obj 0000000000000003 34 sha1:14852d1b6a461c0ffa3e28d56ea2e0054e2e2136
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b0.12'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac7a06d3cc " "
user "user0.13"
description "step 0.13"
extension ""
obj 0000000000000001 34 sha1:a88ef0315fc53ae3ca0744dfca450ccf5ebfebd5
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f0.13'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac7eb85219 " "
user "user0.14"
description "step 0.14"
extension ""
obj 0000000000000005 34 sha1:820cfeef1fc1fc1bda646401c5603fad36c7011e
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e0.14'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac8369d066 " "
user "user0.15"
description "step 0.15"
extension ""
obj 0000000000000003 34 sha1:e616d80f35ea7aaaecdbc65e1e5838c25f4bf07a
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b0.15'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac881b4eb3 " "
user "user0.16"
description "step 0.16"
extension ""
obj 0000000000000006 34 sha1:1770bca026b728d1a12463485ce540217699c0ac
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.16'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac8ccccd00 " "
user "user0.17"
description "step 0.17"
extension ""
obj 0000000000000006 34 sha1:ab0202b8ddf852d5f82ff838f22d5523a2bfe1df
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.17'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac917e4b4c " "
user "user0.18"
description "step 0.18"
extension ""
obj 0000000000000001 34 sha1:de0fc946474efcc8f3432eb258687792711955b8
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f0.18'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac962fc999 " "
user "user0.19"
description "step 0.19"
extension ""
obj 0000000000000006 34 sha1:321ac3730fac902210d2ee5dcd1c3db828beb304
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.19'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac9ae147e6 " "
user "user0.20"
description "step 0.20"
extension ""
obj 0000000000000002 34 sha1:2f08db22de5b34eec4b743c0dc97df050593790c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c0.20'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbac9f92c633 " "
user "user0.21"
description "step 0.21"
extension ""
obj 0000000000000001 34 sha1:025d34759b434419251b5a429f3ad78ce3c2fd98
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f0.21'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbaca4444480 " "
user "user0.22"
description "step 0.22"
extension ""
obj 0000000000000006 34 sha1:0734767857e69ab8bfd0007d4ca3f1a7fd69b677
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g0.22'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbaca8f5c2cc " "
user "user0.23"
description "step 0.23"
extension ""
obj 0000000000000005 34 sha1:21107cdc93f7bbadf5f7ac094d511241dc8de69f
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e0.23'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbacada74119 " "
user "user0.24"
description "step 0.24"
extension ""
obj 0000000000000004 34 sha1:a0a87d268da9c8d6e538163ee4db167d1ddc59c2
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd0.24'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbacb258bf66 " "
user "root0.0\nYour\nMagesty "
description "undo 0.0\nmore detailed description\n\nzzz ..."
extension ""
obj 0000000000000005 from 0285cbac7eb85219
txn 0285cbacb70a3db3 " "
user "root0.1\nYour\nMagesty "
description "undo 0.1\nmore detailed description\n\nzzz ...\t"
extension ""
obj 0000000000000004 from 0285cbac70a3d733
txn 0285cbacbbbbbc00 " "
user ""
description "predelete 2"
extension ""
obj 0000000000000000 194 sha1:5456a4d7bbe20eb26beb84eae76762cd9f4f8c8a
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'c'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x07'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'b'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'e'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'd'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'g'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x06'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: U SHORT_BINSTRING 'f'
175: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
185: q BINPUT 11
187: h BINGET 6
189: \x86 TUPLE2
190: Q BINPERSID
191: u SETITEMS (MARK at 59)
192: s SETITEM
193: . STOP
highest protocol among opcodes = 2
obj 0000000000000007 32 sha1:c0517df3bfc49dcda73c2797fb957c92bc651888
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c0*'
29: q BINPUT 2
31: . STOP
highest protocol among opcodes = 2
txn 0285cbacc06d3a4c " "
user "root0\nYour\nRoyal\nMagesty' \x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
description "delete 0\nalpha beta gamma'delta\"lambda\n\nqqq ..."
extension ""
obj 0000000000000002 delete
txn 0285cbacfd70a433 " "
user "user1.0"
description "step 1.0"
extension ""
obj 0000000000000004 33 sha1:cb655aa6a738a9855dffeb7584da2df381ab89d6
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd1.0'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad02222280 " "
user "user1.1"
description "step 1.1"
extension ""
obj 0000000000000005 33 sha1:3362a180bda38de9551456e11aba3a50b3ee4063
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e1.1'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad06d3a0cc " "
user "user1.2"
description "step 1.2"
extension ""
obj 0000000000000006 33 sha1:28e9880fc0f50a9fea5c4a9e861adc1fe44c9f5c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.2'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad0b851f19 " "
user "user1.3"
description "step 1.3"
extension ""
obj 0000000000000006 33 sha1:5fb466e36ea6f847b73ad7976def8ad60e00e766
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.3'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad10369d66 " "
user "user1.4"
description "step 1.4"
extension ""
obj 0000000000000004 33 sha1:31a9f07c87da619daa5212fd3c1af57419d07fc3
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd1.4'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad14e81bb3 " "
user "user1.5"
description "step 1.5"
extension ""
obj 0000000000000006 33 sha1:ad1fa70347e93f4e7987bb4702494619db32cb73
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.5'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad19999a00 " "
user "user1.6"
description "step 1.6"
extension ""
obj 0000000000000003 33 sha1:f0d30533c8b386ed571c400c0a37aec4df75fe52
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b1.6'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad1e4b184c " "
user "user1.7"
description "step 1.7"
extension ""
obj 0000000000000001 33 sha1:fee73692c6795a6421978a1ccdca4b61468a487b
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f1.7'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad22fc9699 " "
user "user1.8"
description "step 1.8"
extension ""
obj 0000000000000004 33 sha1:e9dc07c0050bf3b9378a1f17d562b8a2423c6076
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd1.8'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad27ae14e6 " "
user "user1.9"
description "step 1.9"
extension ""
obj 0000000000000000 213 sha1:f4bcbfda350ec47458539ad8aa8566a89f278015
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'a'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x08'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'c'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x07'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'b'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'e'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x05'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'd'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: U SHORT_BINSTRING 'g'
175: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x06'
185: q BINPUT 11
187: h BINGET 6
189: \x86 TUPLE2
190: Q BINPERSID
191: U SHORT_BINSTRING 'f'
194: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
204: q BINPUT 12
206: h BINGET 6
208: \x86 TUPLE2
209: Q BINPERSID
210: u SETITEMS (MARK at 59)
211: s SETITEM
212: . STOP
highest protocol among opcodes = 2
obj 0000000000000008 33 sha1:9e7210231bc0dd64ef92361d6bc4c9a3f5670aaf
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a1.9'
30: q BINPUT 2
32: . STOP
highest protocol among opcodes = 2
txn 0285cbad2c5f9333 " "
user "user1.10"
description "step 1.10"
extension ""
obj 0000000000000001 34 sha1:32ad367b3ca4641b070902c7d3073b4fa7e22b85
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f1.10'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad31111180 " "
user "user1.11"
description "step 1.11"
extension ""
obj 0000000000000007 34 sha1:88ab1add11652101077535c03b04e83fe4ddb88b
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c1.11'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad35c28fcc " "
user "user1.12"
description "step 1.12"
extension ""
obj 0000000000000001 34 sha1:ae2ad008499e3ad36f7c7453437c10dafacc687e
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f1.12'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad3a740e19 " "
user "user1.13"
description "step 1.13"
extension ""
obj 0000000000000005 34 sha1:1b5a346d8929e52eb078f442c300d26e125e4200
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e1.13'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad3f258c66 " "
user "user1.14"
description "step 1.14"
extension ""
obj 0000000000000008 34 sha1:2e14c0bd1a82ee7d1ee18d76881221845f47627c
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'a1.14'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad43d70ab3 " "
user "user1.15"
description "step 1.15"
extension ""
obj 0000000000000004 34 sha1:f136bac1befa0fbd1ebd50218f8d9afe00b9b0a5
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd1.15'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad48888900 " "
user "user1.16"
description "step 1.16"
extension ""
obj 0000000000000006 34 sha1:778621ce5c5e97b65343b1ab0cc1a3ce5702fbc8
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.16'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad4d3a074c " "
user "user1.17"
description "step 1.17"
extension ""
obj 0000000000000003 34 sha1:647be0dedecdb5b4db6ba09d53be97e1f2c27bb2
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b1.17'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad51eb8599 " "
user "user1.18"
description "step 1.18"
extension ""
obj 0000000000000007 34 sha1:bfe7a4966f673758259d81429e6e6b3543fbdc4e
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'c1.18'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad569d03e6 " "
user "user1.19"
description "step 1.19"
extension ""
obj 0000000000000006 34 sha1:b0b31eb0b48548119153628eb3c6711d959e9f9b
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.19'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad5b4e8233 " "
user "user1.20"
description "step 1.20"
extension ""
obj 0000000000000003 34 sha1:884af302035127df026f8b5fcd29711489d8c3e9
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b1.20'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad60000080 " "
user "user1.21"
description "step 1.21"
extension ""
obj 0000000000000004 34 sha1:af06091cac7b507337c2876c28d3977b969f4b8a
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'd1.21'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad64b17ecc " "
user "user1.22"
description "step 1.22"
extension ""
obj 0000000000000003 34 sha1:ca52325c013834a4dd9fc81caca23aef75e31fc0
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'b1.22'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad6962fd19 " "
user "user1.23"
description "step 1.23"
extension ""
obj 0000000000000006 34 sha1:36b1190c8065ee5db865bf7bb11cfc1b2d1c2120
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'g1.23'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad6e147b66 " "
user "user1.24"
description "step 1.24"
extension ""
obj 0000000000000001 34 sha1:b35a1826cc6cb71b9ddff043f0e8f88b4d90281f
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'f1.24'
31: q BINPUT 2
33: . STOP
highest protocol among opcodes = 2
txn 0285cbad72c5f9b3 " "
user "root1.0\nYour\nMagesty "
description "undo 1.0\nmore detailed description\n\nzzz ...\t"
extension ""
obj 0000000000000006 from 0285cbad569d03e6
txn 0285cbad77777800 " "
user "root1.1\nYour\nMagesty "
description "undo 1.1\nmore detailed description\n\nzzz ...\t\t"
extension ""
obj 0000000000000001 from 0285cbad35c28fcc
txn 0285cbad7c28f64c " "
user ""
description "predelete 5"
extension ""
obj 0000000000000000 213 sha1:125bc13199ab5e44db744c520533ead6b0632f00
0: \x80 PROTO 2
2: c GLOBAL 'persistent.mapping PersistentMapping'
40: q BINPUT 1
42: . STOP
highest protocol among opcodes = 2
43: \x80 PROTO 2
45: } EMPTY_DICT
46: q BINPUT 2
48: U SHORT_BINSTRING 'data'
54: q BINPUT 3
56: } EMPTY_DICT
57: q BINPUT 4
59: ( MARK
60: U SHORT_BINSTRING 'a'
63: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x08'
73: q BINPUT 5
75: c GLOBAL '__main__ Object'
92: q BINPUT 6
94: \x86 TUPLE2
95: Q BINPERSID
96: U SHORT_BINSTRING 'c'
99: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x07'
109: q BINPUT 7
111: h BINGET 6
113: \x86 TUPLE2
114: Q BINPERSID
115: U SHORT_BINSTRING 'b'
118: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x03'
128: q BINPUT 8
130: h BINGET 6
132: \x86 TUPLE2
133: Q BINPERSID
134: U SHORT_BINSTRING 'e'
137: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\t'
147: q BINPUT 9
149: h BINGET 6
151: \x86 TUPLE2
152: Q BINPERSID
153: U SHORT_BINSTRING 'd'
156: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x04'
166: q BINPUT 10
168: h BINGET 6
170: \x86 TUPLE2
171: Q BINPERSID
172: U SHORT_BINSTRING 'g'
175: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x06'
185: q BINPUT 11
187: h BINGET 6
189: \x86 TUPLE2
190: Q BINPERSID
191: U SHORT_BINSTRING 'f'
194: U SHORT_BINSTRING '\x00\x00\x00\x00\x00\x00\x00\x01'
204: q BINPUT 12
206: h BINGET 6
208: \x86 TUPLE2
209: Q BINPERSID
210: u SETITEMS (MARK at 59)
211: s SETITEM
212: . STOP
highest protocol among opcodes = 2
obj 0000000000000009 32 sha1:1a43b55bc4a19245cce9eb5aa5ad411006f06afe
0: \x80 PROTO 2
2: c GLOBAL '__main__ Object'
19: q BINPUT 1
21: . STOP
highest protocol among opcodes = 2
22: \x80 PROTO 2
24: U SHORT_BINSTRING 'e1*'
29: q BINPUT 2
31: . STOP
highest protocol among opcodes = 2
txn 0285cbad80da7499 " "
user "root1\nYour\nRoyal\nMagesty' \x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
description "delete 1\nalpha beta gamma'delta\"lambda\n\nqqq ..."
extension ""
obj 0000000000000005 delete
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2016-2021 Nexedi SA and Contributors. # Copyright (C) 2016-2022 Nexedi SA and Contributors.
# Kirill Smelkov <kirr@nexedi.com> # Kirill Smelkov <kirr@nexedi.com>
# Jérome Perrin <jerome@nexedi.com> # Jérome Perrin <jerome@nexedi.com>
# #
...@@ -32,7 +32,15 @@ format where object data is output as raw binary and everything else is text. ...@@ -32,7 +32,15 @@ format where object data is output as raw binary and everything else is text.
There is also shortened mode activated via --hashonly where only hash of object There is also shortened mode activated via --hashonly where only hash of object
data is printed without content. data is printed without content.
Dump format: Alternatively, the dump can be produced in other "pretty" formats, that zodb
restore will not be able to restore, but that are more suitable for analysis.
The output format can be selected with --pretty "format" option. The following
formats are available:
raw default zodb dump format
zpickledis display the disassembled pickles, using pickletools.dis.
Raw dump format:
txn <tid> <status|quote> txn <tid> <status|quote>
user <user|quote> user <user|quote>
...@@ -59,7 +67,7 @@ from zodbtools.util import ashex, fromhex, sha1, txnobjv, parse_tidrange, TidRan ...@@ -59,7 +67,7 @@ from zodbtools.util import ashex, fromhex, sha1, txnobjv, parse_tidrange, TidRan
storageFromURL, hashRegistry, asbinstream storageFromURL, hashRegistry, asbinstream
from ZODB._compat import loads, _protocol, BytesIO from ZODB._compat import loads, _protocol, BytesIO
from zodbpickle.slowpickle import Pickler as pyPickler from zodbpickle.slowpickle import Pickler as pyPickler
#import pickletools import pickletools
from ZODB.interfaces import IStorageTransactionInformation from ZODB.interfaces import IStorageTransactionInformation
from zope.interface import implementer from zope.interface import implementer
...@@ -92,15 +100,36 @@ _already_warned_notxnraw = set() ...@@ -92,15 +100,36 @@ _already_warned_notxnraw = set()
# zodbdump dumps content of a ZODB storage to a file. # zodbdump dumps content of a ZODB storage to a file.
# please see module doc-string for dump format and details # please see module doc-string for dump format and details
def zodbdump(stor, tidmin, tidmax, hashonly=False, out=asbinstream(sys.stdout)): def zodbdump(stor, tidmin, tidmax, hashonly=False, pretty='raw', out=asbinstream(sys.stdout)):
def badpretty():
raise ValueError("invalid pretty format %s" % pretty)
for txn in stor.iterator(tidmin, tidmax): for txn in stor.iterator(tidmin, tidmax):
# XXX .status not covered by IStorageTransactionInformation # XXX .status not covered by IStorageTransactionInformation
# XXX but covered by BaseStorage.TransactionRecord # XXX but covered by BaseStorage.TransactionRecord
out.write(b"txn %s %s\nuser %s\ndescription %s\nextension %s\n" % ( out.write(b"txn %s %s\nuser %s\ndescription %s\n" % (
ashex(txn.tid), qq(txn.status), ashex(txn.tid), qq(txn.status),
qq(txn.user), qq(txn.user),
qq(txn.description), qq(txn.description) ))
qq(txn_raw_extension(stor, txn)) ))
# extension is saved by ZODB as either empty or as pickle dump of an object
rawext = txn_raw_extension(stor, txn)
if pretty == 'raw':
out.write(b"extension %s\n" % qq(rawext))
elif pretty == 'zpickledis':
if len(rawext) == 0:
out.write(b'extension ""\n')
else:
out.write(b"extension\n")
extf = BytesIO(rawext)
disf = BytesIO()
pickletools.dis(extf, disf)
out.write(indent(disf.getvalue(), " "))
extra = extf.read()
if len(extra) > 0:
out.write(b" + extra data %s\n" % qq(extra))
else:
badpretty()
objv = txnobjv(txn) objv = txnobjv(txn)
...@@ -127,7 +156,20 @@ def zodbdump(stor, tidmin, tidmax, hashonly=False, out=asbinstream(sys.stdout)): ...@@ -127,7 +156,20 @@ def zodbdump(stor, tidmin, tidmax, hashonly=False, out=asbinstream(sys.stdout)):
out.write(b" -") out.write(b" -")
else: else:
out.write(b"\n") out.write(b"\n")
if pretty == 'raw':
out.write(obj.data) out.write(obj.data)
elif pretty == 'zpickledis':
# https://github.com/zopefoundation/ZODB/blob/5.6.0-55-g1226c9d35/src/ZODB/serialize.py#L24-L29
dataf = BytesIO(obj.data)
disf = BytesIO()
pickletools.dis(dataf, disf) # class
pickletools.dis(dataf, disf) # state
out.write(indent(disf.getvalue(), " "))
extra = dataf.read()
if len(extra) > 0:
out.write(b" + extra data %s\n" % qq(extra))
else:
badpretty()
out.write(b"\n") out.write(b"\n")
...@@ -224,6 +266,14 @@ def serializeext(ext): ...@@ -224,6 +266,14 @@ def serializeext(ext):
assert loads(out) == ext assert loads(out) == ext
return out return out
# indent returns text with each line of it indented with prefix.
def indent(text, prefix): # -> text
textv = text.splitlines(True)
textv = [prefix+_ for _ in textv]
text = ''.join(textv)
return text
# ---------------------------------------- # ----------------------------------------
import sys, getopt import sys, getopt
...@@ -239,6 +289,8 @@ Dump content of a ZODB database. ...@@ -239,6 +289,8 @@ Dump content of a ZODB database.
Options: Options:
--pretty=<format> output in a given format, where <format> can be one
of raw, zpickledis
--hashonly dump only hashes of objects without content --hashonly dump only hashes of objects without content
-h --help show this help -h --help show this help
""", file=out) """, file=out)
...@@ -246,20 +298,26 @@ Options: ...@@ -246,20 +298,26 @@ Options:
@func @func
def main(argv): def main(argv):
hashonly = False hashonly = False
pretty = 'raw'; prettyok = {'raw', 'zpickledis'}
try: try:
optv, argv = getopt.getopt(argv[1:], "h", ["help", "hashonly"]) optv, argv = getopt.getopt(argv[1:], "h", ["help", "hashonly", "pretty="])
except getopt.GetoptError as e: except getopt.GetoptError as e:
print(e, file=sys.stderr) print(e, file=sys.stderr)
usage(sys.stderr) usage(sys.stderr)
sys.exit(2) sys.exit(2)
for opt, _ in optv: for opt, arg in optv:
if opt in ("-h", "--help"): if opt in ("-h", "--help"):
usage(sys.stdout) usage(sys.stdout)
sys.exit(0) sys.exit(0)
if opt in ("--hashonly"): if opt in ("--hashonly"):
hashonly = True hashonly = True
if opt in ("--pretty"):
pretty = arg
if pretty not in prettyok:
print("E: unsupported pretty format: %s" % pretty, file=sys.stderr)
sys.exit(2)
try: try:
storurl = argv[0] storurl = argv[0]
...@@ -279,7 +337,7 @@ def main(argv): ...@@ -279,7 +337,7 @@ def main(argv):
stor = storageFromURL(storurl, read_only=True) stor = storageFromURL(storurl, read_only=True)
defer(stor.close) defer(stor.close)
zodbdump(stor, tidmin, tidmax, hashonly) zodbdump(stor, tidmin, tidmax, hashonly, pretty)
# ---------------------------------------- # ----------------------------------------
......
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