sea_orm/database/
connection.rs1use crate::{
2 DbBackend, DbErr, ExecResult, QueryResult, Statement, StatementBuilder, TransactionError,
3};
4use std::future::Future;
5
6pub trait ConnectionTrait {
9 fn get_database_backend(&self) -> DbBackend;
11
12 fn execute_raw(&self, stmt: Statement) -> Result<ExecResult, DbErr>;
14
15 fn execute<S: StatementBuilder>(&self, stmt: &S) -> Result<ExecResult, DbErr> {
17 let db_backend = self.get_database_backend();
18 let stmt = db_backend.build(stmt);
19 self.execute_raw(stmt)
20 }
21
22 fn execute_unprepared(&self, sql: &str) -> Result<ExecResult, DbErr>;
24
25 fn query_one_raw(&self, stmt: Statement) -> Result<Option<QueryResult>, DbErr>;
27
28 fn query_one<S: StatementBuilder>(&self, stmt: &S) -> Result<Option<QueryResult>, DbErr> {
30 let db_backend = self.get_database_backend();
31 let stmt = db_backend.build(stmt);
32 self.query_one_raw(stmt)
33 }
34
35 fn query_all_raw(&self, stmt: Statement) -> Result<Vec<QueryResult>, DbErr>;
37
38 fn query_all<S: StatementBuilder>(&self, stmt: &S) -> Result<Vec<QueryResult>, DbErr> {
40 let db_backend = self.get_database_backend();
41 let stmt = db_backend.build(stmt);
42 self.query_all_raw(stmt)
43 }
44
45 fn support_returning(&self) -> bool {
47 let db_backend = self.get_database_backend();
48 db_backend.support_returning()
49 }
50
51 fn is_mock_connection(&self) -> bool {
53 false
54 }
55}
56
57pub trait StreamTrait {
59 type Stream<'a>: Iterator<Item = Result<QueryResult, DbErr>>
61 where
62 Self: 'a;
63
64 fn get_database_backend(&self) -> DbBackend;
66
67 fn stream_raw<'a>(&'a self, stmt: Statement) -> Result<Self::Stream<'a>, DbErr>;
69
70 fn stream<'a, S: StatementBuilder>(&'a self, stmt: &S) -> Result<Self::Stream<'a>, DbErr> {
72 let db_backend = self.get_database_backend();
73 let stmt = db_backend.build(stmt);
74 self.stream_raw(stmt)
75 }
76}
77
78#[derive(Copy, Clone, Debug, PartialEq, Eq)]
79pub enum IsolationLevel {
81 RepeatableRead,
83 ReadCommitted,
85 ReadUncommitted,
87 Serializable,
89}
90
91impl std::fmt::Display for IsolationLevel {
92 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
93 match self {
94 IsolationLevel::RepeatableRead => write!(f, "REPEATABLE READ"),
95 IsolationLevel::ReadCommitted => write!(f, "READ COMMITTED"),
96 IsolationLevel::ReadUncommitted => write!(f, "READ UNCOMMITTED"),
97 IsolationLevel::Serializable => write!(f, "SERIALIZABLE"),
98 }
99 }
100}
101
102#[derive(Copy, Clone, Debug, PartialEq, Eq)]
103pub enum AccessMode {
105 ReadOnly,
107 ReadWrite,
109}
110
111impl std::fmt::Display for AccessMode {
112 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
113 match self {
114 AccessMode::ReadOnly => write!(f, "READ ONLY"),
115 AccessMode::ReadWrite => write!(f, "READ WRITE"),
116 }
117 }
118}
119
120pub trait TransactionTrait {
122 type Transaction: ConnectionTrait + TransactionTrait + TransactionSession;
124
125 fn begin(&self) -> Result<Self::Transaction, DbErr>;
128
129 fn begin_with_config(
132 &self,
133 isolation_level: Option<IsolationLevel>,
134 access_mode: Option<AccessMode>,
135 ) -> Result<Self::Transaction, DbErr>;
136
137 fn transaction<F, T, E>(&self, callback: F) -> Result<T, TransactionError<E>>
140 where
141 F: for<'c> FnOnce(&'c Self::Transaction) -> Result<T, E>,
142 E: std::fmt::Display + std::fmt::Debug;
143
144 fn transaction_with_config<F, T, E>(
147 &self,
148 callback: F,
149 isolation_level: Option<IsolationLevel>,
150 access_mode: Option<AccessMode>,
151 ) -> Result<T, TransactionError<E>>
152 where
153 F: for<'c> FnOnce(&'c Self::Transaction) -> Result<T, E>,
154 E: std::fmt::Display + std::fmt::Debug;
155}
156
157pub trait TransactionSession {
159 fn commit(self) -> Result<(), DbErr>;
161
162 fn rollback(self) -> Result<(), DbErr>;
164}