205 lines
6.9 KiB
Python
205 lines
6.9 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
VWED.data 模块 - 数据存储和缓存
|
||
"""
|
||
|
||
import json
|
||
import uuid
|
||
from typing import Dict, Any, Optional
|
||
|
||
|
||
class VWEDDataModule:
|
||
"""VWED.data 模块 - 数据存储和缓存"""
|
||
|
||
def __init__(self, script_id: str):
|
||
self.script_id = script_id
|
||
self._storage: Dict[str, Any] = {}
|
||
|
||
def get(self, key: str, default=None):
|
||
"""获取数据"""
|
||
return self._storage.get(key, default)
|
||
|
||
def set(self, key: str, value: Any):
|
||
"""设置数据"""
|
||
self._storage[key] = value
|
||
|
||
def delete(self, key: str):
|
||
"""删除数据"""
|
||
if key in self._storage:
|
||
del self._storage[key]
|
||
|
||
def clear(self):
|
||
"""清空所有数据"""
|
||
self._storage.clear()
|
||
|
||
def keys(self):
|
||
"""获取所有键"""
|
||
return list(self._storage.keys())
|
||
|
||
def has(self, key: str) -> bool:
|
||
"""检查键是否存在"""
|
||
return key in self._storage
|
||
|
||
async def get_cache_param(self, key: str) -> Optional[str]:
|
||
"""
|
||
获取缓存数据
|
||
|
||
Args:
|
||
key: 缓存键
|
||
|
||
Returns:
|
||
str | None: 字符串类型,JSON格式。如果数据不存在,将返回None
|
||
|
||
Raises:
|
||
Exception: 本方法会抛出异常
|
||
"""
|
||
from sqlalchemy import select
|
||
from data.models.datacachesplit import VWEDDataCacheSplit
|
||
from data.session import get_async_session
|
||
|
||
async with get_async_session() as session:
|
||
query = select(VWEDDataCacheSplit).where(
|
||
VWEDDataCacheSplit.data_key == key,
|
||
VWEDDataCacheSplit.is_deleted == 0
|
||
)
|
||
result = await session.execute(query)
|
||
record = result.scalar_one_or_none()
|
||
|
||
if not record or not record.data_value:
|
||
return None
|
||
|
||
return record.data_value
|
||
|
||
async def put_cache_param(self, key: str, value: str) -> None:
|
||
"""
|
||
缓存数据
|
||
|
||
将参数中的key和value键值对在系统中进行缓存,缓存的数据将持久化,
|
||
之后可通过get_cache_param方法根据key获取对应的value。
|
||
|
||
Args:
|
||
key: 缓存键
|
||
value: 缓存值。如果要缓存一个对象,需要先序列化为JSON字符串
|
||
|
||
Returns:
|
||
None
|
||
|
||
Note:
|
||
本方法不会抛出异常
|
||
"""
|
||
try:
|
||
from sqlalchemy import select, insert, update
|
||
from data.models.datacachesplit import VWEDDataCacheSplit
|
||
from data.session import get_async_session
|
||
|
||
async with get_async_session() as session:
|
||
# 查询是否已存在相同key的记录且未被删除
|
||
query = select(VWEDDataCacheSplit).where(
|
||
VWEDDataCacheSplit.data_key == key,
|
||
VWEDDataCacheSplit.is_deleted == 0
|
||
)
|
||
result = await session.execute(query)
|
||
existing_active_record = result.scalar_one_or_none()
|
||
|
||
# 如果有未删除的记录,则更新它
|
||
if existing_active_record:
|
||
stmt = update(VWEDDataCacheSplit).where(
|
||
VWEDDataCacheSplit.id == existing_active_record.id
|
||
).values(
|
||
data_value=json.dumps(value) if not isinstance(value, str) else value,
|
||
)
|
||
await session.execute(stmt)
|
||
else:
|
||
# 如果没有未删除的记录,创建新记录
|
||
stmt = insert(VWEDDataCacheSplit).values(
|
||
id=str(uuid.uuid4()),
|
||
data_key=key,
|
||
data_value=json.dumps(value) if not isinstance(value, str) else value,
|
||
is_deleted=0
|
||
)
|
||
await session.execute(stmt)
|
||
|
||
await session.commit()
|
||
except Exception:
|
||
# 本方法不会抛出异常,静默处理
|
||
pass
|
||
|
||
async def clear_cache_param(self, key: str) -> None:
|
||
"""
|
||
删除缓存数据
|
||
|
||
Args:
|
||
key: 缓存键
|
||
|
||
Returns:
|
||
None
|
||
|
||
Note:
|
||
本方法不抛出异常
|
||
"""
|
||
try:
|
||
from sqlalchemy import update, select
|
||
from data.models.datacachesplit import VWEDDataCacheSplit
|
||
from data.session import get_async_session
|
||
|
||
async with get_async_session() as session:
|
||
# 首先检查是否存在该条记录
|
||
query = select(VWEDDataCacheSplit).where(
|
||
VWEDDataCacheSplit.data_key == key,
|
||
VWEDDataCacheSplit.is_deleted == 0
|
||
)
|
||
result = await session.execute(query)
|
||
exists = result.scalar_one_or_none() is not None
|
||
|
||
if exists:
|
||
# 软删除具有指定键的记录
|
||
stmt = update(VWEDDataCacheSplit).where(
|
||
VWEDDataCacheSplit.data_key == key,
|
||
VWEDDataCacheSplit.is_deleted == 0
|
||
).values(
|
||
is_deleted=1,
|
||
)
|
||
await session.execute(stmt)
|
||
await session.commit()
|
||
except Exception:
|
||
# 本方法不抛出异常,静默处理
|
||
pass
|
||
|
||
async def get_all_cache_params(self) -> str:
|
||
"""
|
||
获取所有的缓存数据
|
||
|
||
获取缓存块的全部缓存数据,并以JSON格式返回。
|
||
|
||
Returns:
|
||
str: 字符串类型,JSON格式。如果数据不存在,将返回空字符串
|
||
|
||
Raises:
|
||
Exception: 本方法会抛出异常
|
||
"""
|
||
from sqlalchemy import select
|
||
from data.models.datacachesplit import VWEDDataCacheSplit
|
||
from data.session import get_async_session
|
||
|
||
async with get_async_session() as session:
|
||
query = select(VWEDDataCacheSplit).where(
|
||
VWEDDataCacheSplit.is_deleted == 0
|
||
)
|
||
result = await session.execute(query)
|
||
records = result.scalars().all()
|
||
|
||
if not records:
|
||
return ""
|
||
|
||
# 构建缓存数据字典
|
||
cache_data = {}
|
||
for record in records:
|
||
try:
|
||
# 尝试将值解析为JSON,如果失败则使用原始字符串
|
||
cache_data[record.data_key] = json.loads(record.data_value)
|
||
except (json.JSONDecodeError, TypeError):
|
||
cache_data[record.data_key] = record.data_value
|
||
|
||
return json.dumps(cache_data, ensure_ascii=False) |