Files
Projects/toolbox/codes/common/db_operation.py
2025-09-27 19:03:05 +08:00

113 lines
3.7 KiB
Python

import sqlite3
import time
from inspect import currentframe
from codes.common import clibs
def db_init():
if clibs.db_file.exists():
return
clibs.conn = sqlite3.connect(clibs.db_file, isolation_level=None, check_same_thread=False, cached_statements=2048, timeout=10.0)
clibs.cursor = clibs.conn.cursor()
clibs.cursor.execute("PRAGMA journal_mode=wal")
clibs.cursor.execute("PRAGMA wal_checkpoint=TRUNCATE")
clibs.cursor.execute("PRAGMA synchronous=normal")
clibs.cursor.execute("PRAGMA temp_store=memory")
clibs.cursor.execute("PRAGMA mmap_size=30000000000")
clibs.cursor.execute("PRAGMA cache_size=200000")
clibs.cursor.execute(
"""
create table if not exists logs(
id integer primary key autoincrement,
timestamp DATETIME DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime')),
level text,
module text,
content text
)
"""
)
clibs.cursor.execute(
"""
create table if not exists users(
id integer primary key autoincrement,
timestamp DATETIME DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime')),
username text not null unique,
password text not null,
salt text not null
)
"""
)
db_write_logs("数据库初始化成功!", "login_ui")
db_close()
def db_lock(func):
def wrapper(*args, **kwargs):
try:
clibs.lock.acquire(True)
ret = func(*args, **kwargs)
finally:
clibs.lock.release()
return ret
return wrapper
def db_backup():
t = time.strftime("%Y%m%d%H%M%S", time.localtime())
db_file_backup = clibs.base_path / f"assets/database/toolbox.{t}.db"
db_file_backup.write_bytes(clibs.db_file.read_bytes())
db_dir = clibs.base_path / "assets/database"
db_list = [db for db in db_dir.glob("*.db")]
for db in sorted(db_list)[:-clibs.config["maximum_db_number"]]:
db.unlink()
def db_conn():
clibs.conn = sqlite3.connect(clibs.db_file, isolation_level=None, check_same_thread=False, cached_statements=2048, timeout=3.0)
clibs.cursor = clibs.conn.cursor()
clibs.cursor.execute("PRAGMA journal_mode=wal")
clibs.cursor.execute("PRAGMA wal_checkpoint=TRUNCATE")
clibs.cursor.execute("PRAGMA synchronous=normal")
clibs.cursor.execute("PRAGMA temp_store=memory")
clibs.cursor.execute("PRAGMA mmap_size=30000000000")
clibs.cursor.execute("PRAGMA cache_size=200000")
@db_lock
def db_close():
if clibs.cursor is not None:
clibs.cursor.close()
if clibs.conn is not None:
clibs.conn.close()
clibs.conn, clibs.cursor = None, None
@db_lock
def db_write_logs(content, module="", level="info"):
if module == "":
frame = currentframe().f_back
module_name = frame.f_globals["__name__"]
line_no = frame.f_lineno
module = f"{module_name}.{line_no}"
if level.lower() not in ["info", "warning", "error", "exception"]:
level = "unknown"
clibs.cursor.execute(f"INSERT INTO logs (level, module, content) VALUES (?, ?, ?)", (level, module, content))
@db_lock
def db_query_logs():
...
@db_lock
def db_write_users(username, password_encrypted, salt):
clibs.cursor.execute("INSERT INTO users (username, password, salt) VALUES (?, ?, ?)", (username, password_encrypted, salt))
@db_lock
def db_delete_users(username):
# clibs.cursor.execute("INSERT INTO users (username, password, salt) VALUES (?, ?, ?)", (username, password_encrypted, salt))
...
@db_lock
def db_query_users(username):
clibs.cursor.execute(f""" SELECT * FROM users where username = "{username}" """)
record = clibs.cursor.fetchall()
return record