orderwal 0.5.1

A generic-purpose, atomic, ordered, zero-copy read, zero-cost (in-place) write, Write-Ahead Log implementation for Rust.
Documentation
use base::{Reader, Writer};
use skl::KeySize;

use crate::memtable::{
  alternative::{Table, TableOptions},
  Memtable, MemtableEntry,
};

use super::*;

fn zero_reserved<M>(wal: &mut OrderWal<Person, String, M>)
where
  M: Memtable<Key = Person, Value = String> + 'static,
  for<'a> M::Item<'a>: MemtableEntry<'a>,
  M::Error: std::fmt::Debug,
{
  unsafe {
    assert_eq!(wal.reserved_slice(), b"");
    assert_eq!(wal.reserved_slice_mut(), b"");

    let wal = wal.reader();
    assert_eq!(wal.reserved_slice(), b"");
  }
}

fn reserved<M>(wal: &mut OrderWal<Person, String, M>)
where
  M: Memtable<Key = Person, Value = String> + 'static,
  for<'a> M::Item<'a>: MemtableEntry<'a>,
  M::Error: std::fmt::Debug,
{
  unsafe {
    let buf = wal.reserved_slice_mut();
    buf.copy_from_slice(b"al8n");
    assert_eq!(wal.reserved_slice(), b"al8n");
    assert_eq!(wal.reserved_slice_mut(), b"al8n");

    let wal = wal.reader();
    assert_eq!(wal.reserved_slice(), b"al8n");
  }
}

#[cfg(feature = "std")]
expand_unit_tests!(
  "linked": OrderWalAlternativeTable<Person, String> [TableOptions::Linked]: Table<_, _> {
    zero_reserved,
  }
);

#[cfg(feature = "std")]
expand_unit_tests!(
  "linked": OrderWalAlternativeTable<Person, String> [TableOptions::Linked]: Table<_, _> {
    reserved({
      crate::Builder::new()
        .with_capacity(MB)
        .with_reserved(4)
    }),
  }
);

expand_unit_tests!(
  "arena": OrderWalAlternativeTable<Person, String> [TableOptions::Arena(Default::default())]: Table<_, _> {
    zero_reserved,
  }
);

expand_unit_tests!(
  "arena": OrderWalAlternativeTable<Person, String> [TableOptions::Arena(Default::default())]: Table<_, _> {
    reserved({
      crate::Builder::new()
        .with_capacity(MB)
        .with_reserved(4)
    }),
  }
);

#[test]
#[cfg(all(feature = "memmap", not(target_family = "wasm")))]
#[cfg_attr(miri, ignore)]
fn reopen_wrong_kind() {
  use crate::Builder;

  let dir = tempfile::tempdir().unwrap();
  let path = dir.path().join("test_reopen_wrong_kind");
  let wal = unsafe {
    Builder::new()
      .with_capacity(MB)
      .with_maximum_key_size(KeySize::with(10))
      .with_maximum_value_size(10)
      .with_create_new(true)
      .with_read(true)
      .with_write(true)
      .map_mut::<OrderWal<Person, String>, _>(path.as_path())
      .unwrap()
  };

  assert!(!wal.read_only());
  assert_eq!(wal.capacity(), MB);
  assert!(wal.remaining() < MB);
  assert_eq!(wal.maximum_key_size(), 10);
  assert_eq!(wal.maximum_value_size(), 10);
  assert_eq!(wal.path().unwrap().as_path(), path.as_path());
  assert_eq!(wal.options().maximum_key_size(), 10);

  let err = unsafe {
    Builder::new()
      .with_capacity(MB)
      .with_read(true)
      .map_mut::<crate::multiple_version::OrderWal<Person, String>, _>(path.as_path())
      .unwrap_err()
  };
  assert!(matches!(err, crate::error::Error::KindMismatch { .. }));
}