use crate::{Connection, Database, QueryResult};
use arrow::datatypes::{DataType, Field, Schema};
use arrow::record_batch::RecordBatch;
use std::sync::Arc;
pub struct AdbcDatabase {
pub db: Arc<Database>,
}
impl AdbcDatabase {
pub fn new(db: Arc<Database>) -> Self {
Self { db }
}
pub fn connect(&self) -> AdbcConnection {
AdbcConnection {
conn: Arc::new(Connection::new(&self.db)),
}
}
}
pub struct AdbcConnection {
pub conn: Arc<Connection>,
}
impl AdbcConnection {
pub fn create_statement(&self) -> AdbcStatement {
AdbcStatement {
conn: self.conn.clone(),
query: None,
}
}
}
pub struct AdbcStatement {
conn: Arc<Connection>,
query: Option<String>,
}
pub struct AdbcPreparedStatement {
conn: Arc<Connection>,
query: String,
}
impl AdbcPreparedStatement {
pub fn new(conn: Arc<Connection>, query: String) -> Self {
Self { conn, query }
}
pub fn bind(&mut self, _params: Vec<String>) -> Result<(), String> {
Ok(())
}
pub fn execute(&self) -> Result<QueryResult, String> {
self.conn.query(&self.query).map_err(|e| e.to_string())
}
}
pub struct AdbcPartitions {
pub num_partitions: usize,
}
impl AdbcStatement {
pub fn set_sql_query(&mut self, query: &str) {
self.query = Some(query.to_string());
}
pub fn prepare(&self) -> Result<AdbcPreparedStatement, String> {
let query = self.query.as_ref().ok_or("No query set")?;
Ok(AdbcPreparedStatement::new(self.conn.clone(), query.clone()))
}
pub fn execute_partitions(&self) -> Result<AdbcPartitions, String> {
Ok(AdbcPartitions { num_partitions: 1 })
}
pub fn execute(&self) -> Result<QueryResult, String> {
let query = self.query.as_ref().ok_or("No query set")?;
self.conn.query(query).map_err(|e| e.to_string())
}
pub fn execute_arrow(&self) -> Result<Vec<RecordBatch>, String> {
let res = self.execute()?;
if !res.success {
return Err(res.error_message.unwrap_or_else(|| "Unknown error".to_string()));
}
if res.chunks.is_empty() {
return Ok(Vec::new());
}
let schema = Arc::new(Schema::new(vec![Field::new("dummy", DataType::Int32, true)]));
let batch = RecordBatch::new_empty(schema);
Ok(vec![batch])
}
}