use crate::error::OxenError;
use rocksdb::{DBWithThreadMode, IteratorMode, ThreadMode};
use std::str;
pub fn has_key<T: ThreadMode, S: AsRef<str>>(db: &DBWithThreadMode<T>, key: S) -> bool {
let key = key.as_ref();
let bytes = key.as_bytes();
match db.get_pinned(bytes) {
Ok(Some(_value)) => true,
Ok(None) => false,
Err(err) => {
log::error!("Error checking for entry: {}", err);
false
}
}
}
pub fn count<T: ThreadMode>(db: &DBWithThreadMode<T>) -> Result<usize, OxenError> {
let iter = db.iterator(IteratorMode::Start);
Ok(iter.count())
}
pub fn delete<T: ThreadMode, S: AsRef<str>>(
db: &DBWithThreadMode<T>,
key: S,
) -> Result<(), OxenError> {
let key = key.as_ref();
log::debug!("kv_db::delete {:?} from db: {:?}", key, db.path());
db.delete(key)?;
Ok(())
}
pub fn list_keys<T: ThreadMode>(db: &DBWithThreadMode<T>) -> Result<Vec<String>, OxenError> {
let iter = db.iterator(IteratorMode::Start);
let mut keys: Vec<String> = vec![];
for item in iter {
match item {
Ok((key, _value)) => {
match str::from_utf8(&key) {
Ok(key) => {
keys.push(String::from(key));
}
_ => {
log::error!("list_keys() Could not decode key {:?}", key)
}
}
}
_ => {
return Err(OxenError::basic_str(
"Could not read iterate over db values",
));
}
}
}
Ok(keys)
}
pub fn clear<T: ThreadMode>(db: &DBWithThreadMode<T>) -> Result<(), OxenError> {
let iter = db.iterator(IteratorMode::Start);
for item in iter {
match item {
Ok((key, _)) => {
db.delete(key)?;
}
_ => {
return Err(OxenError::basic_str(
"Could not read iterate over db values",
));
}
}
}
Ok(())
}