77
88import os
99import uuid
10+ from typing import List
1011
1112import cbor2
1213import 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 :
0 commit comments