Skip to main content

systemprompt_database/services/
provider.rs

1//! Trait abstractions over a database backend.
2//!
3//! [`DatabaseProvider`] is dyn-safe (callers hold `Arc<dyn DatabaseProvider>`)
4//! and uses `#[async_trait]`.
5//!
6//! Copyright (c) systemprompt.io — Business Source License 1.1.
7//! See <https://systemprompt.io> for licensing details.
8
9use crate::error::DatabaseResult;
10use crate::models::{
11    DatabaseInfo, DatabaseTransaction, JsonRow, QueryResult, QuerySelector, ToDbValue,
12};
13use async_trait::async_trait;
14use std::sync::Arc;
15
16#[async_trait]
17pub trait DatabaseProvider: Send + Sync + std::fmt::Debug {
18    fn get_postgres_pool(&self) -> Arc<sqlx::PgPool>;
19
20    async fn execute(
21        &self,
22        query: &dyn QuerySelector,
23        params: &[&dyn ToDbValue],
24    ) -> DatabaseResult<u64>;
25
26    async fn execute_raw(&self, sql: &str) -> DatabaseResult<()>;
27
28    async fn fetch_all(
29        &self,
30        query: &dyn QuerySelector,
31        params: &[&dyn ToDbValue],
32    ) -> DatabaseResult<Vec<JsonRow>>;
33
34    async fn fetch_one(
35        &self,
36        query: &dyn QuerySelector,
37        params: &[&dyn ToDbValue],
38    ) -> DatabaseResult<JsonRow>;
39
40    async fn fetch_optional(
41        &self,
42        query: &dyn QuerySelector,
43        params: &[&dyn ToDbValue],
44    ) -> DatabaseResult<Option<JsonRow>>;
45
46
47    async fn begin_transaction(&self) -> DatabaseResult<Box<dyn DatabaseTransaction>>;
48
49    async fn get_database_info(&self) -> DatabaseResult<DatabaseInfo>;
50
51    async fn test_connection(&self) -> DatabaseResult<()>;
52
53    async fn execute_batch(&self, sql: &str) -> DatabaseResult<()>;
54
55    async fn query_raw(&self, query: &dyn QuerySelector) -> DatabaseResult<QueryResult>;
56
57    async fn query_raw_with(
58        &self,
59        query: &dyn QuerySelector,
60        params: &[&dyn ToDbValue],
61    ) -> DatabaseResult<QueryResult>;
62}