duty-board-dog/pickle_db.py

74 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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