def __init__(self, db_file: bin_py.BinFile, row_length: int = 0, filename: str = ""):
     self.file = bin_py.BinFile("rollback_journal.log")
     if filename != "":
         self.file = bin_py.BinFile(filename)
     self.first_rollback_index = 16
     self.block_count = 0
     self.db_file = db_file
     self.block_size = 0
     if row_length:
         self.row_length = row_length
         self.block_size = 12 + 512 * row_length
 def read_file(self) -> typing.NoReturn:
     signature_len = self.file.read_integer(0, 1)
     signature_result = self.file.read_str(1, signature_len)
     if self.signature != signature_result:
         raise exception.WrongFileFormat()
     self.tables_count = self.file.read_integer(14, 2)
     metafiles_list = self.__get_files_by_mask("*.table_meta")
     for metafile in metafiles_list:
         table_obj = Table()
         table_obj.metafile_name = metafile
         table_obj.metafile = bin_py.BinFile(table_obj.metafile_name)
         table_obj.metafile.open("r+")
         table_obj.storage_name = table_obj.metafile_name.replace(".table_meta", ".storage")
         table_obj.storage_file = bin_py.BinFile(table_obj.storage_name)
         table_obj.storage_file.open("r+")
         table_obj.read_file()
         table_obj.open_transaction_registry()
         self.tables.append(table_obj)
 def __init__(self, create_default_file: bool = True, db_filename: str = ""):
     self.tables_count = 0
     self.signature = "#VDBSignature"
     self.tables = []
     self.meta_db_filename = ""
     self.file = None
     if create_default_file:
         self.meta_db_filename = "zhavoronkov.vdb.db_meta"
         self.file = bin_py.BinFile(self.meta_db_filename)
         self.file.open("w+")
         self.write_file()
         self.write_table_count(self.tables_count)
     elif db_filename != "":
         self.meta_db_filename = db_filename
         if os.path.isfile(self.meta_db_filename + ".db_meta"):
             self.connect_to_db(self.meta_db_filename + ".db_meta")
         else:
             self.file = bin_py.BinFile(self.meta_db_filename + ".db_meta")
             self.file.open("w+")
             self.write_file()
             self.write_table_count(self.tables_count)
 def create_table(self, table_name: str, fields: typing.Dict, is_versioning: bool = False) -> typing.List:
     new_table = Table()
     new_table.name = table_name
     new_table.metafile_name = self.meta_db_filename + "_"+ new_table.name + ".table_meta"
     new_table.metafile = bin_py.BinFile(new_table.metafile_name)
     new_table.metafile.open("w+")
     new_table.storage_name = self.meta_db_filename + "_" + table_name + ".storage"
     new_table.storage_file = bin_py.BinFile(new_table.storage_name)
     new_table.storage_file.open("w+")
     if is_versioning:
         new_table.is_versioning = True
     new_table.fill_table_fields(fields)
     new_table.calc_row_size()
     new_table.create_transaction_registry()
     new_table.write_file()
     self.tables.append(new_table)
     self.tables_count += 1
     self.write_table_count(self.tables_count)
     table_index = self.tables.index(new_table)
     self.tables[table_index].create_block()
     return self.tables[table_index]
 def connect_to_db(self, filename: str) -> typing.NoReturn:
     file = bin_py.BinFile(filename)
     if not file.is_file_exist():
         raise exception.DBFileNotExists()
     self.file = file
     self.file.open("r+")
     signature_len = self.file.read_integer(0, 1)
     signature_str = self.file.read_str(1, signature_len)
     if signature_str != self.signature:
         raise exception.WrongSignature()
     self.read_file()
     if self.__check_journal():
         self.wide_rollback()
def test_binfile():
    test_file = bin_py.BinFile("test.bin")
    test_file.open("w+")
    test_file.write_integer(22, 0, 1)
    test_file.write_bool(False, 1)
    test_file.write_str("vadik", 2, 32)
    test_file.write_float(2.006, 35)
    test_file.write_fixed_integer(877776, 44)
    test_file.write_long_long(2036854775807, 48)
    result_int = test_file.read_integer(0, 1)
    result_bool = test_file.read_bool(1)
    result_str = test_file.read_str(2, 32)
    result_float = test_file.read_float(35)
    result_fixed_int = test_file.read_fixed_integer(44)
    result_long_long = test_file.read_long_long(48)
    test_file.close()
    os.remove("test.bin")
    assert result_int == 22
    assert not result_bool
    assert result_str == "vadik"
    assert result_float == 2.006
    assert result_fixed_int == 877776
    assert result_long_long == 2036854775807
 def __init__(self, table: Table):
     self.table = table
     self.registry_filename = f"transaction_{self.table.name}.rg"
     self.registry_file = bin_py.BinFile(self.registry_filename)
     self.row_size = 20
     self.rows_count = 0