wick_sql/sqlx/
sqlite.rs

1mod serialize;
2use sqlx::sqlite::SqlitePoolOptions;
3use sqlx::{Sqlite, SqlitePool};
4use wick_config::config::components::SqlComponentConfig;
5
6pub(crate) use self::serialize::*;
7use crate::common::sql_wrapper::ConvertedType;
8use crate::Error;
9
10pub(crate) async fn connect(_config: &SqlComponentConfig, addr: Option<&str>) -> Result<SqlitePool, Error> {
11  let addr = addr.unwrap_or(":memory:");
12  debug!(%addr, "connecting to sqlite");
13
14  let pool = SqlitePoolOptions::new()
15    .max_connections(5)
16    .connect(addr)
17    .await
18    .map_err(|e| Error::SqliteConnect(e.to_string()))?;
19  Ok(pool)
20}
21
22#[allow(clippy::cast_lossless)]
23pub(crate) fn make_query(
24  sql: &str,
25  args: Vec<ConvertedType>,
26) -> sqlx::query::Query<'_, Sqlite, <Sqlite as sqlx::database::HasArguments>::Arguments> {
27  let mut query = sqlx::query(sql);
28  for arg in args {
29    trace!(?arg, "binding arg");
30    query = match arg {
31      ConvertedType::I8(v) => query.bind(v),
32      ConvertedType::I16(v) => query.bind(v),
33      ConvertedType::I32(v) => query.bind(v),
34      ConvertedType::I64(v) => query.bind(v),
35      ConvertedType::U8(v) => query.bind(v.map(|v| v as i16)),
36      ConvertedType::U16(v) => query.bind(v),
37      ConvertedType::U32(v) => query.bind(v),
38      ConvertedType::U64(v) => query.bind(v),
39      ConvertedType::F32(v) => query.bind(v),
40      ConvertedType::F64(v) => query.bind(v),
41      ConvertedType::Bool(v) => query.bind(v),
42      ConvertedType::String(v) => query.bind(v),
43      ConvertedType::Datetime(v) => query.bind(v),
44    };
45  }
46  query
47}