Skip to main content

libpqlite3_sys/
lib.rs

1// PQLite - Post-Quantum SQLite
2// Copyright (c) 2025-2026 Dyber, Inc. All rights reserved.
3//
4// Low-level FFI bindings to libpqlite3.
5// For a safe Rust API, use the `pqlite` crate instead.
6//
7// PQLite is a product of Dyber, Inc.
8
9#![allow(non_camel_case_types, non_upper_case_globals, non_snake_case)]
10
11use std::os::raw::{c_char, c_int, c_void, c_double};
12
13// Opaque types
14pub enum sqlite3 {}
15pub enum sqlite3_stmt {}
16pub enum sqlite3_context {}
17pub enum sqlite3_value {}
18
19// Standard SQLite C API (subset)
20extern "C" {
21    pub fn sqlite3_open(filename: *const c_char, ppDb: *mut *mut sqlite3) -> c_int;
22    pub fn sqlite3_open_v2(
23        filename: *const c_char,
24        ppDb: *mut *mut sqlite3,
25        flags: c_int,
26        zVfs: *const c_char,
27    ) -> c_int;
28    pub fn sqlite3_close(db: *mut sqlite3) -> c_int;
29    pub fn sqlite3_close_v2(db: *mut sqlite3) -> c_int;
30
31    pub fn sqlite3_exec(
32        db: *mut sqlite3,
33        sql: *const c_char,
34        callback: Option<extern "C" fn(*mut c_void, c_int, *mut *mut c_char, *mut *mut c_char) -> c_int>,
35        arg: *mut c_void,
36        errmsg: *mut *mut c_char,
37    ) -> c_int;
38
39    pub fn sqlite3_prepare_v2(
40        db: *mut sqlite3,
41        sql: *const c_char,
42        nByte: c_int,
43        ppStmt: *mut *mut sqlite3_stmt,
44        pzTail: *mut *const c_char,
45    ) -> c_int;
46
47    pub fn sqlite3_step(stmt: *mut sqlite3_stmt) -> c_int;
48    pub fn sqlite3_finalize(stmt: *mut sqlite3_stmt) -> c_int;
49    pub fn sqlite3_reset(stmt: *mut sqlite3_stmt) -> c_int;
50
51    pub fn sqlite3_column_count(stmt: *mut sqlite3_stmt) -> c_int;
52    pub fn sqlite3_column_type(stmt: *mut sqlite3_stmt, iCol: c_int) -> c_int;
53    pub fn sqlite3_column_int(stmt: *mut sqlite3_stmt, iCol: c_int) -> c_int;
54    pub fn sqlite3_column_int64(stmt: *mut sqlite3_stmt, iCol: c_int) -> i64;
55    pub fn sqlite3_column_double(stmt: *mut sqlite3_stmt, iCol: c_int) -> c_double;
56    pub fn sqlite3_column_text(stmt: *mut sqlite3_stmt, iCol: c_int) -> *const c_char;
57    pub fn sqlite3_column_blob(stmt: *mut sqlite3_stmt, iCol: c_int) -> *const c_void;
58    pub fn sqlite3_column_bytes(stmt: *mut sqlite3_stmt, iCol: c_int) -> c_int;
59
60    pub fn sqlite3_bind_int(stmt: *mut sqlite3_stmt, idx: c_int, val: c_int) -> c_int;
61    pub fn sqlite3_bind_int64(stmt: *mut sqlite3_stmt, idx: c_int, val: i64) -> c_int;
62    pub fn sqlite3_bind_double(stmt: *mut sqlite3_stmt, idx: c_int, val: c_double) -> c_int;
63    pub fn sqlite3_bind_text(
64        stmt: *mut sqlite3_stmt,
65        idx: c_int,
66        val: *const c_char,
67        n: c_int,
68        destructor: Option<extern "C" fn(*mut c_void)>,
69    ) -> c_int;
70    pub fn sqlite3_bind_blob(
71        stmt: *mut sqlite3_stmt,
72        idx: c_int,
73        val: *const c_void,
74        n: c_int,
75        destructor: Option<extern "C" fn(*mut c_void)>,
76    ) -> c_int;
77    pub fn sqlite3_bind_null(stmt: *mut sqlite3_stmt, idx: c_int) -> c_int;
78
79    pub fn sqlite3_errmsg(db: *mut sqlite3) -> *const c_char;
80    pub fn sqlite3_errcode(db: *mut sqlite3) -> c_int;
81    pub fn sqlite3_libversion() -> *const c_char;
82    pub fn sqlite3_free(ptr: *mut c_void);
83}
84
85// SQLite constants
86pub const SQLITE_OK: c_int = 0;
87pub const SQLITE_ERROR: c_int = 1;
88pub const SQLITE_ROW: c_int = 100;
89pub const SQLITE_DONE: c_int = 101;
90pub const SQLITE_OPEN_READWRITE: c_int = 0x00000002;
91pub const SQLITE_OPEN_CREATE: c_int = 0x00000004;
92pub const SQLITE_OPEN_URI: c_int = 0x00000040;
93pub const SQLITE_TRANSIENT: Option<extern "C" fn(*mut c_void)> = None; // Actually -1 cast
94
95pub const SQLITE_INTEGER: c_int = 1;
96pub const SQLITE_FLOAT: c_int = 2;
97pub const SQLITE_TEXT: c_int = 3;
98pub const SQLITE_BLOB: c_int = 4;
99pub const SQLITE_NULL: c_int = 5;