use rocksdb::{BoundColumnFamily, DB, WriteBatch};
use serde::{Serialize, de::DeserializeOwned};
use std::io;
use std::sync::Arc;
use super::key_space::{KeySpace, MetaLabel};
use super::{decode_record, encode_record};
pub(super) fn read<T: DeserializeOwned, K: KeySpace>(
db: &DB,
cf: &Arc<BoundColumnFamily<'_>>,
keys: &K,
label: MetaLabel,
) -> io::Result<Option<T>> {
let key = keys.meta_key(label);
match db.get_pinned_cf(cf, &key).map_err(io::Error::other)? {
Some(bytes) => Ok(Some(decode_record(&bytes)?)),
None => Ok(None),
}
}
pub(super) fn put<T: Serialize, K: KeySpace>(
batch: &mut WriteBatch,
cf: &Arc<BoundColumnFamily<'_>>,
keys: &K,
label: MetaLabel,
value: &T,
) -> io::Result<()> {
let key = keys.meta_key(label);
let bytes = encode_record(value)?;
batch.put_cf(cf, &key, &bytes);
Ok(())
}
pub(super) fn delete<K: KeySpace>(
batch: &mut WriteBatch,
cf: &Arc<BoundColumnFamily<'_>>,
keys: &K,
label: MetaLabel,
) {
let key = keys.meta_key(label);
batch.delete_cf(cf, &key);
}