74 lines
1.9 KiB
Python
74 lines
1.9 KiB
Python
# SPDX-FileCopyrightText: 2023 Egor Guslyancev <electromagneticcyclone@disroot.org>
|
||
#
|
||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||
|
||
import sys
|
||
import pickle as p
|
||
from os import path
|
||
from sys import stderr, stdout, stdin
|
||
|
||
db = {}
|
||
|
||
def save_db(dbfo = ".db"):
|
||
global db
|
||
try:
|
||
with open(dbfo, "wb") as fo:
|
||
p.dump(db, fo)
|
||
except:
|
||
stderr.write("Не удалось записать базу!")
|
||
sys.exit(1)
|
||
|
||
def load_db(dbfi = ".db"):
|
||
global db
|
||
if not path.exists(dbfi):
|
||
save_db()
|
||
return
|
||
try:
|
||
with open(dbfi, "rb") as fi:
|
||
db = p.load(fi)
|
||
except:
|
||
stderr.write("Не удалось прочитать базу, пробуем сохранить…")
|
||
save_db()
|
||
|
||
def write_db(field: str, value: any, data = None):
|
||
global db
|
||
head = False
|
||
if data == None:
|
||
data = db
|
||
head = True
|
||
field = field.split(".")
|
||
if len(field) == 1:
|
||
data[field[0]] = value
|
||
else:
|
||
if field[0] not in data or data[field[0]] is None:
|
||
data[field[0]] = {}
|
||
if type(data[field[0]]) is not dict:
|
||
raise ValueError("Поле не является группой.")
|
||
data[field[0]] = write_db('.'.join(field[1:]), value, data[field[0]])
|
||
save_db()
|
||
if head:
|
||
db = data
|
||
return data
|
||
|
||
def read_db(field: str, default = None, data = None) -> any:
|
||
global db
|
||
if data == None:
|
||
data = db
|
||
field = field.split(".")
|
||
if field[0] not in data:
|
||
return default
|
||
if len(field) == 1:
|
||
return data[field[0]]
|
||
else:
|
||
return read_db('.'.join(field[1:]), default, data[field[0]])
|
||
|
||
def pop_db(field: str):
|
||
global db
|
||
ret = read_db(field)
|
||
field = field.split(".")
|
||
val = read_db('.'.join(field[:-1]))
|
||
if type(val) is not dict:
|
||
return
|
||
val.pop(field[-1])
|
||
write_db('.'.join(field[:-1]), val)
|
||
return ret |