use cratestack_core::{CratestackContext, CratestackError};
use super::push_action_policy_query;
use crate::{ModelDescriptor, cratestack_error_from_sqlx, sqlx};
pub(crate) async fn probe_current_version<M, PK>(
policy_pool: &sqlx::PgPool,
descriptor: &'static ModelDescriptor<M, PK>,
id: PK,
version_col: &'static str,
ctx: &CratestackContext,
) -> Result<Option<i64>, CratestackError>
where
PK: Send + sqlx::Type<sqlx::Postgres> + for<'q> sqlx::Encode<'q, sqlx::Postgres>,
{
let mut query = sqlx::QueryBuilder::<sqlx::Postgres>::new("SELECT ");
query.push(version_col);
query.push(" FROM ").push(descriptor.table_name);
query
.push(" WHERE ")
.push(descriptor.primary_key)
.push(" = ");
query.push_bind(id);
query.push(" AND ");
push_action_policy_query(
&mut query,
descriptor.read_allow_policies,
descriptor.read_deny_policies,
ctx,
);
let row: Option<(i64,)> = query
.build_query_as::<(i64,)>()
.fetch_optional(policy_pool)
.await
.map_err(cratestack_error_from_sqlx)?;
Ok(row.map(|(v,)| v))
}