use std::ffi::{CStr, CString};
use libduckdb_sys::{duckdb_connection, duckdb_query, duckdb_result, DuckDBSuccess, duckdb_result_error, duckdb_destroy_result};
use quack_rs::prelude::{Connection, ExtensionError};
pub fn register_sql_macro_str(c: &Connection, sql: &str) -> Result<(), ExtensionError> {
unsafe { execute_sql(c.as_raw_connection(), sql) }
}
unsafe fn execute_sql(con: duckdb_connection, sql: &str) -> Result<(), ExtensionError> {
let c_sql = CString::new(sql)
.map_err(|_| ExtensionError::new("SQL statement contains interior null bytes"))?;
let mut result: duckdb_result = unsafe { std::mem::zeroed() };
let rc = unsafe { duckdb_query(con, c_sql.as_ptr(), &raw mut result) };
let outcome = if rc == DuckDBSuccess {
Ok(())
} else {
let ptr = unsafe { duckdb_result_error(&raw mut result) };
let msg = if ptr.is_null() {
"DuckDB macro registration failed (no error message available)".to_string()
} else {
unsafe { CStr::from_ptr(ptr) }
.to_string_lossy()
.into_owned()
};
Err(ExtensionError::new(msg))
};
unsafe { duckdb_destroy_result(&raw mut result) };
outcome
}