sql_middleware/sqlite/
query.rs1use deadpool_sqlite::rusqlite;
2use rusqlite::types::Value;
3use rusqlite::{Statement, ToSql};
4
5use crate::middleware::{ResultSet, RowValues, SqlMiddlewareDbError};
6
7pub fn sqlite_extract_value_sync(
9 row: &rusqlite::Row,
10 idx: usize,
11) -> Result<RowValues, SqlMiddlewareDbError> {
12 let val_ref_res = row.get_ref(idx);
13 match val_ref_res {
14 Err(e) => Err(SqlMiddlewareDbError::SqliteError(e)),
15 Ok(rusqlite::types::ValueRef::Null) => Ok(RowValues::Null),
16 Ok(rusqlite::types::ValueRef::Integer(i)) => Ok(RowValues::Int(i)),
17 Ok(rusqlite::types::ValueRef::Real(f)) => Ok(RowValues::Float(f)),
18 Ok(rusqlite::types::ValueRef::Text(bytes)) => {
19 if bytes.is_ascii() {
21 let s = String::from_utf8_lossy(bytes).into_owned();
23 Ok(RowValues::Text(s))
24 } else {
25 let s = String::from_utf8_lossy(bytes).into_owned();
27 Ok(RowValues::Text(s))
28 }
29 }
30 Ok(rusqlite::types::ValueRef::Blob(b)) => Ok(RowValues::Blob(b.to_vec())),
31 }
32}
33
34pub fn build_result_set(
41 stmt: &mut Statement,
42 params: &[Value],
43) -> Result<ResultSet, SqlMiddlewareDbError> {
44 let param_refs: Vec<&dyn ToSql> = params.iter().map(|v| v as &dyn ToSql).collect();
45 let column_names: Vec<String> = stmt
46 .column_names()
47 .iter()
48 .map(std::string::ToString::to_string)
49 .collect();
50
51 let column_names_rc = std::sync::Arc::new(column_names);
53
54 let mut rows_iter = stmt.query(¶m_refs[..])?;
55 let mut result_set = ResultSet::with_capacity(10);
57 result_set.set_column_names(column_names_rc);
58
59 while let Some(row) = rows_iter.next()? {
60 let mut row_values = Vec::new();
61
62 let col_count = result_set
63 .get_column_names()
64 .ok_or_else(|| {
65 SqlMiddlewareDbError::ExecutionError("No column names available".to_string())
66 })?
67 .len();
68
69 for i in 0..col_count {
70 let value = sqlite_extract_value_sync(row, i)?;
71 row_values.push(value);
72 }
73
74 result_set.add_row_values(row_values);
75 }
76
77 Ok(result_set)
78}