use std::fmt::{Debug, Formatter};
use std::ops::Deref;
use std::sync::Arc;
pub struct RocksDbSnapshot {
inner: rocksdb::Snapshot<'static>,
raw_db: *const rocksdb::DB,
}
impl Debug for RocksDbSnapshot {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RocksDbSnapshot").finish()
}
}
impl Deref for RocksDbSnapshot {
type Target = rocksdb::Snapshot<'static>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl RocksDbSnapshot {
pub fn new(db: Arc<rocksdb::DB>) -> Self {
let raw_db = Arc::into_raw(db);
let static_db: &'static rocksdb::DB = unsafe { &*raw_db };
let inner = rocksdb::Snapshot::new(static_db);
Self { inner, raw_db }
}
}
impl Drop for RocksDbSnapshot {
fn drop(&mut self) {
unsafe {
let db = Arc::from_raw(self.raw_db);
std::mem::drop(db);
}
}
}
unsafe impl Send for RocksDbSnapshot {}
unsafe impl Sync for RocksDbSnapshot {}