libsql_sys/
value.rs

1#![allow(clippy::missing_safety_doc)]
2
3use std::str::FromStr;
4
5#[derive(Debug)]
6pub enum ValueType {
7    Integer = 1,
8    Real,
9    Text,
10    Blob,
11    Null,
12}
13
14impl FromStr for ValueType {
15    type Err = ();
16
17    fn from_str(s: &str) -> Result<ValueType, Self::Err> {
18        match s {
19            "TEXT" => Ok(ValueType::Text),
20            "INTEGER" => Ok(ValueType::Integer),
21            "BLOB" => Ok(ValueType::Blob),
22            "NULL" => Ok(ValueType::Null),
23            "REAL" => Ok(ValueType::Real),
24            _ => Err(()),
25        }
26    }
27}
28
29impl TryFrom<i32> for ValueType {
30    type Error = ();
31
32    fn try_from(value: i32) -> Result<Self, Self::Error> {
33        match value {
34            crate::ffi::SQLITE_INTEGER => Ok(ValueType::Integer),
35            crate::ffi::SQLITE_FLOAT => Ok(ValueType::Real),
36            crate::ffi::SQLITE_BLOB => Ok(ValueType::Blob),
37            crate::ffi::SQLITE_TEXT => Ok(ValueType::Text),
38            crate::ffi::SQLITE_NULL => Ok(ValueType::Null),
39            _ => Err(()),
40        }
41    }
42}
43
44pub struct Value {
45    pub raw_value: *mut crate::ffi::sqlite3_value,
46}
47
48/* Reference from docs:
49sqlite3_value_blob	→	BLOB value
50sqlite3_value_double	→	REAL value
51sqlite3_value_int	→	32-bit INTEGER value
52sqlite3_value_int64	→	64-bit INTEGER value
53sqlite3_value_pointer	→	Pointer value
54sqlite3_value_text	→	UTF-8 TEXT value
55sqlite3_value_text16	→	UTF-16 TEXT value in the native byteorder
56sqlite3_value_text16be	→	UTF-16be TEXT value
57sqlite3_value_text16le	→	UTF-16le TEXT value
58
59sqlite3_value_bytes	→	Size of a BLOB or a UTF-8 TEXT in bytes
60sqlite3_value_bytes16  	→  	Size of UTF-16 TEXT in bytes
61sqlite3_value_type	→	Default datatype of the value
62sqlite3_value_numeric_type  	→  	Best numeric datatype of the value
63sqlite3_value_nochange  	→  	True if the column is unchanged in an UPDATE against a virtual table.
64sqlite3_value_frombind  	→  	True if value originated from a bound parameter
65*/
66
67impl Value {
68    pub fn value_type(&self) -> ValueType {
69        let raw_type = unsafe { crate::ffi::sqlite3_value_type(self.raw_value) };
70        ValueType::try_from(raw_type).expect("invalid value type")
71    }
72
73    pub fn int(&self) -> i32 {
74        unsafe { crate::ffi::sqlite3_value_int(self.raw_value) }
75    }
76
77    pub fn text(&self) -> *const u8 {
78        unsafe { crate::ffi::sqlite3_value_text(self.raw_value) }
79    }
80
81    pub fn bytes(&self) -> i32 {
82        unsafe { crate::ffi::sqlite3_value_bytes(self.raw_value) }
83    }
84
85    pub fn bytes16(&self) -> i32 {
86        unsafe { crate::ffi::sqlite3_value_bytes16(self.raw_value) }
87    }
88
89    pub fn double(&self) -> f64 {
90        unsafe { crate::ffi::sqlite3_value_double(self.raw_value) }
91    }
92
93    pub fn int64(&self) -> i64 {
94        unsafe { crate::ffi::sqlite3_value_int64(self.raw_value) }
95    }
96
97    pub fn pointer(&self) -> *mut std::ffi::c_void {
98        unsafe { crate::ffi::sqlite3_value_pointer(self.raw_value, std::ptr::null()) }
99    }
100
101    pub fn numeric_type(&self) -> i32 {
102        unsafe { crate::ffi::sqlite3_value_numeric_type(self.raw_value) }
103    }
104
105    pub fn nochange(&self) -> bool {
106        unsafe { crate::ffi::sqlite3_value_nochange(self.raw_value) != 0 }
107    }
108
109    pub fn frombind(&self) -> bool {
110        unsafe { crate::ffi::sqlite3_value_frombind(self.raw_value) != 0 }
111    }
112
113    pub fn blob(&self) -> *const std::ffi::c_void {
114        unsafe { crate::ffi::sqlite3_value_blob(self.raw_value) }
115    }
116}