Skip to main content

rust_ef_sqlite/
sync_ops.rs

1use rust_ef::error::{EFError, EFResult};
2use rust_ef::provider::DbValue;
3
4/// Synchronous execute logic shared by both connection modes (pooled / shared).
5pub(crate) fn execute_sync(
6    conn: &rusqlite::Connection,
7    sql: &str,
8    params: &[DbValue],
9) -> EFResult<u64> {
10    let rp = crate::type_conversion::to_rusqlite_params(params);
11    let refs: Vec<&dyn rusqlite::types::ToSql> = rp
12        .iter()
13        .map(|v| v as &dyn rusqlite::types::ToSql)
14        .collect();
15    conn.execute(sql, refs.as_slice())
16        .map(|c| c as u64)
17        .map_err(|e| EFError::query(format!("Execution error: {}", e)))
18}
19
20/// Synchronous query logic shared by both connection modes (pooled / shared).
21pub(crate) fn query_sync(
22    conn: &rusqlite::Connection,
23    sql: &str,
24    params: &[DbValue],
25) -> EFResult<Vec<Vec<DbValue>>> {
26    let rp = crate::type_conversion::to_rusqlite_params(params);
27    let refs: Vec<&dyn rusqlite::types::ToSql> = rp
28        .iter()
29        .map(|v| v as &dyn rusqlite::types::ToSql)
30        .collect();
31    let mut stmt = conn
32        .prepare_cached(sql)
33        .map_err(|e| EFError::query(format!("Prepare error: {}", e)))?;
34    let cc = stmt.column_count();
35    let rows = stmt
36        .query_map(refs.as_slice(), |row| {
37            let mut vals = Vec::with_capacity(cc);
38            for i in 0..cc {
39                let val = match row.get_ref(i) {
40                    Ok(rusqlite::types::ValueRef::Null) => DbValue::Null,
41                    Ok(rusqlite::types::ValueRef::Integer(n)) => DbValue::I64(n),
42                    Ok(rusqlite::types::ValueRef::Real(x)) => DbValue::F64(x),
43                    Ok(rusqlite::types::ValueRef::Text(bytes)) => {
44                        DbValue::String(String::from_utf8_lossy(bytes).into_owned())
45                    }
46                    Ok(rusqlite::types::ValueRef::Blob(bytes)) => DbValue::Bytes(bytes.to_vec()),
47                    Err(_) => DbValue::Null,
48                };
49                vals.push(val);
50            }
51            Ok(vals)
52        })
53        .map_err(|e| EFError::query(format!("Query error: {}", e)))?;
54    let mut result = Vec::new();
55    for row in rows {
56        result.push(row.map_err(|e| EFError::query(format!("Row read error: {}", e)))?);
57    }
58    Ok(result)
59}