linkrs_api/api_core/
transaction_api.rs1use crate::api_core::{CoreError, CoreResult, SavepointId, TransactionHandle};
6use linkrs_transaction::{TransactionManager, TransactionOptions};
7use std::sync::Arc;
8
9pub struct TransactionApi {
11 txn_manager: Arc<TransactionManager>,
12}
13
14impl TransactionApi {
15 pub fn new(txn_manager: Arc<TransactionManager>) -> Self {
17 Self { txn_manager }
18 }
19
20 pub fn begin(&self, options: TransactionOptions) -> CoreResult<TransactionHandle> {
28 let txn_id = self
29 .txn_manager
30 .begin_transaction(options)
31 .map_err(|e| CoreError::TransactionFailed(e.to_string()))?;
32 Ok(TransactionHandle(txn_id))
33 }
34
35 pub fn commit(&self, handle: TransactionHandle) -> CoreResult<()> {
40 self.txn_manager
41 .commit_transaction(handle.0)
42 .map_err(|e| CoreError::TransactionFailed(e.to_string()))
43 }
44
45 pub fn rollback(&self, handle: TransactionHandle) -> CoreResult<()> {
50 self.txn_manager
51 .abort_transaction(handle.0)
52 .map_err(|e| CoreError::TransactionFailed(e.to_string()))
53 }
54
55 pub fn get_status(
64 &self,
65 handle: TransactionHandle,
66 ) -> CoreResult<linkrs_transaction::TransactionState> {
67 self.txn_manager
68 .get_transaction_info(handle.0)
69 .map(|info| info.state)
70 .ok_or_else(|| {
71 CoreError::NotFound(format!("Transaction {} does not exist", handle.id()))
72 })
73 }
74
75 pub fn is_active(&self, handle: TransactionHandle) -> bool {
80 self.txn_manager.is_transaction_active(handle.0)
81 }
82
83 pub fn active_count(&self) -> usize {
85 self.txn_manager.list_active_transactions().len()
86 }
87
88 pub fn create_savepoint(
100 &self,
101 handle: TransactionHandle,
102 name: Option<String>,
103 staged_mark: Option<linkrs_storage::StagedWriteMark>,
104 ) -> CoreResult<SavepointId> {
105 self.txn_manager
106 .create_savepoint(handle.0, name, staged_mark)
107 .map_err(|e| CoreError::TransactionFailed(e.to_string()))
108 .map(SavepointId)
109 }
110
111 pub fn rollback_to_savepoint(
118 &self,
119 handle: TransactionHandle,
120 savepoint_id: SavepointId,
121 storage: &impl linkrs_storage::UndoTarget,
122 ) -> CoreResult<()> {
123 self.txn_manager
124 .rollback_to_savepoint(handle.0, savepoint_id.0, storage)
125 .map_err(|e| CoreError::TransactionFailed(e.to_string()))
126 }
127
128 pub fn release_savepoint(
134 &self,
135 handle: TransactionHandle,
136 savepoint_id: SavepointId,
137 ) -> CoreResult<()> {
138 let context = self
139 .txn_manager
140 .get_context(handle.0)
141 .map_err(|e| CoreError::TransactionFailed(e.to_string()))?;
142 context
143 .release_savepoint(savepoint_id.0)
144 .map_err(|e| CoreError::TransactionFailed(e.to_string()))?;
145 Ok(())
146 }
147
148 pub fn get_savepoints(
153 &self,
154 handle: TransactionHandle,
155 ) -> CoreResult<Vec<linkrs_transaction::SavepointInfo>> {
156 let context = self
157 .txn_manager
158 .get_context(handle.0)
159 .map_err(|e| CoreError::TransactionFailed(e.to_string()))?;
160 Ok(context.get_all_savepoints())
161 }
162}
163
164impl Clone for TransactionApi {
165 fn clone(&self) -> Self {
166 Self {
167 txn_manager: Arc::clone(&self.txn_manager),
168 }
169 }
170}