mxivideo/python_core/storage/factory.py

156 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
存储工厂类
"""
from typing import Type, Dict
from .base import StorageInterface, StorageConfig, StorageType, StorageException
from .json_storage import JSONStorage
from python_core.utils.logger import logger
class StorageFactory:
"""存储工厂类"""
_storage_classes: Dict[StorageType, Type[StorageInterface]] = {
StorageType.JSON: JSONStorage,
}
@classmethod
def register_storage(cls, storage_type: StorageType, storage_class: Type[StorageInterface]):
"""注册存储实现
Args:
storage_type: 存储类型
storage_class: 存储实现类
"""
cls._storage_classes[storage_type] = storage_class
logger.info(f"Registered storage type: {storage_type.value}")
@classmethod
def create_storage(cls, config: StorageConfig) -> StorageInterface:
"""创建存储实例
Args:
config: 存储配置
Returns:
StorageInterface: 存储实例
Raises:
StorageException: 当存储类型不支持时
"""
storage_type = config.storage_type
if storage_type not in cls._storage_classes:
available_types = list(cls._storage_classes.keys())
raise StorageException(
f"Unsupported storage type: {storage_type.value}. "
f"Available types: {[t.value for t in available_types]}"
)
storage_class = cls._storage_classes[storage_type]
try:
storage = storage_class(config)
logger.info(f"Created storage instance: {storage_type.value}")
return storage
except Exception as e:
logger.error(f"Failed to create storage instance {storage_type.value}: {e}")
raise StorageException(f"Failed to create storage: {e}")
@classmethod
def get_available_types(cls) -> list[StorageType]:
"""获取可用的存储类型
Returns:
List[StorageType]: 可用的存储类型列表
"""
return list(cls._storage_classes.keys())
@classmethod
def create_json_storage(cls, base_path: str = None) -> StorageInterface:
"""创建JSON存储实例便捷方法
Args:
base_path: 存储基础路径
Returns:
StorageInterface: JSON存储实例
"""
config = StorageConfig(
storage_type=StorageType.JSON,
base_path=base_path
)
return cls.create_storage(config)
# 全局存储实例缓存
_storage_instances: Dict[str, StorageInterface] = {}
def get_storage(storage_key: str = "default", config: StorageConfig = None) -> StorageInterface:
"""获取存储实例(单例模式)
Args:
storage_key: 存储实例键
config: 存储配置(首次创建时需要)
Returns:
StorageInterface: 存储实例
Raises:
StorageException: 当配置缺失时
"""
if storage_key not in _storage_instances:
if config is None:
# 使用默认JSON存储配置
config = StorageConfig(storage_type=StorageType.JSON)
_storage_instances[storage_key] = StorageFactory.create_storage(config)
return _storage_instances[storage_key]
def close_all_storages():
"""关闭所有存储实例"""
for storage_key, storage in _storage_instances.items():
try:
storage.close()
logger.info(f"Closed storage instance: {storage_key}")
except Exception as e:
logger.error(f"Failed to close storage {storage_key}: {e}")
_storage_instances.clear()
# 注册未来的存储实现
def register_database_storage():
"""注册数据库存储(未来实现)"""
try:
from .database_storage import DatabaseStorage
StorageFactory.register_storage(StorageType.DATABASE, DatabaseStorage)
except ImportError:
logger.debug("Database storage not available")
def register_mongodb_storage():
"""注册MongoDB存储未来实现"""
try:
from .mongodb_storage import MongoDBStorage
StorageFactory.register_storage(StorageType.MONGODB, MongoDBStorage)
except ImportError:
logger.debug("MongoDB storage not available")
def register_redis_storage():
"""注册Redis存储未来实现"""
try:
from .redis_storage import RedisStorage
StorageFactory.register_storage(StorageType.REDIS, RedisStorage)
except ImportError:
logger.debug("Redis storage not available")
# 自动注册可用的存储类型
def auto_register_storages():
"""自动注册所有可用的存储类型"""
register_database_storage()
register_mongodb_storage()
register_redis_storage()
# 模块加载时自动注册
auto_register_storages()