Skip to content

Commit 76bc0a2

Browse files
committed
fixes
1 parent fede402 commit 76bc0a2

5 files changed

Lines changed: 82 additions & 35 deletions

File tree

cfxdb/exporter.py

Lines changed: 72 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import os
99
import uuid
10+
from typing import List
1011

1112
import cbor2
1213
import click
@@ -32,14 +33,6 @@ def __init__(self, dbpath):
3233
self._db = zlmdb.Database(dbpath=self._dbpath, maxsize=2**30, readonly=False)
3334
self._db.__enter__()
3435

35-
# cfxdb.schema.Schema
36-
# cfxdb.meta.Schema
37-
# cfxdb.globalschema.GlobalSchema
38-
# cfxdb.mrealmschema.MrealmSchema
39-
# cfxdb.xbr.Schema
40-
# cfxdb.xbrmm.Schema
41-
# cfxdb.xbrnetwork.Schema
42-
4336
self._meta = cfxdb.meta.Schema.attach(self._db)
4437
self._globalschema = cfxdb.globalschema.GlobalSchema.attach(self._db)
4538
self._mrealmschema = cfxdb.mrealmschema.MrealmSchema.attach(self._db)
@@ -48,11 +41,11 @@ def __init__(self, dbpath):
4841
self._xbrnetwork = cfxdb.xbrnetwork.Schema.attach(self._db)
4942

5043
self._schemata = {
51-
# 'meta': self._meta,
52-
# 'globalschema': self._globalschema,
53-
# 'mrealmschema': self._mrealmschema,
54-
# 'xbr': self._xbr,
55-
# 'xbrmm': self._xbrmm,
44+
'meta': self._meta,
45+
'globalschema': self._globalschema,
46+
'mrealmschema': self._mrealmschema,
47+
'xbr': self._xbr,
48+
'xbrmm': self._xbrmm,
5649
'xbrnetwork': self._xbrnetwork,
5750
}
5851

@@ -70,6 +63,44 @@ def __init__(self, dbpath):
7063
tables[k] = first
7164
self._schema_tables[schema_name] = tables
7265

66+
@property
67+
def dbpath(self) -> str:
68+
"""
69+
70+
:return:
71+
"""
72+
return self._dbpath
73+
74+
def schemata(self) -> List[str]:
75+
"""
76+
77+
:return:
78+
"""
79+
return sorted(self._schemata.keys())
80+
81+
def tables(self, schema_name):
82+
"""
83+
84+
:param schema_name:
85+
:return:
86+
"""
87+
if schema_name in self._schema_tables:
88+
return sorted(self._schema_tables[schema_name].keys())
89+
else:
90+
return None
91+
92+
def table_docs(self, schema_name, table_name):
93+
"""
94+
95+
:param schema_name:
96+
:param table_name:
97+
:return:
98+
"""
99+
if schema_name in self._schema_tables and table_name in self._schema_tables[schema_name]:
100+
return self._schema_tables[schema_name][table_name]
101+
else:
102+
return None
103+
73104
def _add_test_data(self):
74105
account = Account()
75106
account.oid = uuid.uuid4()
@@ -131,29 +162,43 @@ def print_stats(self):
131162
click.style('{}.{}'.format(schema_name, table_name), fg='white', bold=True),
132163
click.style(str(cnt) + ' records', fg='yellow')))
133164

