Skip to main content

systemprompt_database/services/
provider.rs

1use 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}