use std::ffi::CString;
use std::os::raw::c_char;
use std::sync::Arc;
use crate::api::database::DatabaseInner;
use crate::api::transaction::Transaction;
use crate::api::{Database, Rows, Statement};
#[repr(C)]
pub struct StoolapValue {
pub value_type: i32,
pub _padding: i32,
pub v: StoolapValueData,
}
#[repr(C)]
pub union StoolapValueData {
pub integer: i64,
pub float64: f64,
pub boolean: i32,
pub text: StoolapTextData,
pub blob: StoolapBlobData,
pub timestamp_nanos: i64,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct StoolapTextData {
pub ptr: *const c_char,
pub len: i64,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct StoolapBlobData {
pub ptr: *const u8,
pub len: i64,
}
pub struct StoolapDB {
pub(crate) db: Database,
pub(crate) last_error: Option<CString>,
pub(crate) _engine_keepalive: Option<Arc<DatabaseInner>>,
}
pub struct StoolapStmt {
pub(crate) stmt: Statement,
pub(crate) last_error: Option<CString>,
pub(crate) sql_cstr: CString,
pub(crate) cached_columns: Option<Arc<Vec<CString>>>,
pub(crate) _db_keepalive: Arc<DatabaseInner>,
pub(crate) _engine_keepalive: Option<Arc<DatabaseInner>>,
}
pub struct StoolapTx {
pub(crate) tx: Option<Transaction>,
pub(crate) last_error: Option<CString>,
pub(crate) _db_keepalive: Arc<DatabaseInner>,
pub(crate) _engine_keepalive: Option<Arc<DatabaseInner>>,
}
pub struct StoolapRows {
pub(crate) rows: Option<Rows>,
pub(crate) has_row: bool,
pub(crate) last_error: Option<CString>,
pub(crate) column_names: Arc<Vec<CString>>,
pub(crate) text_cache: Vec<Option<Vec<u8>>>,
pub(crate) text_cache_dirty: bool,
pub(crate) rows_affected: i64,
}
impl StoolapDB {
pub(crate) fn set_error(&mut self, msg: &str) {
let sanitized = msg.replace('\0', "\\0");
self.last_error = CString::new(sanitized).ok();
}
pub(crate) fn error_ptr(&self) -> *const c_char {
match &self.last_error {
Some(cs) => cs.as_ptr(),
None => super::error::empty_cstr(),
}
}
}
impl StoolapStmt {
pub(crate) fn set_error(&mut self, msg: &str) {
let sanitized = msg.replace('\0', "\\0");
self.last_error = CString::new(sanitized).ok();
}
pub(crate) fn error_ptr(&self) -> *const c_char {
match &self.last_error {
Some(cs) => cs.as_ptr(),
None => super::error::empty_cstr(),
}
}
}
impl StoolapTx {
pub(crate) fn set_error(&mut self, msg: &str) {
let sanitized = msg.replace('\0', "\\0");
self.last_error = CString::new(sanitized).ok();
}
pub(crate) fn error_ptr(&self) -> *const c_char {
match &self.last_error {
Some(cs) => cs.as_ptr(),
None => super::error::empty_cstr(),
}
}
}
impl StoolapRows {
pub(crate) fn set_error(&mut self, msg: &str) {
let sanitized = msg.replace('\0', "\\0");
self.last_error = CString::new(sanitized).ok();
}
pub(crate) fn error_ptr(&self) -> *const c_char {
match &self.last_error {
Some(cs) => cs.as_ptr(),
None => super::error::empty_cstr(),
}
}
}