use std::sync::Arc;
use super::writeset::WriteSet;
use linkrs_core::types::{CommitLsn, Timestamp, TransactionId};
#[derive(Debug, Clone)]
pub enum TransactionEvent {
Committed {
txn_id: TransactionId,
write_timestamp: Timestamp,
commit_timestamp: Timestamp,
write_set: Box<WriteSet>,
schema_catalog_version: u64,
replayed: bool,
},
Aborted {
txn_id: TransactionId,
write_timestamp: Timestamp,
},
CommitDurableButUnfinalized {
txn_id: TransactionId,
write_timestamp: Timestamp,
commit_lsn: CommitLsn,
},
BudgetWarning {
txn_id: TransactionId,
resource: String,
current: u64,
limit: u64,
},
}
pub type CommitCallback = Arc<dyn Fn(&TransactionEvent) + Send + Sync>;
pub type RollbackCallback = Arc<dyn Fn(&TransactionEvent) + Send + Sync>;
pub type TxnCallback = Arc<dyn Fn(&TransactionEvent) + Send + Sync>;
#[derive(Debug, Clone, Copy)]
pub struct CommitVetoContext {
pub txn_id: TransactionId,
pub write_timestamp: Timestamp,
}
#[derive(Debug, Clone)]
pub struct VetoDecision {
pub veto: bool,
pub reason: Option<String>,
}
impl VetoDecision {
pub fn allow() -> Self {
Self {
veto: false,
reason: None,
}
}
pub fn veto(reason: impl Into<String>) -> Self {
Self {
veto: true,
reason: Some(reason.into()),
}
}
}
pub type CommitVetoCallback = Arc<dyn Fn(&CommitVetoContext) -> VetoDecision + Send + Sync>;