sql_middleware/sqlite/
params.rs1use std::fmt::Write;
2
3use rusqlite;
4
5use crate::middleware::{ConversionMode, ParamConverter, RowValues, SqlMiddlewareDbError};
6
7thread_local! {
9 static TIMESTAMP_BUF: std::cell::RefCell<String> = std::cell::RefCell::new(String::with_capacity(32));
10}
11
12#[must_use]
14pub fn row_value_to_sqlite_value(value: &RowValues, for_execute: bool) -> rusqlite::types::Value {
15 match value {
16 RowValues::Int(i) => rusqlite::types::Value::Integer(*i),
17 RowValues::Float(f) => rusqlite::types::Value::Real(*f),
18 RowValues::Text(s) => {
19 if for_execute {
20 rusqlite::types::Value::Text(s.clone())
22 } else {
23 rusqlite::types::Value::Text(s.clone())
25 }
26 }
27 RowValues::Bool(b) => rusqlite::types::Value::Integer(i64::from(*b)),
28 RowValues::Timestamp(dt) => {
30 TIMESTAMP_BUF.with(|buf| {
32 let mut borrow = buf.borrow_mut();
33 borrow.clear();
34 write!(borrow, "{}", dt.format("%F %T%.f")).unwrap();
36 rusqlite::types::Value::Text(borrow.clone())
37 })
38 }
39 RowValues::Null => rusqlite::types::Value::Null,
40 RowValues::JSON(jval) => {
41 let json_str = jval.to_string();
43 rusqlite::types::Value::Text(json_str)
44 }
45 RowValues::Blob(bytes) => {
46 if for_execute {
47 rusqlite::types::Value::Blob(bytes.clone())
49 } else {
50 rusqlite::types::Value::Blob(bytes.clone())
51 }
52 }
53 }
54}
55
56pub struct Params(pub Vec<rusqlite::types::Value>);
58
59impl Params {
60 pub fn convert(params: &[RowValues]) -> Result<Self, SqlMiddlewareDbError> {
66 let mut vec_values = Vec::with_capacity(params.len());
67 for p in params {
68 vec_values.push(row_value_to_sqlite_value(p, true));
69 }
70 Ok(Params(vec_values))
71 }
72
73 #[must_use]
75 pub fn as_values(&self) -> &[rusqlite::types::Value] {
76 &self.0
77 }
78
79 #[must_use]
81 pub fn as_refs(&self) -> Vec<&dyn rusqlite::ToSql> {
82 self.0.iter().map(|v| v as &dyn rusqlite::ToSql).collect()
83 }
84}
85
86impl ParamConverter<'_> for Params {
87 type Converted = Params;
88
89 fn convert_sql_params(
90 params: &[RowValues],
91 _mode: ConversionMode,
92 ) -> Result<Self::Converted, SqlMiddlewareDbError> {
93 Self::convert(params)
94 }
95
96 fn supports_mode(mode: ConversionMode) -> bool {
97 matches!(mode, ConversionMode::Query | ConversionMode::Execute)
99 }
100}