use neptune_locks::tokio::LockCallbackFn;
use super::super::super::neptune_leveldb::NeptuneLevelDb;
use super::traits::StorageWriter;
use super::DbtSchema;
use super::RustyKey;
use super::RustyValue;
use super::SimpleRustyReader;
use super::WriteOperation;
use crate::neptune_leveldb::WriteBatchAsync;
#[derive(Debug)]
pub struct SimpleRustyStorage {
pub schema: DbtSchema,
db: NeptuneLevelDb<RustyKey, RustyValue>,
}
impl StorageWriter for SimpleRustyStorage {
#[inline]
async fn persist(&mut self) {
let mut write_ops = WriteBatchAsync::new();
{
let mut pending_writes = self.schema.pending_writes.lock_guard_mut().await;
for op in &pending_writes.write_ops {
match op.clone() {
WriteOperation::Write(key, value) => write_ops.op_write(key, value),
WriteOperation::Delete(key) => write_ops.op_delete(key),
}
}
pending_writes.write_ops.clear();
pending_writes.persist_count += 1;
}
self.db.batch_write(write_ops).await
}
async fn drop_unpersisted(&mut self) {
self.schema
.pending_writes
.lock_guard_mut()
.await
.write_ops
.clear();
}
}
impl SimpleRustyStorage {
#[inline]
pub fn new(db: NeptuneLevelDb<RustyKey, RustyValue>) -> Self {
let schema = DbtSchema::new(SimpleRustyReader { db: db.clone() }, None, None);
Self { schema, db }
}
pub fn new_with_callback(
db: NeptuneLevelDb<RustyKey, RustyValue>,
storage_name: &str,
lock_callback_fn: LockCallbackFn,
) -> Self {
let schema = DbtSchema::new(
SimpleRustyReader { db: db.clone() },
Some(storage_name),
Some(lock_callback_fn),
);
Self { schema, db }
}
pub fn reset_schema(&mut self) {
self.schema = DbtSchema::new(
SimpleRustyReader {
db: self.db.clone(),
},
None,
None,
);
}
#[cfg(any(test, feature = "test-helpers"))]
pub fn db(&self) -> &NeptuneLevelDb<RustyKey, RustyValue> {
&self.db
}
}