wick-sql 0.3.0

SQL Database component for the wick project.
Documentation
mod serialize;
use sqlx::sqlite::SqlitePoolOptions;
use sqlx::{Sqlite, SqlitePool};
use wick_config::config::components::SqlComponentConfig;

pub(crate) use self::serialize::*;
use crate::common::sql_wrapper::ConvertedType;
use crate::Error;

pub(crate) async fn connect(_config: &SqlComponentConfig, addr: Option<&str>) -> Result<SqlitePool, Error> {
  let addr = addr.unwrap_or(":memory:");
  debug!(%addr, "connecting to sqlite");

  let pool = SqlitePoolOptions::new()
    .max_connections(5)
    .connect(addr)
    .await
    .map_err(|e| Error::SqliteConnect(e.to_string()))?;
  Ok(pool)
}

#[allow(clippy::cast_lossless)]
pub(crate) fn make_query(
  sql: &str,
  args: Vec<ConvertedType>,
) -> sqlx::query::Query<'_, Sqlite, <Sqlite as sqlx::database::HasArguments>::Arguments> {
  let mut query = sqlx::query(sql);
  for arg in args {
    trace!(?arg, "binding arg");
    query = match arg {
      ConvertedType::I8(v) => query.bind(v),
      ConvertedType::I16(v) => query.bind(v),
      ConvertedType::I32(v) => query.bind(v),
      ConvertedType::I64(v) => query.bind(v),
      ConvertedType::U8(v) => query.bind(v.map(|v| v as i16)),
      ConvertedType::U16(v) => query.bind(v),
      ConvertedType::U32(v) => query.bind(v),
      ConvertedType::U64(v) => query.bind(v),
      ConvertedType::F32(v) => query.bind(v),
      ConvertedType::F64(v) => query.bind(v),
      ConvertedType::Bool(v) => query.bind(v),
      ConvertedType::String(v) => query.bind(v),
      ConvertedType::Datetime(v) => query.bind(v),
    };
  }
  query
}