mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-11-11 16:21:09 +08:00
144 lines
4.4 KiB
Python
144 lines
4.4 KiB
Python
from typing import Any, Optional
|
||
|
||
from sqlalchemy import delete
|
||
from sqlalchemy.orm import Session
|
||
|
||
from app.db.base import DbOper
|
||
from app.db.models.plugindata import PluginData
|
||
|
||
|
||
class PluginDataOper(DbOper):
|
||
"""
|
||
插件数据管理
|
||
"""
|
||
|
||
def save(self, plugin_id: str, key: str, value: Any):
|
||
"""
|
||
保存插件数据
|
||
:param plugin_id: 插件id
|
||
:param key: 数据key
|
||
:param value: 数据值
|
||
"""
|
||
plugin = self._execute_sync_query(
|
||
lambda session: PluginData.get_plugin_data_by_key(
|
||
session, plugin_id, key
|
||
)
|
||
)
|
||
if plugin:
|
||
self._stage_update(plugin, {
|
||
"value": value
|
||
})
|
||
else:
|
||
self._stage_create(PluginData(plugin_id=plugin_id, key=key, value=value))
|
||
|
||
async def async_save(self, plugin_id: str, key: str, value: Any) -> None:
|
||
"""
|
||
异步保存插件数据
|
||
|
||
:param plugin_id: 插件ID
|
||
:param key: 数据键
|
||
:param value: 数据值
|
||
"""
|
||
plugin = await self._execute_async_query(
|
||
lambda session: PluginData.async_get_plugin_data_by_key(
|
||
session, plugin_id, key
|
||
)
|
||
)
|
||
if plugin:
|
||
await self._stage_async_update(plugin, {"value": value})
|
||
else:
|
||
await self._stage_async_create(
|
||
PluginData(plugin_id=plugin_id, key=key, value=value)
|
||
)
|
||
|
||
def get_data(self, plugin_id: str, key: Optional[str] = None) -> Any:
|
||
"""
|
||
获取插件数据
|
||
:param plugin_id: 插件id
|
||
:param key: 数据key
|
||
"""
|
||
if key:
|
||
data = self._execute_sync_query(
|
||
lambda session: PluginData.get_plugin_data_by_key(
|
||
session, plugin_id, key
|
||
)
|
||
)
|
||
if not data:
|
||
return None
|
||
return data.value
|
||
else:
|
||
return self._execute_sync_query(
|
||
lambda session: PluginData.get_plugin_data(session, plugin_id)
|
||
)
|
||
|
||
async def async_get_data(self, plugin_id: str, key: Optional[str] = None) -> Any:
|
||
"""
|
||
异步获取插件数据。
|
||
:param plugin_id: 插件id
|
||
:param key: 数据key
|
||
"""
|
||
if key:
|
||
data = await self._execute_async_query(
|
||
lambda session: PluginData.async_get_plugin_data_by_key(
|
||
session, plugin_id, key
|
||
)
|
||
)
|
||
if not data:
|
||
return None
|
||
return data.value
|
||
return await self._execute_async_query(
|
||
lambda session: PluginData.async_get_plugin_data(session, plugin_id)
|
||
)
|
||
|
||
def del_data(self, plugin_id: str, key: Optional[str] = None) -> Any:
|
||
"""
|
||
删除插件数据
|
||
:param plugin_id: 插件id
|
||
:param key: 数据key
|
||
"""
|
||
def stage(session: Session) -> None:
|
||
"""把删除入口映射到调用方或组合根持有的事务。"""
|
||
if key:
|
||
PluginData.del_plugin_data_by_key(session, plugin_id, key)
|
||
else:
|
||
PluginData.del_plugin_data(session, plugin_id)
|
||
|
||
self._execute_sync_write(stage)
|
||
|
||
def stage_delete(self, plugin_id: str) -> None:
|
||
"""暂存目标插件全部数据删除并 flush,不提交调用方事务。"""
|
||
if not isinstance(self._db, Session):
|
||
raise RuntimeError("插件数据暂存删除需要调用方提供 Session")
|
||
self._db.execute(
|
||
delete(PluginData).where(PluginData.plugin_id == plugin_id)
|
||
)
|
||
self._db.flush()
|
||
|
||
def truncate(self):
|
||
"""
|
||
清空插件数据
|
||
"""
|
||
self._stage_truncate(PluginData)
|
||
|
||
def get_data_all(self, plugin_id: str) -> Any:
|
||
"""
|
||
获取插件所有数据
|
||
:param plugin_id: 插件id
|
||
"""
|
||
return self._execute_sync_query(
|
||
lambda session: PluginData.get_plugin_data_by_plugin_id(
|
||
session, plugin_id
|
||
)
|
||
)
|
||
|
||
async def async_get_data_all(self, plugin_id: str) -> Any:
|
||
"""
|
||
异步获取插件所有数据。
|
||
:param plugin_id: 插件id
|
||
"""
|
||
return await self._execute_async_query(
|
||
lambda session: PluginData.async_get_plugin_data_by_plugin_id(
|
||
session, plugin_id
|
||
)
|
||
)
|