Exemple #1
0
 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))
Exemple #2
0
 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))
Exemple #3
0
    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
Exemple #4
0
    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
Exemple #5
0
    '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')
Exemple #6
0
"""
Функции преобразования значений из двоичных, 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:
    """
    Описание поля таблицы