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
48impl 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}