rust_ef_sqlite/
sync_ops.rs1use rust_ef::error::{EFError, EFResult};
2use rust_ef::provider::DbValue;
3
4pub(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
20pub(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}