1#![expect(non_snake_case, non_camel_case_types)]
2#![cfg_attr(not(test), no_std)]
3pub use self::error::*;
4
5use core::mem;
6use core::sync::atomic::{AtomicI32, Ordering};
7
8mod error;
9
10#[must_use]
11pub fn SQLITE_STATIC() -> sqlite3_destructor_type {
12 None
13}
14
15#[must_use]
16pub fn SQLITE_TRANSIENT() -> sqlite3_destructor_type {
17 Some(unsafe { mem::transmute::<isize, unsafe extern "C" fn(*mut core::ffi::c_void)>(-1_isize) })
18}
19
20#[allow(dead_code, clippy::all)]
21mod bindings {
22 include!(concat!(env!("OUT_DIR"), "/bindgen.rs"));
23}
24pub use bindings::*;
25
26#[cfg(all(feature = "remote", not(target_arch = "wasm32")))]
27mod remote {
28 use core::ffi::{c_char, c_int};
29
30 #[repr(C)]
31 pub struct DoltliteServer {
32 _private: [u8; 0],
33 }
34
35 #[repr(C)]
36 pub struct DoltliteServeOpts {
37 pub zDir: *const c_char,
38 pub port: c_int,
39 pub zBindAddr: *const c_char,
40 pub certFile: *const c_char,
41 pub keyFile: *const c_char,
42 pub authKeysDir: *const c_char,
43 pub audience: *const c_char,
44 }
45
46 unsafe extern "C" {
47 pub fn doltliteServe(
48 directory: *const c_char,
49 port: c_int,
50 bind_address: *const c_char,
51 ) -> c_int;
52
53 pub fn doltliteServeAsync(
54 directory: *const c_char,
55 port: c_int,
56 bind_address: *const c_char,
57 ) -> *mut DoltliteServer;
58
59 pub fn doltliteServeOpts(options: *const DoltliteServeOpts) -> c_int;
60
61 pub fn doltliteServeAsyncOpts(options: *const DoltliteServeOpts) -> *mut DoltliteServer;
62
63 pub fn doltliteServerStop(server: *mut DoltliteServer);
64
65 pub fn doltliteServerPort(server: *mut DoltliteServer) -> c_int;
66 }
67}
68
69#[cfg(all(feature = "remote", not(target_arch = "wasm32")))]
70pub use remote::*;
71
72unsafe extern "C" {
73 fn doltliteInstallAutoExt() -> core::ffi::c_int;
74}
75
76static DOLTLITE_INIT_RESULT: AtomicI32 = AtomicI32::new(i32::MIN);
77
78pub fn initialize_doltlite() -> core::ffi::c_int {
79 let existing = DOLTLITE_INIT_RESULT.load(Ordering::Acquire);
80 if existing != i32::MIN {
81 return existing;
82 }
83
84 let result = unsafe { doltliteInstallAutoExt() };
85 match DOLTLITE_INIT_RESULT.compare_exchange(
86 i32::MIN,
87 result,
88 Ordering::AcqRel,
89 Ordering::Acquire,
90 ) {
91 Ok(_) => result,
92 Err(previous) => previous,
93 }
94}
95
96impl Default for sqlite3_vtab {
97 fn default() -> Self {
98 unsafe { mem::zeroed() }
99 }
100}
101
102impl Default for sqlite3_vtab_cursor {
103 fn default() -> Self {
104 unsafe { mem::zeroed() }
105 }
106}