134-
def export_database(self, filename, include_indexes=False):
165+
def export_database(self, filename, include_indexes=False, include_schemata=None, exclude_tables=None):
135166
"""
136167
137168
:param filename:
138169
:param include_indexes:
139170
:return:
140171
"""
172+
if include_schemata is None:
173+
schemata = sorted(self._schemata.keys())
174+
else:
175+
assert type(include_schemata) == list
176+
schemata = sorted(list(set(include_schemata).intersection(self._schemata.keys())))
177+
178+
if exclude_tables is None:
179+
exclude_tables = set()
180+
else:
181+
assert type(exclude_tables) == list
182+
exclude_tables = set(exclude_tables)
183+
141184
result = {}
142185
with self._db.begin() as txn:
143-
for schema_name in self._schemata:
186+
for schema_name in schemata:
144187
for table_name in self._schema_tables[schema_name]:
145-
table = self._schemata[schema_name].__dict__[table_name]
146-
if not table.is_index() or include_indexes:
147-
recs = []
148-
for key, val in table.select(txn, return_keys=True, return_values=True):
149-
if val:
150-
if hasattr(val, 'marshal'):
151-
val = val.marshal()
152-
recs.append((table._serialize_key(key), val))
153-
if recs:
154-
if schema_name not in result:
155-
result[schema_name] = {}
156-
result[schema_name][table_name] = recs
188+
fq_table_name = '{}.{}'.format(schema_name, table_name)
189+
if fq_table_name not in exclude_tables:
190+
table = self._schemata[schema_name].__dict__[table_name]
191+
if not table.is_index() or include_indexes:
192+
recs = []
193+
for key, val in table.select(txn, return_keys=True, return_values=True):
194+
if val:
195+
if hasattr(val, 'marshal'):
196+
val = val.marshal()
197+
recs.append((table._serialize_key(key), val))
198+
if recs:
199+
if schema_name not in result:
200+
result[schema_name] = {}
201+
result[schema_name][table_name] = recs
157202

158203
data = cbor2.dumps(result)
159204
with open(filename, 'wb') as f:

cfxdb/xbr/actor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,15 @@ def __init__(self, from_fbs=None):
111111
# [uint8] (ethsig)
112112
self._signature = None
113113

114-
def marshal(self) -> dict:
114+
def marshal(self):
115115
obj = {
116116
'timestamp': int(self.timestamp) if self.timestamp else None,
117117
'market': self.market.bytes if self.market else None,
118118
'actor': bytes(self.actor) if self.actor else None,
119119
'actor_type': self.actor_type,
120120
'joined': pack_uint256(self.joined) if self.joined else None,
121121
'security': pack_uint256(self.security) if self.security else None,
122-
'meta': self.meta,
122+
'meta': bytes(self.meta) if self.meta else None,
123123
'tid': bytes(self.tid) if self.tid else None,
124124
'signature': bytes(self.signature) if self.signature else None,
125125
}

cfxdb/xbr/member.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ def __init__(self, from_fbs=None):
106106

107107
def marshal(self) -> dict:
108108
obj = {
109-
'address': self.address,
109+
'address': bytes(self.address) if self._address else None,
110110
'account_oid': self._account_oid.bytes if self._account_oid else None,
111-
'timestamp': self.timestamp,
111+
'timestamp': int(self.timestamp) if self.timestamp else None,
112112
'registered': self.registered,
113113
'eula': self.eula,
114114
'profile': self.profile,

cfxdb/xbr/schema.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ def attach(db):
209209
schema.actors = db.attach_table(Actors)
210210
schema.idx_markets_by_actor = db.attach_table(IndexMarketsByActor)
211211

212+
# FIXME: we manually maintain the index, and hence must mark the pmap as an index manually
213+
# schema.idx_markets_by_actor._index_attached_to = schema.actors
212214
# schema.actors.attach_index('idx1', schema.idx_markets_by_actor, lambda actor:
213215
# (actor.actor, actor.timestamp))
214216

cfxdb/xbr/token.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@ def __init__(self, from_fbs=None):
8282

8383
def marshal(self) -> dict:
8484
obj = {
85-
'tx_hash': self._tx_hash,
86-
'block_hash': self._block_hash,
87-
'from_address': self._owner_address,
88-
'to_address': self._spender_address,
85+
'tx_hash': bytes(self._tx_hash) if self._tx_hash else None,
86+
'block_hash': bytes(self._block_hash) if self._block_hash else None,
87+
'from_address': bytes(self._owner_address) if self._owner_address else None,
88+
'to_address': bytes(self._spender_address) if self._spender_address else None,
8989
'value': self._value,
9090
}
9191
return obj

0 commit comments

Comments
 (0)