use core::ffi::c_void;
use libduckdb_sys::{duckdb_connection, duckdb_database, duckdb_delete_callback_t};
use crate::aggregate::{AggregateFunctionBuilder, AggregateFunctionSetBuilder};
use crate::cast::CastFunctionBuilder;
#[cfg(feature = "duckdb-1-5")]
use crate::copy_function::CopyFunctionBuilder;
use crate::error::ExtensionError;
use crate::replacement_scan::{ReplacementScanBuilder, ReplacementScanFn};
use crate::scalar::{ScalarFunctionBuilder, ScalarFunctionSetBuilder};
use crate::sql_macro::SqlMacro;
use crate::table::TableFunctionBuilder;
pub trait Registrar {
unsafe fn register_scalar(&self, builder: ScalarFunctionBuilder) -> Result<(), ExtensionError>;
unsafe fn register_scalar_set(
&self,
builder: ScalarFunctionSetBuilder,
) -> Result<(), ExtensionError>;
unsafe fn register_aggregate(
&self,
builder: AggregateFunctionBuilder,
) -> Result<(), ExtensionError>;
unsafe fn register_aggregate_set(
&self,
builder: AggregateFunctionSetBuilder,
) -> Result<(), ExtensionError>;
unsafe fn register_table(&self, builder: TableFunctionBuilder) -> Result<(), ExtensionError>;
unsafe fn register_sql_macro(&self, sql_macro: SqlMacro) -> Result<(), ExtensionError>;
unsafe fn register_cast(&self, builder: CastFunctionBuilder) -> Result<(), ExtensionError>;
#[cfg(feature = "duckdb-1-5")]
unsafe fn register_copy_function(
&self,
builder: CopyFunctionBuilder,
) -> Result<(), ExtensionError>;
}
pub struct Connection {
con: duckdb_connection,
db: duckdb_database,
}
impl Connection {
#[inline]
pub(crate) const unsafe fn from_raw(con: duckdb_connection, db: duckdb_database) -> Self {
Self { con, db }
}
#[inline]
pub const fn as_raw_connection(&self) -> duckdb_connection {
self.con
}
#[inline]
pub const fn as_raw_database(&self) -> duckdb_database {
self.db
}
pub unsafe fn register_replacement_scan(
&self,
callback: ReplacementScanFn,
extra_data: *mut c_void,
delete_callback: duckdb_delete_callback_t,
) {
unsafe {
ReplacementScanBuilder::register(self.db, callback, extra_data, delete_callback);
}
}
pub unsafe fn register_replacement_scan_with_data<T: 'static>(
&self,
callback: ReplacementScanFn,
data: T,
) {
unsafe {
ReplacementScanBuilder::register_with_data(self.db, callback, data);
}
}
}
impl Registrar for Connection {
unsafe fn register_scalar(&self, builder: ScalarFunctionBuilder) -> Result<(), ExtensionError> {
unsafe { builder.register(self.con) }
}
unsafe fn register_scalar_set(
&self,
builder: ScalarFunctionSetBuilder,
) -> Result<(), ExtensionError> {
unsafe { builder.register(self.con) }
}
unsafe fn register_aggregate(
&self,
builder: AggregateFunctionBuilder,
) -> Result<(), ExtensionError> {
unsafe { builder.register(self.con) }
}
unsafe fn register_aggregate_set(
&self,
builder: AggregateFunctionSetBuilder,
) -> Result<(), ExtensionError> {
unsafe { builder.register(self.con) }
}
unsafe fn register_table(&self, builder: TableFunctionBuilder) -> Result<(), ExtensionError> {
unsafe { builder.register(self.con) }
}
unsafe fn register_sql_macro(&self, sql_macro: SqlMacro) -> Result<(), ExtensionError> {
unsafe { sql_macro.register(self.con) }
}
unsafe fn register_cast(&self, builder: CastFunctionBuilder) -> Result<(), ExtensionError> {
unsafe { builder.register(self.con) }
}
#[cfg(feature = "duckdb-1-5")]
unsafe fn register_copy_function(
&self,
builder: CopyFunctionBuilder,
) -> Result<(), ExtensionError> {
unsafe { builder.register(self.con) }
}
}