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(
58 &self,
59 query: &dyn QuerySelector,
60 params: Vec<serde_json::Value>,
61 ) -> Result<QueryResult>;
62}
63
64#[allow(async_fn_in_trait)]
65pub trait DatabaseProviderExt {
66 async fn fetch_typed_optional<T: FromDatabaseRow>(
67 &self,
68 query: &dyn QuerySelector,
69 params: &[&dyn ToDbValue],
70 ) -> Result<Option<T>>;
71
72 async fn fetch_typed_one<T: FromDatabaseRow>(
73 &self,
74 query: &dyn QuerySelector,
75 params: &[&dyn ToDbValue],
76 ) -> Result<T>;
77
78 async fn fetch_typed_all<T: FromDatabaseRow>(
79 &self,
80 query: &dyn QuerySelector,
81 params: &[&dyn ToDbValue],
82 ) -> Result<Vec<T>>;
83}