use super::error::CatalogResult;
use super::operations::{CatalogOperation, CatalogResponse};
use crate::storage::StorageManager;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CatalogSchema {
pub name: String,
pub version: String,
pub entities: Vec<String>,
pub operations: Vec<String>,
}
pub trait CatalogProvider: Send + Sync {
fn init(&mut self, storage: Arc<StorageManager>) -> CatalogResult<()>;
fn execute(&mut self, op: CatalogOperation) -> CatalogResult<CatalogResponse>;
fn execute_read_only(&self, op: CatalogOperation) -> CatalogResult<CatalogResponse> {
use super::error::CatalogError;
match op {
CatalogOperation::Query { .. } => {
Err(CatalogError::NotSupported(
"Read-only queries not yet implemented for this catalog. \
Consider implementing execute_read_only() for better concurrency."
.to_string(),
))
}
_ => Err(CatalogError::NotSupported(
"Only query operations are supported in read-only mode".to_string(),
)),
}
}
fn save(&self) -> CatalogResult<Vec<u8>>;
fn load(&mut self, data: &[u8]) -> CatalogResult<()>;
fn schema(&self) -> CatalogSchema;
fn supported_operations(&self) -> Vec<String>;
}