reth_db_api/
database.rs
1use crate::{
2 table::TableImporter,
3 transaction::{DbTx, DbTxMut},
4 DatabaseError,
5};
6use std::{fmt::Debug, sync::Arc};
7
8pub trait Database: Send + Sync + Debug {
12 type TX: DbTx + Send + Sync + Debug + 'static;
14 type TXMut: DbTxMut + DbTx + TableImporter + Send + Sync + Debug + 'static;
16
17 #[track_caller]
19 fn tx(&self) -> Result<Self::TX, DatabaseError>;
20
21 #[track_caller]
23 fn tx_mut(&self) -> Result<Self::TXMut, DatabaseError>;
24
25 fn view<T, F>(&self, f: F) -> Result<T, DatabaseError>
28 where
29 F: FnOnce(&Self::TX) -> T,
30 {
31 let tx = self.tx()?;
32
33 let res = f(&tx);
34 tx.commit()?;
35
36 Ok(res)
37 }
38
39 fn update<T, F>(&self, f: F) -> Result<T, DatabaseError>
42 where
43 F: FnOnce(&Self::TXMut) -> T,
44 {
45 let tx = self.tx_mut()?;
46
47 let res = f(&tx);
48 tx.commit()?;
49
50 Ok(res)
51 }
52}
53
54impl<DB: Database> Database for Arc<DB> {
55 type TX = <DB as Database>::TX;
56 type TXMut = <DB as Database>::TXMut;
57
58 fn tx(&self) -> Result<Self::TX, DatabaseError> {
59 <DB as Database>::tx(self)
60 }
61
62 fn tx_mut(&self) -> Result<Self::TXMut, DatabaseError> {
63 <DB as Database>::tx_mut(self)
64 }
65}
66
67impl<DB: Database> Database for &DB {
68 type TX = <DB as Database>::TX;
69 type TXMut = <DB as Database>::TXMut;
70
71 fn tx(&self) -> Result<Self::TX, DatabaseError> {
72 <DB as Database>::tx(self)
73 }
74
75 fn tx_mut(&self) -> Result<Self::TXMut, DatabaseError> {
76 <DB as Database>::tx_mut(self)
77 }
78}