use leveldb_sys::{leveldb_create_snapshot, leveldb_release_snapshot};
use leveldb_sys::{leveldb_snapshot_t, leveldb_t};
use database::kv::KV;
use database::Database;
use database::error::Error;
use database::iterator::{Iterable, Iterator};
use database::options::ReadOptions;
#[allow(missing_docs)]
struct RawSnapshot {
db_ptr: *mut leveldb_t,
ptr: *mut leveldb_snapshot_t,
}
impl Drop for RawSnapshot {
fn drop(&mut self) {
unsafe { leveldb_release_snapshot(self.db_ptr, self.ptr) };
}
}
pub struct Snapshot<'a> {
raw: RawSnapshot,
database: &'a Database,
}
pub trait Snapshots {
fn snapshot(&self) -> Snapshot;
}
impl Snapshots for Database {
fn snapshot(&self) -> Snapshot {
let db_ptr = self.0.database.ptr;
let snap = unsafe { leveldb_create_snapshot(db_ptr) };
let raw = RawSnapshot { db_ptr, ptr: snap };
Snapshot {
raw,
database: self,
}
}
}
impl<'a> Snapshot<'a> {
pub fn get(
&'a self,
mut options: ReadOptions<'a>,
key: &[u8],
) -> Result<Option<Vec<u8>>, Error> {
options.snapshot = Some(self);
self.database.get(options, key)
}
#[inline]
#[allow(missing_docs)]
pub fn raw_ptr(&self) -> *mut leveldb_snapshot_t {
self.raw.ptr
}
}
impl<'a> Iterable<'a> for Snapshot<'a> {
fn iter(&'a self, mut options: ReadOptions<'a>) -> Iterator {
options.snapshot = Some(self);
self.database.iter(options)
}
}