use super::*;
use std::{
mem::transmute,
ops::Deref,
os::raw::{c_char, c_int},
};
type CEntry = unsafe extern "C" fn(
db: *mut ffi::sqlite3,
err_msg: *mut *mut c_char,
api: *mut ffi::sqlite3_api_routines,
) -> c_int;
#[repr(C)]
pub struct Extension {
c_entry: unsafe extern "C" fn(),
init: fn(&Connection) -> Result<()>,
}
impl Extension {
pub const fn new(c_entry: CEntry, init: fn(&Connection) -> Result<()>) -> Self {
unsafe {
Extension {
c_entry: transmute::<CEntry, unsafe extern "C" fn()>(c_entry),
init,
}
}
}
pub fn register_auto(&'static self) -> Result<()> {
sqlite3_require_version!(3_008_007, unsafe {
Error::from_sqlite(ffi::sqlite3_auto_extension(Some(self.c_entry)))
})
}
pub fn reset_auto() {
sqlite3_match_version! {
3_008_007 => unsafe { ffi::sqlite3_reset_auto_extension() },
_ => (),
}
}
pub fn cancel_auto(&'static self) -> Result<bool> {
sqlite3_require_version!(3_008_007, unsafe {
Ok(ffi::sqlite3_cancel_auto_extension(Some(self.c_entry)) != 0)
})
}
}
impl Deref for Extension {
type Target = fn(&Connection) -> Result<()>;
fn deref(&self) -> &Self::Target {
&self.init
}
}