#![allow(dead_code)]
use anyhow::Result;
use ormada_schema::TableSchema;
pub trait DatabaseIntrospector {
fn get_tables(&self) -> Result<Vec<String>>;
fn get_table_schema(&self, table: &str) -> Result<TableSchema>;
fn get_all_schemas(&self) -> Result<Vec<TableSchema>> {
let tables = self.get_tables()?;
tables.iter().map(|t| self.get_table_schema(t)).collect()
}
}
pub struct PostgresIntrospector {
}
impl PostgresIntrospector {
#[allow(dead_code)]
pub fn new(_connection_string: &str) -> Result<Self> {
Ok(Self {})
}
}
impl DatabaseIntrospector for PostgresIntrospector {
fn get_tables(&self) -> Result<Vec<String>> {
Ok(Vec::new())
}
fn get_table_schema(&self, table: &str) -> Result<TableSchema> {
Ok(TableSchema::new(table))
}
}
pub struct SqliteIntrospector {
}
impl SqliteIntrospector {
#[allow(dead_code)]
pub fn new(_path: &str) -> Result<Self> {
Ok(Self {})
}
}
impl DatabaseIntrospector for SqliteIntrospector {
fn get_tables(&self) -> Result<Vec<String>> {
Ok(Vec::new())
}
fn get_table_schema(&self, table: &str) -> Result<TableSchema> {
Ok(TableSchema::new(table))
}
}
#[allow(dead_code)]
pub fn create_introspector(database_url: &str) -> Result<Box<dyn DatabaseIntrospector>> {
if database_url.starts_with("postgres://") || database_url.starts_with("postgresql://") {
Ok(Box::new(PostgresIntrospector::new(database_url)?))
} else if database_url.starts_with("sqlite://") || database_url.ends_with(".db") {
Ok(Box::new(SqliteIntrospector::new(database_url)?))
} else {
anyhow::bail!("Unsupported database URL: {}", database_url)
}
}