systemprompt_database/services/postgres/
ext.rs1use 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}