Пример #1
0
    def create_index(self, field_to_index: str) -> None:
        index_tree = BPlusTree(
            f'db_files/{self.name}_order_by_{field_to_index}.db', order=50)
        db_data = read_from_json("db_files/db.json")
        if field_to_index in db_data[self.name]['indexes']:
            return
        num_of_files = db_data[self.name]['num of files']
        primary_key = db_data[self.name]['primary key']

        if primary_key == field_to_index:

            for file_num in range(num_of_files):

                path = f"db_files/{self.name}_{file_num + 1}.json"
                file_data = read_from_json(path)

                for k in file_data.keys():
                    print(k)
                    index_tree[k] = path
        else:
            for file_num in range(num_of_files):
                path = f"db_files/{self.name}_{file_num + 1}.json"
                file_data = read_from_json(path)

                for v in file_data.values():
                    print(v)
                    index_tree[v[field_to_index]] = path
        index_tree.close()
        db_data[self.name]['indexes'] += field_to_index
Пример #2
0
    def insert_record(self, values: Dict[str, Any]) -> None:
        db_data = read_from_json("db_files/db.json")
        flag = None
        primary_key = db_data[self.name]['primary key']
        try:
            flag = self.get_record(values[primary_key])
        except:
            db_data = read_from_json("db_files/db.json")
            primary_key = get_primary_key(db_data, self.name)
            record_to_insert = {
                values[primary_key]:
                {k: str(v)
                 for k, v in values.items() if k != primary_key}
            }

            if end_place_in_file(
                    db_data,
                    self.name) and db_data[self.name]['num of lines'] != 0:
                db_data[self.name]['num of files'] += 1
                write_to_json(
                    f"db_files/{self.name}_{db_data[self.name]['num of files']}.json",
                    record_to_insert)
            else:
                add_to_json(
                    f"db_files/{self.name}_{db_data[self.name]['num of files']}.json",
                    record_to_insert)

        if flag is not None:
            raise ValueError

        db_data[self.name]['num of lines'] += 1
        write_to_json("db_files/db.json", db_data)
Пример #3
0
 def get_record(self, key: Any) -> Dict[str, Any]:
     db_data = read_from_json("db_files/db.json")
     num_of_files = db_data[self.name]['num of files']
     for file_num in range(num_of_files):
         file_data = read_from_json(
             f"db_files/{self.name}_{file_num + 1}.json")
         for k in file_data.keys():
             if k == str(key):
                 return file_data[k]
         else:
             raise ValueError
Пример #4
0
 def update_record(self, key: Any, values: Dict[str, Any]) -> None:
     db_data = read_from_json("db_files/db.json")
     num_of_files = db_data[self.name]['num of files']
     for file_num in range(num_of_files):
         file_data = read_from_json(
             f"db_files/{self.name}_{file_num + 1}.json")
         for k in file_data.keys():
             if k == str(key):
                 for field in values.keys():
                     file_data[k][field] = values[field]
                 write_to_json(f"db_files/{self.name}_{file_num + 1}.json",
                               file_data)
                 return
     raise ValueError
Пример #5
0
def delete_table_from_db(table_name):
    db_data = read_from_json("db_files/db.json")
    num_of_files = db_data[table_name]['num of files']
    del (db_data[table_name])
    db_data['num of tables'] -= 1
    write_to_json("db_files/db.json", db_data)
    return num_of_files
Пример #6
0
    def create_table(self, table_name: str, fields: List[DBField],
                     key_field_name: str) -> DBTable:
        if os.path.isfile(f"db_files/{table_name}_1.json"):
            raise ValueError
        if key_field_name not in [field.name for field in fields]:
            raise ValueError
        db_data = read_from_json("db_files/db.json")
        if table_name in db_data.keys():
            raise ValueError

        write_to_json(f"db_files/{table_name}_1.json", {})

        db_data['num of tables'] += 1
        db_data[table_name] = \
            {'num of files': 1,
             'num of lines': 0,
             'fields': convert_from_DBfield_to_dict(fields),
             'primary key': key_field_name,
             'indexes': []
             }
        write_to_json("db_files/db.json", db_data)

        table = DBTable(table_name, fields, key_field_name)
        table.create_index(key_field_name)

        return table
Пример #7
0
    def query_table(self, criteria: List[SelectionCriteria]) \
            -> List[Dict[str, Any]]:
        db_data = read_from_json("db_files/db.json")
        num = get_num_of_files(db_data, self.name)
        pk = get_primary_key(db_data, self.name)

        return treats_relevant(num, self.name, criteria, pk, False)
Пример #8
0
 def delete_record(self, key: Any) -> None:
     db_data = read_from_json("db_files/db.json")
     num_of_files = db_data[self.name]['num of files']
     flag = False
     for file_num in range(num_of_files):
         file_data = read_from_json(
             f"db_files/{self.name}_{file_num + 1}.json")
         for k in file_data.keys():
             if k == str(key):
                 flag = True
                 del_key = k
                 break
         if flag:
             del file_data[del_key]
             write_to_json(f"db_files/{self.name}_{file_num + 1}.json",
                           file_data)
     if not flag:
         raise ValueError
     db_data[self.name]['num of lines'] -= 1
     write_to_json("db_files/db.json", db_data)
Пример #9
0
def treats_relevant(num, table_name, criteria, primary_key, delete):
    relevants = []

    for file_num in range(num):
        file_data = read_from_json(
            f"db_files/{table_name}_{file_num + 1}.json")

        for k, v in file_data.items():
            flag = 0

            for c in criteria:

                if c.field_name == primary_key:

                    if not ops[c.operator](int(k), int(c.value)):
                        flag = 1
                        break

                else:

                    if not ops[c.operator](v[c.field_name], c.value):
                        flag = 1
                        break

            if not flag:
                if not delete:
                    relevants.append(v)

                else:
                    relevants.append(k)

        if delete:
            delete_relevant_keys(relevants, file_data, table_name, file_num)
            # update_lines(table_name, num_of_deletes, file_data,  file_num)

    return relevants
Пример #10
0
def update_data(table_name, num, file_data, file_num):
    db_data = read_from_json("db_files/db.json")
    db_data[table_name]['num of lines'] -= num
    write_to_json(f"db_files/{table_name}_{file_num + 1}.json", file_data)
    write_to_json("db_files/db.json", db_data)
Пример #11
0
 def get_tables_names(self) -> List[Any]:
     db_data = read_from_json("db_files/db.json")
     return [key for key in db_data.keys() if key != 'num of tables']
Пример #12
0
 def get_table(self, table_name: str) -> DBTable:
     db_data = read_from_json("db_files/db.json")
     return DBTable(
         table_name,
         convert_from_dict_to_DBfield(db_data[table_name]['fields']),
         db_data[table_name]['primary key'])
Пример #13
0
 def num_tables(self) -> int:
     db_data = read_from_json("db_files/db.json")
     return db_data['num of tables']
Пример #14
0
 def delete_records(self, criteria: List[SelectionCriteria]) -> None:
     db_data = read_from_json("db_files/db.json")
     num = get_num_of_files(db_data, self.name)
     pk = get_primary_key(db_data, self.name)
     treats_relevant(num, self.name, criteria, pk, True)
Пример #15
0
 def count(self) -> int:
     db_data = read_from_json("db_files/db.json")
     return db_data[self.name]['num of lines']