2026-04-06 22:51:04 +08:00
|
|
|
from __future__ import annotations
|
|
|
|
|
from typing import Protocol, runtime_checkable
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@runtime_checkable
|
|
|
|
|
class StorageEngine(Protocol):
|
2026-07-08 17:33:41 +08:00
|
|
|
"""Persistence contract for collections and their documents."""
|
|
|
|
|
|
|
|
|
|
def create_collection(self, name: str) -> None:
|
|
|
|
|
"""Create a new collection; error if it already exists."""
|
|
|
|
|
|
|
|
|
|
def get_or_create_collection(self, name: str) -> None:
|
|
|
|
|
"""Create the collection if absent; no-op if it already exists."""
|
|
|
|
|
|
|
|
|
|
def list_collections(self) -> list[str]:
|
|
|
|
|
"""Return all collection names."""
|
|
|
|
|
|
|
|
|
|
def delete_collection(self, name: str) -> None:
|
|
|
|
|
"""Delete a collection and all its documents."""
|
|
|
|
|
|
|
|
|
|
def save_document(self, collection: str, doc_id: str, doc: dict) -> None:
|
|
|
|
|
"""Persist a document under a collection."""
|
|
|
|
|
|
|
|
|
|
def find_document_by_hash(self, collection: str, file_hash: str) -> str | None:
|
|
|
|
|
"""Return the doc_id with this file hash in the collection, or None."""
|
|
|
|
|
|
|
|
|
|
def get_document(self, collection: str, doc_id: str) -> dict:
|
|
|
|
|
"""Return a document's metadata."""
|
|
|
|
|
|
|
|
|
|
def get_document_structure(self, collection: str, doc_id: str) -> list:
|
|
|
|
|
"""Return a document's tree structure."""
|
|
|
|
|
|
|
|
|
|
def get_pages(self, collection: str, doc_id: str) -> list | None:
|
|
|
|
|
"""Return cached page content, or None if not cached."""
|
|
|
|
|
|
|
|
|
|
def list_documents(self, collection: str) -> list[dict]:
|
|
|
|
|
"""Return metadata for all documents in a collection."""
|
|
|
|
|
|
|
|
|
|
def delete_document(self, collection: str, doc_id: str) -> None:
|
|
|
|
|
"""Delete a single document from a collection."""
|
|
|
|
|
|
|
|
|
|
def close(self) -> None:
|
|
|
|
|
"""Release any underlying resources (connections, handles)."""
|