116 lines
3.8 KiB
Python
116 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
缓存模块
|
||
"""
|
||
|
||
# 列举导入模块
|
||
import json
|
||
from pathlib import Path
|
||
from pathlib import WindowsPath
|
||
import sys
|
||
import time
|
||
from typing import Any, Dict, Optional
|
||
|
||
sys.path.append(Path(__file__).parent.parent.as_posix())
|
||
from utils.sqlite import SQLite
|
||
|
||
|
||
class Caches(SQLite):
|
||
"""
|
||
缓存客户端,支持:
|
||
query:查询并返回单条缓存
|
||
update:新增或更新单条缓存
|
||
"""
|
||
|
||
# 自定义JSON编码器
|
||
class JSONEncoder(json.JSONEncoder):
|
||
def default(self, o):
|
||
# 若为WindowsPath对象则转为字符串路径
|
||
if isinstance(o, WindowsPath):
|
||
return o.as_posix()
|
||
return super().default(o)
|
||
|
||
def __init__(self, cache_ttl: int = 30 * 86400):
|
||
"""
|
||
初始化
|
||
:param cache_ttl: 缓存生存时间,单位为秒,默认为30天
|
||
"""
|
||
# 初始化
|
||
super().__init__(database=Path(__file__).parent.resolve() / "caches.db")
|
||
self.cache_ttl = cache_ttl
|
||
|
||
# 初始化缓存表(不清理过期缓存)
|
||
try:
|
||
with self:
|
||
self.execute(
|
||
sql="""
|
||
CREATE TABLE IF NOT EXISTS caches
|
||
(
|
||
--草稿名称
|
||
draft_name TEXT PRIMARY KEY,
|
||
--工作流配置
|
||
configurations TEXT NOT NULL,
|
||
--创建时间戳
|
||
timestamp REAL NOT NULL
|
||
)
|
||
"""
|
||
)
|
||
self.execute(
|
||
sql="""
|
||
CREATE INDEX IF NOT EXISTS idx_timestamp ON caches(timestamp)
|
||
"""
|
||
)
|
||
except Exception as exception:
|
||
raise RuntimeError(f"初始化缓存发生异常:{str(exception)}") from exception
|
||
|
||
def query(self, draft_name: str) -> Optional[Dict[str, Any]]:
|
||
"""
|
||
查询并返回单条缓存
|
||
:param draft_name: 草稿名称
|
||
:return: 缓存
|
||
"""
|
||
try:
|
||
with self:
|
||
result = self.query_one(
|
||
sql="""
|
||
SELECT configurations
|
||
FROM caches
|
||
WHERE draft_name = ? AND timestamp >= ?
|
||
""",
|
||
parameters=(draft_name, time.time() - self.cache_ttl),
|
||
)
|
||
return None if result is None else json.loads(result["configurations"])
|
||
except Exception as exception:
|
||
raise RuntimeError(
|
||
f"查询并获取单条缓存发生异常:{str(exception)}"
|
||
) from exception
|
||
|
||
def update(
|
||
self, draft_name: str, configurations: Dict[str, Dict[str, Any]]
|
||
) -> Optional[bool]:
|
||
"""
|
||
新增或更新单条缓存
|
||
:param draft_name: 草稿名称
|
||
:param configurations: 节点配置
|
||
:return: 成功返回True,失败返回False
|
||
"""
|
||
try:
|
||
with self:
|
||
return self.execute(
|
||
sql="""
|
||
INSERT OR REPLACE INTO caches (draft_name, configurations, timestamp) VALUES (?, ?, ?)
|
||
""",
|
||
parameters=(
|
||
draft_name,
|
||
json.dumps(
|
||
obj=configurations,
|
||
cls=self.JSONEncoder,
|
||
sort_keys=True,
|
||
ensure_ascii=False,
|
||
),
|
||
time.time(),
|
||
),
|
||
)
|
||
except Exception as exception:
|
||
raise RuntimeError("新增或更新缓存发生异常") from exception
|