use crate::{
snapshot_nonce::SnapshotNonce,
tx::{single_writer::keyspace::SingleWriterTxKeyspace, write_tx::BaseTransaction},
Guard, Iter, Keyspace, PersistMode, Readable, SingleWriterTxDatabase,
};
use lsm_tree::{UserKey, UserValue};
use std::{ops::RangeBounds, sync::MutexGuard};
#[clippy::has_significant_drop]
pub struct WriteTransaction<'a> {
_guard: MutexGuard<'a, ()>,
inner: BaseTransaction,
}
impl Readable for WriteTransaction<'_> {
fn get<K: AsRef<[u8]>>(
&self,
keyspace: impl AsRef<Keyspace>,
key: K,
) -> crate::Result<Option<UserValue>> {
self.inner.get(keyspace, key)
}
fn contains_key<K: AsRef<[u8]>>(
&self,
keyspace: impl AsRef<Keyspace>,
key: K,
) -> crate::Result<bool> {
self.inner.contains_key(keyspace, key)
}
fn first_key_value(&self, keyspace: impl AsRef<Keyspace>) -> Option<Guard> {
self.inner.first_key_value(keyspace)
}
fn last_key_value(&self, keyspace: impl AsRef<Keyspace>) -> Option<Guard> {
self.inner.last_key_value(keyspace)
}
fn size_of<K: AsRef<[u8]>>(
&self,
keyspace: impl AsRef<Keyspace>,
key: K,
) -> crate::Result<Option<u32>> {
self.inner.size_of(keyspace, key)
}
fn iter(&self, keyspace: impl AsRef<Keyspace>) -> Iter {
self.inner.iter(keyspace)
}
fn range<K: AsRef<[u8]>, R: RangeBounds<K>>(
&self,
keyspace: impl AsRef<Keyspace>,
range: R,
) -> Iter {
self.inner.range(keyspace, range)
}
fn prefix<K: AsRef<[u8]>>(&self, keyspace: impl AsRef<Keyspace>, prefix: K) -> Iter {
self.inner.prefix(keyspace, prefix)
}
}
impl<'tx> WriteTransaction<'tx> {
pub(crate) fn new(
db: SingleWriterTxDatabase,
nonce: SnapshotNonce,
guard: MutexGuard<'tx, ()>,
) -> Self {
Self {
_guard: guard,
inner: BaseTransaction::new(db.inner, nonce),
}
}
#[must_use]
pub fn durability(mut self, mode: Option<PersistMode>) -> Self {
self.inner = self.inner.durability(mode);
self
}
pub fn take<K: Into<UserKey>>(
&mut self,
keyspace: &SingleWriterTxKeyspace,
key: K,
) -> crate::Result<Option<UserValue>> {
self.inner.take(keyspace.inner(), key)
}
pub fn update_fetch<K: Into<UserKey>, F: FnOnce(Option<&UserValue>) -> Option<UserValue>>(
&mut self,
keyspace: &SingleWriterTxKeyspace,
key: K,
f: F,
) -> crate::Result<Option<UserValue>> {
self.inner.update_fetch(keyspace.inner(), key, f)
}
pub fn fetch_update<K: Into<UserKey>, F: FnOnce(Option<&UserValue>) -> Option<UserValue>>(
&mut self,
keyspace: &SingleWriterTxKeyspace,
key: K,
f: F,
) -> crate::Result<Option<UserValue>> {
self.inner.fetch_update(keyspace.inner(), key, f)
}
pub fn insert<K: Into<UserKey>, V: Into<UserValue>>(
&mut self,
keyspace: &SingleWriterTxKeyspace,
key: K,
value: V,
) {
self.inner.insert(keyspace.inner(), key, value);
}
pub fn remove<K: Into<UserKey>>(&mut self, keyspace: &SingleWriterTxKeyspace, key: K) {
self.inner.remove(keyspace.inner(), key);
}
#[doc(hidden)]
pub fn remove_weak<K: Into<UserKey>>(&mut self, keyspace: &SingleWriterTxKeyspace, key: K) {
self.inner.remove_weak(keyspace.inner(), key);
}
pub fn commit(self) -> crate::Result<()> {
self.inner.commit()
}
pub fn rollback(self) {
self.inner.rollback();
}
}