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