Initial fundamental dashboard

This commit is contained in:
2026-06-08 20:55:08 +08:00
commit a8b79df953
19 changed files with 2019 additions and 0 deletions
@@ -0,0 +1,172 @@
import ctypes
import json
from pathlib import Path
import time
class MysqlDLLClient:
"""
MySQL DLL 调用客户端
用于调用 mysql_dll2.dll 执行 SQL
Example
-------
db = MysqlDLLClient()
data = db.query(
7,
"select * from min15_a_jq where times>=? and times<=?",
["2025-12-24 00:00:00", "2025-12-26 00:00:00"]
)
print(data)
"""
def __init__(self, dll_path=None):
"""
初始化 DLL
Parameters
----------
dll_path : str | Path
dll路径,默认当前目录 mysql_dll2.dll
"""
if dll_path is None:
root = Path(__file__).resolve().parent.parent
dll_path = root / "lib/mysql_dll/mysql_dll2.dll"
self.dll = ctypes.WinDLL(str(dll_path))
self._init_functions()
time.sleep(1)
ret = self.dll.InitDBConfig()
if ret != 1:
raise RuntimeError("服务器授权失败")
# ---------------------------------------------------------
# 初始化 DLL 函数声明
# ---------------------------------------------------------
def _init_functions(self):
# 初始化数据库配置
self.dll.InitDBConfig.argtypes = []
self.dll.InitDBConfig.restype = ctypes.c_int
# 关闭 DLL
self.dll.ShutdownDLL.argtypes = []
self.dll.ShutdownDLL.restype = None
# QuerySQL_Auto
self.dll.QuerySQL_Auto.argtypes = [
ctypes.c_int, # db_index
ctypes.c_char_p, # sql
ctypes.c_char_p, # params
ctypes.POINTER(ctypes.c_void_p), # out_buf
ctypes.POINTER(ctypes.c_int) # out_size
]
self.dll.QuerySQL_Auto.restype = ctypes.c_int
# FreeBuffer
self.dll.FreeBuffer.argtypes = [ctypes.c_void_p]
self.dll.FreeBuffer.restype = None
# ---------------------------------------------------------
# 参数转换
# ---------------------------------------------------------
def _build_params(self, params):
"""
参数列表转 DLL 参数格式
["2025-01-01","2025-01-02"]
->
b"s:2025-01-01|s:2025-01-02"
"""
if not params:
return b""
arr = []
for p in params:
if isinstance(p, str):
arr.append(f"s:{p}")
elif isinstance(p, int):
arr.append(f"i:{p}")
elif isinstance(p, float):
arr.append(f"f:{p}")
else:
raise TypeError(f"不支持的参数类型: {type(p)}")
return "|".join(arr).encode()
# ---------------------------------------------------------
# 查询
# ---------------------------------------------------------
def query(self, db_index, sql, params=None):
"""
执行 SQL 查询
Parameters
----------
db_index : int
数据库编号
sql : str
SQL语句
params : list
SQL参数
Returns
-------
str
查询结果(JSON 或文本)
"""
if isinstance(sql, str):
sql = sql.encode()
params_bytes = self._build_params(params)
out_buf = ctypes.c_void_p()
out_size = ctypes.c_int()
ret = self.dll.QuerySQL_Auto(
db_index,
sql,
params_bytes,
ctypes.byref(out_buf),
ctypes.byref(out_size)
)
if ret != 0:
raise RuntimeError("SQL执行失败")
try:
data = ctypes.string_at(out_buf.value, out_size.value)
return json.loads(data.decode())
finally:
self.dll.FreeBuffer(out_buf)
# ---------------------------------------------------------
# 关闭
# ---------------------------------------------------------
def close(self):
"""关闭 DLL"""
if self.dll:
self.dll.ShutdownDLL()
# ---------------------------------------------------------
# with 支持
# ---------------------------------------------------------
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()