Skip to main content

libdoltlite_sys/
lib.rs

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}