graphile_worker_database 0.1.5

Database driver abstraction for graphile_worker
Documentation
use sqlx::postgres::PgArguments;
use sqlx::{AssertSqlSafe, Postgres};

use crate::{DbParams, DbValue};

fn bind_value<'q>(
    query: sqlx::query::Query<'q, Postgres, PgArguments>,
    value: &DbValue,
) -> sqlx::query::Query<'q, Postgres, PgArguments> {
    match value {
        DbValue::Bool(value) => query.bind(*value),
        DbValue::BoolOpt(value) => query.bind(*value),
        DbValue::I16(value) => query.bind(*value),
        DbValue::I16Opt(value) => query.bind(*value),
        DbValue::I32(value) => query.bind(*value),
        DbValue::I32Opt(value) => query.bind(*value),
        DbValue::I64(value) => query.bind(*value),
        DbValue::I64Opt(value) => query.bind(*value),
        DbValue::Json(value) => query.bind(value.clone()),
        DbValue::JsonOpt(value) => query.bind(value.clone()),
        DbValue::Text(value) => query.bind(value.clone()),
        DbValue::TextOpt(value) => query.bind(value.clone()),
        DbValue::TextArray(value) => query.bind(value.clone()),
        DbValue::TextArrayOpt(value) => query.bind(value.clone()),
        DbValue::I32Array(value) => query.bind(value.clone()),
        DbValue::I64Array(value) => query.bind(value.clone()),
        DbValue::TimestampTz(value) => query.bind(*value),
        DbValue::TimestampTzOpt(value) => query.bind(*value),
    }
}

pub(super) fn bind_params<'q>(
    sql: &'q str,
    params: &DbParams,
) -> sqlx::query::Query<'q, Postgres, PgArguments> {
    let mut query = sqlx::query(AssertSqlSafe(sql));
    for value in params.values() {
        query = bind_value(query, value);
    }
    query
}