Skip to main content

SingleWriterWriteTx

Struct SingleWriterWriteTx 

Source
pub struct SingleWriterWriteTx<'a> { /* private fields */ }
Expand description

A single-writer (serialized) cross-keyspace transaction

Use WriteTransaction::commit to commit changes to the keyspace(s).

Transactions keep a consistent view of the database at the time, meaning old data will not be dropped until it is not referenced by any active transaction.

For that reason, you should try to keep transactions short-lived, and make sure they are not held somewhere forever.

Implementations§

Source§

impl<'tx> WriteTransaction<'tx>

Source

pub fn durability(self, mode: Option<PersistMode>) -> Self

Sets the durability level.

Source

pub fn take<K: Into<UserKey>>( &mut self, keyspace: &SingleWriterTxKeyspace, key: K, ) -> Result<Option<UserValue>>

Removes an item and returns its value if it existed.

tree.insert("a", "abc")?;

let mut tx = db.write_tx();

let taken = tx.take(&tree, "a")?.unwrap();
assert_eq!(b"abc", &*taken);
tx.commit()?;

let item = tree.get("a")?;
assert!(item.is_none());
§Errors

Will return Err if an IO error occurs.

Source

pub fn update_fetch<K: Into<UserKey>, F: FnOnce(Option<&UserValue>) -> Option<UserValue>>( &mut self, keyspace: &SingleWriterTxKeyspace, key: K, f: F, ) -> Result<Option<UserValue>>

Atomically updates an item and returns the new value.

Returning None removes the item if it existed before.

§Examples
tree.insert("a", "abc")?;

let mut tx = db.write_tx();

let updated = tx.update_fetch(&tree, "a", |_| Some(Slice::from(*b"def")))?.unwrap();
assert_eq!(b"def", &*updated);
tx.commit()?;

let item = tree.get("a")?;
assert_eq!(Some("def".as_bytes().into()), item);
tree.insert("a", "abc")?;

let mut tx = db.write_tx();

let updated = tx.update_fetch(&tree, "a", |_| None)?;
assert!(updated.is_none());
tx.commit()?;

let item = tree.get("a")?;
assert!(item.is_none());
§Errors

Will return Err if an IO error occurs.

Source

pub fn fetch_update<K: Into<UserKey>, F: FnOnce(Option<&UserValue>) -> Option<UserValue>>( &mut self, keyspace: &SingleWriterTxKeyspace, key: K, f: F, ) -> Result<Option<UserValue>>

Atomically updates an item and returns the previous value.

Returning None removes the item if it existed before.

§Examples
tree.insert("a", "abc")?;

let mut tx = db.write_tx();

let prev = tx.fetch_update(&tree, "a", |_| Some(Slice::from(*b"def")))?.unwrap();
assert_eq!(b"abc", &*prev);
tx.commit()?;

let item = tree.get("a")?;
assert_eq!(Some("def".as_bytes().into()), item);
tree.insert("a", "abc")?;

let mut tx = db.write_tx();

let prev = tx.fetch_update(&tree, "a", |_| None)?.unwrap();
assert_eq!(b"abc", &*prev);
tx.commit()?;

let item = tree.get("a")?;
assert!(item.is_none());
§Errors

Will return Err if an IO error occurs.

Source

pub fn insert<K: Into<UserKey>, V: Into<UserValue>>( &mut self, keyspace: &SingleWriterTxKeyspace, key: K, value: V, )

Keys may be up to 65536 bytes long, values up to 2^32 bytes. Shorter keys and values result in better performance.

If the key already exists, the item will be overwritten.

§Examples
tree.insert("a", "previous_value")?;
assert_eq!(b"previous_value", &*tree.get("a")?.unwrap());

let mut tx = db.write_tx();
tx.insert(&tree, "a", "new_value");

drop(tx);

// Write was not committed
assert_eq!(b"previous_value", &*tree.get("a")?.unwrap());
Source

pub fn remove<K: Into<UserKey>>( &mut self, keyspace: &SingleWriterTxKeyspace, key: K, )

Removes an item from the keyspace.

The key may be up to 65536 bytes long. Shorter keys result in better performance.

§Examples
tree.insert("a", "previous_value")?;
assert_eq!(b"previous_value", &*tree.get("a")?.unwrap());

let mut tx = db.write_tx();
tx.remove(&tree, "a");

// Read-your-own-write
let item = tx.get(&tree, "a")?;
assert_eq!(None, item);

drop(tx);

// Deletion was not committed
assert_eq!(b"previous_value", &*tree.get("a")?.unwrap());
Source

pub fn commit(self) -> Result<()>

Commits the transaction.

§Errors

Will return Err if an IO error occurs.

Source

pub fn rollback(self)

More explicit alternative to dropping the transaction to roll it back.

Trait Implementations§

Source§

impl Readable for WriteTransaction<'_>

Source§

fn get<K: AsRef<[u8]>>( &self, keyspace: impl AsRef<Keyspace>, key: K, ) -> Result<Option<UserValue>>

Retrieves an item from the snapshot. Read more
Source§

fn contains_key<K: AsRef<[u8]>>( &self, keyspace: impl AsRef<Keyspace>, key: K, ) -> Result<bool>

Returns true if the snapshot contains the specified key. Read more
Source§

fn first_key_value(&self, keyspace: impl AsRef<Keyspace>) -> Option<Guard>

Returns the first key-value pair in the snapshot. The key in this pair is the minimum key in the snapshot. Read more
Source§

fn last_key_value(&self, keyspace: impl AsRef<Keyspace>) -> Option<Guard>

Returns the last key-value pair in the snapshot. The key in this pair is the maximum key in the snapshot. Read more
Source§

fn size_of<K: AsRef<[u8]>>( &self, keyspace: impl AsRef<Keyspace>, key: K, ) -> Result<Option<u32>>

Retrieves the size of an item from the snapshot. Read more
Source§

fn iter(&self, keyspace: impl AsRef<Keyspace>) -> Iter

Iterates over the snapshot. Read more
Source§

fn range<K: AsRef<[u8]>, R: RangeBounds<K>>( &self, keyspace: impl AsRef<Keyspace>, range: R, ) -> Iter

Iterates over a range of the snapshot. Read more
Source§

fn prefix<K: AsRef<[u8]>>( &self, keyspace: impl AsRef<Keyspace>, prefix: K, ) -> Iter

Iterates over a prefixed set of the snapshot. Read more
Source§

fn is_empty(&self, keyspace: impl AsRef<Keyspace>) -> Result<bool>

Returns true if the parkeyspacetition is empty. Read more
Source§

fn len(&self, keyspace: impl AsRef<Keyspace>) -> Result<usize>

Scans the entire keyspace, returning the number of items. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for WriteTransaction<'a>

§

impl<'a> !RefUnwindSafe for WriteTransaction<'a>

§

impl<'a> !Send for WriteTransaction<'a>

§

impl<'a> Sync for WriteTransaction<'a>

§

impl<'a> Unpin for WriteTransaction<'a>

§

impl<'a> !UnwindSafe for WriteTransaction<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.