#![allow(unused, reason = "Includes autogenerated bindings")]
#![allow(non_snake_case, reason = "Includes autogenerated bindings")]
#![allow(non_camel_case_types, reason = "Includes autogenerated bindings")]
include!("bindgen.rs");
extern "C" {
#[doc(hidden)]
pub fn sqlite3_transient() -> sqlite3_destructor_type;
}
#[doc(hidden)]
pub unsafe fn sqlite3_last_error(retval: i32, database: *mut sqlite3) -> crate::error::Error {
use std::{borrow::Cow, ffi::CStr};
let error = sqlite3_errstr(retval);
let mut message = match error.is_null() {
true => Cow::Borrowed("Unknown"),
false => CStr::from_ptr(error).to_string_lossy(),
};
if !database.is_null() {
let error = sqlite3_errmsg(database);
let message_ = CStr::from_ptr(error).to_string_lossy();
message = Cow::Owned(format!("{message} ({message_})"));
}
crate::err!("SQLite error: {message}")
}
#[doc(hidden)]
#[inline]
pub unsafe fn sqlite3_check_result(retval: i32, database: *mut sqlite3) -> Result<(), crate::error::Error> {
match retval {
SQLITE_OK => Ok(()),
_ => Err(sqlite3_last_error(retval, database)),
}
}
#[test]
fn assert_threadsafe() {
let threadsafe = unsafe { sqlite3_threadsafe() };
assert_ne!(threadsafe, 0, "sqlite is not compiled threadsafe?!")
}