mod backends;
mod core;
mod history;
pub mod namespaced;
#[cfg(test)]
mod namespaced_tests;
#[cfg(test)]
mod tests;
mod thread_safe;
#[cfg(test)]
pub(super) static CWD_LOCK: std::sync::OnceLock<std::sync::Mutex<()>> = std::sync::OnceLock::new();
#[cfg(test)]
pub(super) fn cwd_lock() -> &'static std::sync::Mutex<()> {
CWD_LOCK.get_or_init(|| std::sync::Mutex::new(()))
}
use crate::git::metadata::{GitMetadataBackend, MetadataBackend};
use crate::git::types::*;
use crate::storage::{FileNodeStorage, InMemoryNodeStorage, NodeStorage};
use crate::tree::ProllyTree;
use parking_lot::Mutex;
use std::collections::HashMap;
use std::sync::Arc;
use crate::storage::GitNodeStorage;
#[cfg(feature = "rocksdb_storage")]
use crate::storage::RocksDBNodeStorage;
pub trait HistoricalAccess<const N: usize> {
fn get_keys_at_ref(&self, reference: &str) -> Result<HashMap<Vec<u8>, Vec<u8>>, GitKvError>;
}
pub trait TreeConfigSaver<const N: usize> {
fn save_tree_config_to_git_internal(&self) -> Result<(), GitKvError>;
}
pub trait HistoricalCommitAccess<const N: usize> {
fn get_commits_for_key(&self, key: &[u8]) -> Result<Vec<CommitInfo>, GitKvError>;
fn get_commit_history(&self) -> Result<Vec<CommitInfo>, GitKvError>;
}
pub struct VersionedKvStore<
const N: usize,
S: NodeStorage<N>,
M: MetadataBackend = GitMetadataBackend,
> {
pub(crate) tree: ProllyTree<N, S>,
pub(crate) metadata: M,
pub(crate) staging_area: HashMap<Vec<u8>, Option<Vec<u8>>>, pub(crate) current_branch: String,
pub(crate) storage_backend: StorageBackend,
pub(crate) dataset_dir: Option<std::path::PathBuf>,
}
pub type GitVersionedKvStore<const N: usize> = VersionedKvStore<N, GitNodeStorage<N>>;
pub type InMemoryVersionedKvStore<const N: usize> = VersionedKvStore<N, InMemoryNodeStorage<N>>;
pub type FileVersionedKvStore<const N: usize> = VersionedKvStore<N, FileNodeStorage<N>>;
#[cfg(feature = "rocksdb_storage")]
pub type RocksDBVersionedKvStore<const N: usize> = VersionedKvStore<N, RocksDBNodeStorage<N>>;
pub struct ThreadSafeVersionedKvStore<
const N: usize,
S: NodeStorage<N>,
M: MetadataBackend = GitMetadataBackend,
> {
pub(crate) inner: Arc<Mutex<VersionedKvStore<N, S, M>>>,
}
pub type ThreadSafeGitVersionedKvStore<const N: usize> =
ThreadSafeVersionedKvStore<N, GitNodeStorage<N>>;
pub type ThreadSafeInMemoryVersionedKvStore<const N: usize> =
ThreadSafeVersionedKvStore<N, InMemoryNodeStorage<N>>;
pub type ThreadSafeFileVersionedKvStore<const N: usize> =
ThreadSafeVersionedKvStore<N, FileNodeStorage<N>>;
#[cfg(feature = "rocksdb_storage")]
pub type ThreadSafeRocksDBVersionedKvStore<const N: usize> =
ThreadSafeVersionedKvStore<N, RocksDBNodeStorage<N>>;
pub use namespaced::{
FileNamespacedKvStore, GitNamespacedKvStore, InMemoryNamespacedKvStore, MigrationReport,
NamespaceEntry, NamespaceHandle, NamespacedKvStore, StoreFormatVersion,
ThreadSafeGitNamespacedKvStore, ThreadSafeInMemoryNamespacedKvStore,
ThreadSafeNamespacedKvStore, DEFAULT_NAMESPACE,
};
#[cfg(feature = "rocksdb_storage")]
pub use namespaced::RocksDBNamespacedKvStore;
use std::path::Path;
pub struct StoreFactory;
impl StoreFactory {
pub fn memory<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<InMemoryVersionedKvStore<N>, GitKvError> {
InMemoryVersionedKvStore::init(path)
}
pub fn memory_open<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<InMemoryVersionedKvStore<N>, GitKvError> {
InMemoryVersionedKvStore::open(path)
}
pub fn file<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<FileVersionedKvStore<N>, GitKvError> {
FileVersionedKvStore::init(path)
}
pub fn file_open<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<FileVersionedKvStore<N>, GitKvError> {
FileVersionedKvStore::open(path)
}
pub fn git<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<GitVersionedKvStore<N>, GitKvError> {
GitVersionedKvStore::init(path)
}
pub fn git_open<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<GitVersionedKvStore<N>, GitKvError> {
GitVersionedKvStore::open(path)
}
pub fn git_threadsafe<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<ThreadSafeGitVersionedKvStore<N>, GitKvError> {
ThreadSafeGitVersionedKvStore::init(path)
}
pub fn git_threadsafe_open<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<ThreadSafeGitVersionedKvStore<N>, GitKvError> {
ThreadSafeGitVersionedKvStore::open(path)
}
pub fn memory_threadsafe<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<ThreadSafeInMemoryVersionedKvStore<N>, GitKvError> {
ThreadSafeInMemoryVersionedKvStore::init(path)
}
pub fn memory_threadsafe_open<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<ThreadSafeInMemoryVersionedKvStore<N>, GitKvError> {
ThreadSafeInMemoryVersionedKvStore::open(path)
}
pub fn file_threadsafe<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<ThreadSafeFileVersionedKvStore<N>, GitKvError> {
ThreadSafeFileVersionedKvStore::init(path)
}
pub fn file_threadsafe_open<const N: usize, P: AsRef<Path>>(
path: P,
) -> Result<ThreadSafeFileVersionedKvStore<N>, GitKvError> {
ThreadSafeFileVersionedKvStore::open(path)
}
}