def read(self): """ Считывает мета-описание db Содержащее параметры db и описание таблиц :return: """ block_num = 0 buffer = self.reader.read_block(0) while buffer: block_info = utils.read_struct(buffer, '8s3iI') if block_info[0] == b'1CDBMSV8': data = utils.read_struct(buffer, '8s4bIi') self.version = '%s.%s.%s.%s' % tuple(data[1:5]) self.baseLength = data[5] elif block_info[0] == b'1CDBOBV8': if block_info[4] == 0: pass else: tables, self.lang = self.__read_root_object(block_num) self.tables = {table.name.upper(): table for table in tables} break block_num += 1 buffer = self.reader.read_block(block_num) logger.debug('version: %s' % self.version) logger.debug('lang: %s' % self.lang) logger.debug('base length: %s' % self.baseLength) logger.debug('tables count: %s' % len(self.tables))
def read(self): """ Считывает мета-описание db Содержащее параметры db и описание таблиц :return: """ block_num = 0 buffer = self.reader.read_block(0) while buffer: block_info = utils.read_struct(buffer, '8s3iI') if block_info[0] == b'1CDBMSV8': data = utils.read_struct(buffer, '8s4bIi') self.version = '%s.%s.%s.%s' % tuple(data[1:5]) self.baseLength = data[5] elif block_info[0] == b'1CDBOBV8': if block_info[4] == 0: pass else: tables, self.lang = self.__read_root_object(block_num) self.tables = { table.name.upper(): table for table in tables } break block_num += 1 buffer = self.reader.read_block(block_num) logger.debug('version: %s' % self.version) logger.debug('lang: %s' % self.lang) logger.debug('base length: %s' % self.baseLength) logger.debug('tables count: %s' % len(self.tables))
def __read_root_object(self, obj_addr): """ Читает основной объект db Содержащий параметры db и описание таблиц :param obj_addr: Адрес блока объекта :return: """ obj_data = self.reader.read_obj(obj_addr) root_info = utils.read_struct(obj_data, '32si') lang = root_info[0].rstrip(b'\x00').decode() address_tables_info = utils.read_struct(obj_data, str(root_info[1]) + 'i', 36) tables = [] for addr in address_tables_info: tables.append(parse_table_info(self.reader.read_obj(addr).decode('UTF-16'))) for table in tables: table.init() return tables, lang
def __read_root_object(self, obj_addr): """ Читает основной объект db Содержащий параметры db и описание таблиц :param obj_addr: Адрес блока объекта :return: """ obj_data = self.reader.read_obj(obj_addr) root_info = utils.read_struct(obj_data, '32si') lang = root_info[0].rstrip(b'\x00').decode() address_tables_info = utils.read_struct(obj_data, str(root_info[1]) + 'i', 36) tables = [] for addr in address_tables_info: tables.append( parse_table_info(self.reader.read_obj(addr).decode('UTF-16'))) for table in tables: table.init() return tables, lang
'NT': lambda x: 8, 'I': lambda x: 8, 'DT': lambda x: 7, } """ Функции преобразования значений из двоичных, f - параметры типа, x - дв. данные значения """ types_fun = { 'GUID': lambda f, x: Guid(x), 'B': lambda f, x: utils.b2s(x), 'L': lambda f, x: x[0] == 1, 'N': lambda f, x: utils.bytes_to_int(f, x), 'NC': lambda f, x: x.decode('utf-16'), 'NVC': lambda f, x: x[2:2 + 2 * utils.read_struct(x[:2], 'h')[0]].decode('utf-16'), 'RV': lambda f, x: utils.read_struct(x, '4I'), 'NT': lambda f, x: utils.read_struct(x, '2I'), 'I': lambda f, x: utils.read_struct(x, '2I'), 'DT': lambda f, x: utils.b2s(x) if x[4:6] == b'\x00\x00' else datetime.strptime(utils.b2s(x), '%Y%m%d%H%M%S') } class FieldDesc: """ Описание поля таблицы """ def __init__(self, **kwargs): self.name = kwargs.pop('name') self.type = kwargs.pop('type') self.nullable = kwargs.pop('nullable')
""" Функции преобразования значений из двоичных, f - параметры типа, x - дв. данные значения """ types_fun = { 'GUID': lambda f, x: Guid(x), 'B': lambda f, x: utils.b2s(x), 'L': lambda f, x: x[0] == 1, 'N': lambda f, x: utils.bytes_to_int(f, x), 'NC': lambda f, x: x.decode('utf-16'), 'NVC': lambda f, x: x[2:2 + 2 * utils.read_struct(x[:2], 'h')[0]].decode('utf-16' ), 'RV': lambda f, x: utils.read_struct(x, '4I'), 'NT': lambda f, x: utils.read_struct(x, '2I'), 'I': lambda f, x: utils.read_struct(x, '2I'), 'DT': lambda f, x: utils.bytes_to_datetime(f, x) } class FieldDesc: """ Описание поля таблицы