use super::{
CommitInfo, GitKvError, GitVersionedKvStore, ThreadSafeFileVersionedKvStore,
ThreadSafeGitVersionedKvStore, ThreadSafeInMemoryVersionedKvStore, ThreadSafeVersionedKvStore,
TreeConfigSaver, VersionedKvStore,
};
use crate::git::metadata::MetadataBackend;
use crate::storage::{FileNodeStorage, InMemoryNodeStorage, NodeStorage};
use parking_lot::Mutex;
use std::path::Path;
use std::sync::Arc;
impl<const N: usize> ThreadSafeGitVersionedKvStore<N> {
pub fn init<P: AsRef<Path>>(path: P) -> Result<Self, GitKvError> {
let inner = GitVersionedKvStore::init(path)?;
Ok(Self {
inner: Arc::new(Mutex::new(inner)),
})
}
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self, GitKvError> {
let inner = GitVersionedKvStore::open(path)?;
Ok(Self {
inner: Arc::new(Mutex::new(inner)),
})
}
}
impl<const N: usize, S: NodeStorage<N>, M: MetadataBackend> ThreadSafeVersionedKvStore<N, S, M>
where
VersionedKvStore<N, S, M>: TreeConfigSaver<N>,
{
pub fn insert(&self, key: Vec<u8>, value: Vec<u8>) -> Result<(), GitKvError> {
let mut store = self.inner.lock();
store.insert(key, value)
}
pub fn update(&self, key: Vec<u8>, value: Vec<u8>) -> Result<bool, GitKvError> {
let mut store = self.inner.lock();
store.update(key, value)
}
pub fn delete(&self, key: &[u8]) -> Result<bool, GitKvError> {
let mut store = self.inner.lock();
store.delete(key)
}
pub fn get(&self, key: &[u8]) -> Option<Vec<u8>> {
let store = self.inner.lock();
store.get(key)
}
pub fn list_keys(&self) -> Result<Vec<Vec<u8>>, GitKvError> {
let store = self.inner.lock();
Ok(store.list_keys())
}
pub fn status(&self) -> Result<Vec<(Vec<u8>, String)>, GitKvError> {
let store = self.inner.lock();
Ok(store.status())
}
pub fn commit(&self, message: &str) -> Result<gix::ObjectId, GitKvError> {
let mut store = self.inner.lock();
store.commit(message)
}
pub fn create_branch(&self, name: &str) -> Result<(), GitKvError> {
let mut store = self.inner.lock();
store.create_branch(name)
}
pub fn log(&self) -> Result<Vec<CommitInfo>, GitKvError> {
let store = self.inner.lock();
store.log()
}
pub fn current_branch(&self) -> Result<String, GitKvError> {
let store = self.inner.lock();
Ok(store.current_branch().to_string())
}
}
impl<const N: usize> ThreadSafeGitVersionedKvStore<N> {
pub fn git_repo(&self) -> Result<gix::Repository, GitKvError> {
let store = self.inner.lock();
Ok(store.git_repo().clone())
}
pub fn checkout(&self, name: &str) -> Result<(), GitKvError> {
let mut store = self.inner.lock();
store.checkout(name)
}
}
impl<const N: usize> ThreadSafeInMemoryVersionedKvStore<N> {
pub fn init<P: AsRef<Path>>(path: P) -> Result<Self, GitKvError> {
let inner = VersionedKvStore::<N, InMemoryNodeStorage<N>>::init(path)?;
Ok(Self {
inner: Arc::new(Mutex::new(inner)),
})
}
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self, GitKvError> {
let inner = VersionedKvStore::<N, InMemoryNodeStorage<N>>::open(path)?;
Ok(Self {
inner: Arc::new(Mutex::new(inner)),
})
}
}
impl<const N: usize> ThreadSafeFileVersionedKvStore<N> {
pub fn init<P: AsRef<Path>>(path: P) -> Result<Self, GitKvError> {
let inner = VersionedKvStore::<N, FileNodeStorage<N>>::init(path)?;
Ok(Self {
inner: Arc::new(Mutex::new(inner)),
})
}
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self, GitKvError> {
let inner = VersionedKvStore::<N, FileNodeStorage<N>>::open(path)?;
Ok(Self {
inner: Arc::new(Mutex::new(inner)),
})
}
}
impl<const N: usize, S: NodeStorage<N>, M: MetadataBackend> Clone
for ThreadSafeVersionedKvStore<N, S, M>
{
fn clone(&self) -> Self {
Self {
inner: Arc::clone(&self.inner),
}
}
}