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    // JSON: dynamic query params — type-erased for heterogeneous admin queries
58    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}