systemprompt_database/services/
provider.rs1use crate::models::{
2 DatabaseInfo, DatabaseTransaction, DbValue, FromDatabaseRow, JsonRow, QueryResult,
3 QuerySelector, ToDbValue,
4};
5use anyhow::Result;
6use async_trait::async_trait;
7use std::sync::Arc;
8
9#[async_trait]
10pub trait DatabaseProvider: Send + Sync + std::fmt::Debug {
11 fn get_postgres_pool(&self) -> Option<Arc<sqlx::PgPool>> {
12 None
13 }
14
15 fn is_postgres(&self) -> bool {
16 true
17 }
18
19 async fn execute(&self, query: &dyn QuerySelector, params: &[&dyn ToDbValue]) -> Result<u64>;
20
21 async fn execute_raw(&self, sql: &str) -> Result<()>;
22
23 async fn fetch_all(
24 &self,
25 query: &dyn QuerySelector,
26 params: &[&dyn ToDbValue],
27 ) -> Result<Vec<JsonRow>>;
28
29 async fn fetch_one(
30 &self,
31 query: &dyn QuerySelector,
32 params: &[&dyn ToDbValue],
33 ) -> Result<JsonRow>;
34
35 async fn fetch_optional(
36 &self,
37 query: &dyn QuerySelector,
38 params: &[&dyn ToDbValue],
39 ) -> Result<Option<JsonRow>>;
40
41 async fn fetch_scalar_value(
42 &self,
43 query: &dyn QuerySelector,
44 params: &[&dyn ToDbValue],
45 ) -> Result<DbValue>;
46
47 async fn begin_transaction(&self) -> Result<Box<dyn DatabaseTransaction>>;
48
49 async fn get_database_info(&self) -> Result<DatabaseInfo>;
50
51 async fn test_connection(&self) -> Result<()>;
52
53 async fn execute_batch(&self, sql: &str) -> Result<()>;
54
55 async fn query_raw(&self, query: &dyn QuerySelector) -> Result<QueryResult>;
56
57 async fn query_raw_with(
59 &self,
60 query: &dyn QuerySelector,
61 params: Vec<serde_json::Value>,
62 ) -> Result<QueryResult>;
63}
64
65#[allow(async_fn_in_trait)]
66pub trait DatabaseProviderExt {
67 async fn fetch_typed_optional<T: FromDatabaseRow>(
68 &self,
69 query: &dyn QuerySelector,
70 params: &[&dyn ToDbValue],
71 ) -> Result<Option<T>>;
72
73 async fn fetch_typed_one<T: FromDatabaseRow>(
74 &self,
75 query: &dyn QuerySelector,
76 params: &[&dyn ToDbValue],
77 ) -> Result<T>;
78
79 async fn fetch_typed_all<T: FromDatabaseRow>(
80 &self,
81 query: &dyn QuerySelector,
82 params: &[&dyn ToDbValue],
83 ) -> Result<Vec<T>>;
84}