use std::path::PathBuf;
use std::sync::Arc;
use async_trait::async_trait;
use crate::platform::error::PlatformError;
use crate::platform::model::{
CreateSimpleTableRequest, DbCapabilities, DescribeProjectDbConnectionRequest,
ProjectDbConnection, ProjectDbConnectionDescribeResult, ProjectDbConnectionQueryResult,
QueryProjectDbConnectionRequest, SimpleTableDefinition, UpdateSimpleTableRequest,
};
use crate::platform::services::CredentialService;
#[derive(Clone)]
pub struct DbDriverContext {
pub owner: String,
pub project: String,
pub data_root: PathBuf,
pub connection: ProjectDbConnection,
pub credentials: Arc<CredentialService>,
}
#[async_trait]
pub trait DbDriver: Send + Sync {
fn kind(&self) -> &'static str;
fn sql_dialect(&self) -> Option<crate::platform::db::sql_ddl::SqlDialect> {
None
}
fn type_catalog(&self) -> Vec<crate::platform::model::DbTypeDef> {
Vec::new()
}
fn capabilities(&self) -> DbCapabilities {
DbCapabilities::default()
}
async fn describe(
&self,
ctx: &DbDriverContext,
req: &DescribeProjectDbConnectionRequest,
) -> Result<ProjectDbConnectionDescribeResult, PlatformError>;
async fn query(
&self,
ctx: &DbDriverContext,
req: &QueryProjectDbConnectionRequest,
) -> Result<ProjectDbConnectionQueryResult, PlatformError>;
async fn create_table(
&self,
_ctx: &DbDriverContext,
_req: &CreateSimpleTableRequest,
) -> Result<SimpleTableDefinition, PlatformError> {
Err(PlatformError::new(
"PLATFORM_DB_DDL_UNSUPPORTED",
format!("'{}' cannot create tables", self.kind()),
))
}
async fn alter_table(
&self,
_ctx: &DbDriverContext,
_table: &str,
_req: &UpdateSimpleTableRequest,
) -> Result<SimpleTableDefinition, PlatformError> {
Err(PlatformError::new(
"PLATFORM_DB_DDL_UNSUPPORTED",
format!("'{}' cannot alter tables", self.kind()),
))
}
async fn insert_row(
&self,
_ctx: &DbDriverContext,
_table: &str,
_values: &serde_json::Map<String, serde_json::Value>,
) -> Result<serde_json::Value, PlatformError> {
Err(PlatformError::new(
"PLATFORM_DB_ROW_UNSUPPORTED",
format!("'{}' cannot add rows", self.kind()),
))
}
async fn drop_table(&self, _ctx: &DbDriverContext, _table: &str) -> Result<(), PlatformError> {
Err(PlatformError::new(
"PLATFORM_DB_DDL_UNSUPPORTED",
format!("'{}' cannot drop tables", self.kind()),
))
}
}