use std::sync::Arc;
use linkrs_core::types::{
CommitLsn, DurabilityLevel, EdgeIdentifier, Timestamp, TransactionId, VertexId,
};
use super::context::TransactionContext;
use super::error::TransactionError;
use super::types::{MutationResult, WriteSet};
use super::undo_log::UndoLogEntry;
#[derive(Debug, Clone)]
pub struct TransactionCommitDescriptor {
pub transaction_id: TransactionId,
pub write_timestamp: Timestamp,
pub commit_timestamp: Timestamp,
pub durability: DurabilityLevel,
pub write_set: WriteSet,
pub read_set: WriteSet,
pub first_sequence: u64,
pub entry_count: usize,
pub intent_count: usize,
pub journal_range: std::ops::Range<usize>,
}
impl TransactionCommitDescriptor {
pub fn new(
transaction_id: TransactionId,
write_timestamp: Timestamp,
durability: DurabilityLevel,
write_set: WriteSet,
) -> Self {
Self {
transaction_id,
write_timestamp,
commit_timestamp: 0,
durability,
write_set,
read_set: WriteSet::new(),
first_sequence: 0,
entry_count: 0,
intent_count: 0,
journal_range: 0..0,
}
}
}
#[derive(Debug, Clone)]
pub struct TransactionAbortDescriptor {
pub transaction_id: TransactionId,
pub write_timestamp: Timestamp,
pub context: Arc<TransactionContext>,
}
pub trait TransactionMutationRecorder: Send + Sync + std::fmt::Debug {
fn record_mutation(&self, mutation: MutationResult) -> Result<(), TransactionError>;
fn record_vertex_write(&self, vertex_id: VertexId);
fn record_vertex_delete(&self, _vertex_id: VertexId) {}
fn record_edge_write(&self, edge: EdgeIdentifier);
fn add_undo_log(&self, entry: UndoLogEntry) -> Result<(), TransactionError>;
fn record_table_modification(&self, table_name: &str);
fn record_schema_write(&self, _resource: &str) -> Result<(), TransactionError> {
Ok(())
}
fn record_index_write(&self, _resource: &str) {}
fn record_vertex_read(&self, _vertex_id: VertexId) {}
fn record_edge_read(&self, _edge: EdgeIdentifier) {}
fn record_schema_read(&self, _resource: &str) {}
fn record_index_read(&self, _resource: &str) {}
}
pub trait TransactionCommitSink: Send + Sync {
fn commit_transaction(&self, transaction_id: TransactionId) -> Result<CommitLsn, String>;
fn abort_transaction(&self, transaction_id: TransactionId) -> Result<(), String>;
fn commit_transaction_with_descriptor(
&self,
descriptor: &TransactionCommitDescriptor,
) -> Result<CommitLsn, String> {
self.commit_transaction(descriptor.transaction_id)
}
fn finalize_commit(
&self,
_descriptor: &TransactionCommitDescriptor,
_commit_lsn: CommitLsn,
) -> Result<(), String> {
Ok(())
}
fn abort_transaction_with_descriptor(
&self,
descriptor: &TransactionAbortDescriptor,
) -> Result<(), String> {
self.abort_transaction(descriptor.transaction_id)
}
fn recover_unfinalized_commits(&self) -> Result<usize, String> {
Ok(0)
}
fn auto_checkpoint_if_needed(&self) -> Result<(), String> {
Ok(())
}
}