Skip to main content

systemprompt_database/services/postgres/
ext.rs

1use anyhow::{anyhow, Result};
2
3use super::conversion::bind_params;
4use super::PostgresProvider;
5use crate::models::{FromDatabaseRow, QuerySelector, ToDbValue};
6use crate::services::provider::DatabaseProviderExt;
7
8impl DatabaseProviderExt for PostgresProvider {
9    async fn fetch_typed_optional<T: FromDatabaseRow>(
10        &self,
11        query: &dyn QuerySelector,
12        params: &[&dyn ToDbValue],
13    ) -> Result<Option<T>> {
14        let sql = query.select_query();
15        let query_obj = sqlx::query(sql);
16        let query_obj = bind_params(query_obj, params);
17
18        let row = query_obj
19            .fetch_optional(self.pool())
20            .await
21            .map_err(|e| anyhow!("Query execution failed: {e}"))?;
22
23        match row {
24            Some(r) => Ok(Some(T::from_postgres_row(&r)?)),
25            None => Ok(None),
26        }
27    }
28
29    async fn fetch_typed_one<T: FromDatabaseRow>(
30        &self,
31        query: &dyn QuerySelector,
32        params: &[&dyn ToDbValue],
33    ) -> Result<T> {
34        let sql = query.select_query();
35        let query_obj = sqlx::query(sql);
36        let query_obj = bind_params(query_obj, params);
37
38        let row = query_obj
39            .fetch_one(self.pool())
40            .await
41            .map_err(|e| anyhow!("Query execution failed: {e}"))?;
42
43        T::from_postgres_row(&row)
44    }
45
46    async fn fetch_typed_all<T: FromDatabaseRow>(
47        &self,
48        query: &dyn QuerySelector,
49        params: &[&dyn ToDbValue],
50    ) -> Result<Vec<T>> {
51        let sql = query.select_query();
52        let query_obj = sqlx::query(sql);
53        let query_obj = bind_params(query_obj, params);
54
55        let rows = query_obj
56            .fetch_all(self.pool())
57            .await
58            .map_err(|e| anyhow!("Query execution failed: {e}"))?;
59
60        rows.iter().map(|r| T::from_postgres_row(r)).collect()
61    }
62}