// Internal utilities pub(crate) mod param_cache; mod small_cstr; pub(crate) use param_cache::ParamIndexCache; pub(crate) use small_cstr::SmallCString; // Doesn't use any modern features or vtab stuff, but is only used by them. mod sqlite_string; pub(crate) use sqlite_string::{alloc, SqliteMallocString}; #[cfg(any( feature = "collation", feature = "functions", feature = "vtab", feature = "pointer" ))] pub(crate) unsafe extern "C" fn free_boxed_value(p: *mut std::ffi::c_void) { drop(Box::from_raw(p.cast::())); } use crate::Result; use std::ffi::CStr; pub enum Named<'a> { Small(SmallCString), C(&'a CStr), } impl std::ops::Deref for Named<'_> { type Target = CStr; #[inline] fn deref(&self) -> &CStr { match self { Named::Small(s) => s.as_cstr(), Named::C(s) => s, } } } /// Database, table, column, collation, function, module, vfs name pub trait Name: std::fmt::Debug { /// As C string fn as_cstr(&self) -> Result>; } impl Name for &str { fn as_cstr(&self) -> Result> { let ss = SmallCString::new(self)?; Ok(Named::Small(ss)) } } impl Name for &CStr { #[inline] fn as_cstr(&self) -> Result> { Ok(Named::C(self)) } }