use std::ffi::CStr;
use crate::ffi::{
duckdb_appender, duckdb_appender_destroy, duckdb_appender_error, duckdb_arrow,
duckdb_destroy_arrow, duckdb_destroy_prepare, duckdb_destroy_result, duckdb_prepare_error,
duckdb_prepared_statement, duckdb_query_arrow_error, duckdb_result, duckdb_result_error,
duckdb_state, DuckDBSuccess, Error as FFIError,
};
use crate::error::{Error, Result};
#[inline]
fn error_from_duckdb_code(
code: duckdb_state,
message: Option<String>,
) -> Result<()> {
Err(Error::DuckDBFailure(FFIError::new(code), message))
}
#[cold]
#[inline]
pub fn result_from_duckdb_appender(
code: duckdb_state,
appender: *mut duckdb_appender,
) -> Result<()> {
if code == DuckDBSuccess {
return Ok(());
}
unsafe {
let message = if (*appender).is_null() {
Some("appender is null".to_string())
} else {
let c_err = duckdb_appender_error(*appender);
let message = Some(CStr::from_ptr(c_err).to_string_lossy().to_string());
duckdb_appender_destroy(appender);
message
};
error_from_duckdb_code(code, message)
}
}
#[cold]
#[inline]
pub fn result_from_duckdb_prepare(
code: duckdb_state,
mut prepare: duckdb_prepared_statement,
) -> Result<()> {
if code == DuckDBSuccess {
return Ok(());
}
unsafe {
let message = if prepare.is_null() {
Some("prepare is null".to_string())
} else {
let c_err = duckdb_prepare_error(prepare);
let message = Some(CStr::from_ptr(c_err).to_string_lossy().to_string());
duckdb_destroy_prepare(&mut prepare);
message
};
error_from_duckdb_code(code, message)
}
}
#[allow(unused)]
#[cold]
#[inline]
pub fn result_from_duckdb_arrow(
code: duckdb_state,
mut out: duckdb_arrow,
) -> Result<()> {
if code == DuckDBSuccess {
return Ok(());
}
unsafe {
let message = if out.is_null() {
Some("out arrow is null".to_string())
} else {
let c_err = duckdb_query_arrow_error(out);
let message = Some(CStr::from_ptr(c_err).to_string_lossy().to_string());
duckdb_destroy_arrow(&mut out);
message
};
error_from_duckdb_code(code, message)
}
}
#[cold]
#[inline]
pub fn result_from_duckdb_result(
code: duckdb_state,
out: *mut duckdb_result,
) -> Result<()> {
if code == DuckDBSuccess {
return Ok(());
}
unsafe {
let message = {
let c_err = duckdb_result_error(out);
let message = Some(CStr::from_ptr(c_err).to_string_lossy().to_string());
duckdb_destroy_result(out);
message
};
error_from_duckdb_code(code, message)
}
}