burncloud_database_core/
traits.rs1use crate::error::DatabaseResult;
2use crate::{QueryContext, QueryOptions};
3use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7#[async_trait]
8pub trait DatabaseConnection: Send + Sync {
9 async fn connect(&mut self) -> DatabaseResult<()>;
10 async fn disconnect(&mut self) -> DatabaseResult<()>;
11 async fn is_connected(&self) -> bool;
12 async fn ping(&self) -> DatabaseResult<()>;
13}
14
15#[async_trait]
16pub trait QueryExecutor: Send + Sync {
17 async fn execute_query(
18 &self,
19 query: &str,
20 params: &[&dyn QueryParam],
21 context: &QueryContext,
22 ) -> DatabaseResult<QueryResult>;
23
24 async fn execute_query_with_options(
25 &self,
26 query: &str,
27 params: &[&dyn QueryParam],
28 options: &QueryOptions,
29 context: &QueryContext,
30 ) -> DatabaseResult<QueryResult>;
31}
32
33#[async_trait]
34pub trait TransactionManager: Send + Sync {
35 type Transaction: Transaction;
36
37 async fn begin_transaction(&self, context: &QueryContext) -> DatabaseResult<Self::Transaction>;
38}
39
40#[async_trait]
41pub trait Transaction: Send + Sync {
42 async fn commit(self) -> DatabaseResult<()>;
43 async fn rollback(self) -> DatabaseResult<()>;
44 async fn execute_query(
45 &self,
46 query: &str,
47 params: &[&dyn QueryParam],
48 ) -> DatabaseResult<QueryResult>;
49}
50
51#[async_trait]
52pub trait Repository<T>: Send + Sync
53where
54 T: Send + Sync,
55{
56 async fn find_by_id(&self, id: &str, context: &QueryContext) -> DatabaseResult<Option<T>>;
57 async fn find_all(&self, options: &QueryOptions, context: &QueryContext) -> DatabaseResult<Vec<T>>;
58 async fn create(&self, entity: &T, context: &QueryContext) -> DatabaseResult<String>;
59 async fn update(&self, id: &str, entity: &T, context: &QueryContext) -> DatabaseResult<()>;
60 async fn delete(&self, id: &str, context: &QueryContext) -> DatabaseResult<()>;
61 async fn exists(&self, id: &str, context: &QueryContext) -> DatabaseResult<bool>;
62}
63
64#[async_trait]
65pub trait MigrationManager: Send + Sync {
66 async fn run_migrations(&self) -> DatabaseResult<()>;
67 async fn rollback_migration(&self, version: &str) -> DatabaseResult<()>;
68 async fn get_migration_status(&self) -> DatabaseResult<Vec<MigrationInfo>>;
69}
70
71pub trait QueryParam: Send + Sync {
72 fn as_string(&self) -> String;
73 fn as_i64(&self) -> Option<i64>;
74 fn as_f64(&self) -> Option<f64>;
75 fn as_bool(&self) -> Option<bool>;
76 fn as_bytes(&self) -> Option<&[u8]>;
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct QueryResult {
81 pub rows: Vec<HashMap<String, serde_json::Value>>,
82 pub rows_affected: u64,
83 pub last_insert_id: Option<String>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct MigrationInfo {
88 pub version: String,
89 pub name: String,
90 pub applied_at: chrono::DateTime<chrono::Utc>,
91 pub checksum: String,
92}