use std::fmt::Debug;
use std::fmt::Display;
use std::hash::Hash;
use std::sync::Arc;
use neptune_locks::tokio::AtomicRw;
use neptune_locks::tokio::LockCallbackFn;
use serde::de::DeserializeOwned;
use serde::Serialize;
use super::traits::*;
use super::DbtSingleton;
use super::DbtVec;
use super::PendingWrites;
use super::SimpleRustyReader;
use crate::storage::storage_schema::DbtMap;
#[derive(Debug)]
pub struct DbtSchema {
pub(super) pending_writes: AtomicRw<PendingWrites>,
pub reader: Arc<SimpleRustyReader>,
pub lock_callback_fn: Option<LockCallbackFn>,
pub table_count: u8,
}
impl DbtSchema {
pub fn new(
reader: SimpleRustyReader,
name: Option<&str>,
lock_callback_fn: Option<LockCallbackFn>,
) -> Self {
Self {
pending_writes: AtomicRw::from((PendingWrites::default(), name, lock_callback_fn)),
reader: Arc::new(reader),
lock_callback_fn,
table_count: 0,
}
}
#[inline]
pub async fn new_vec<V>(&mut self, name: &str) -> DbtVec<V>
where
V: Clone + 'static,
V: Serialize + DeserializeOwned + Send + Sync,
{
let pending_writes = self.pending_writes.clone();
let reader = self.reader.clone();
let key_prefix = self.table_count;
self.table_count += 1;
let mut vector = DbtVec::<V>::new(pending_writes, reader, key_prefix, name).await;
vector.restore_or_new().await;
vector
}
#[inline]
pub async fn new_singleton<V>(&mut self, name: impl Into<String> + Display) -> DbtSingleton<V>
where
V: Default + Clone + 'static,
V: Serialize + DeserializeOwned + Send + Sync,
{
let key = self.table_count;
self.table_count += 1;
let mut singleton = DbtSingleton::<V>::new(
key,
self.pending_writes.clone(),
self.reader.clone(),
name.into(),
);
singleton.restore_or_new().await;
singleton
}
pub async fn new_map<K, V>(&mut self, name: &str) -> DbtMap<K, V>
where
K: Clone + Debug + Serialize + DeserializeOwned + Eq + Hash + Send + Sync,
V: Clone + Debug + Serialize + DeserializeOwned + Send + Sync,
{
let key_prefixes = [self.table_count, self.table_count + 1];
self.table_count += 2;
let mut map = DbtMap::<K, V>::new(
self.pending_writes.clone(),
self.reader.clone(),
key_prefixes,
name,
)
.await;
map.restore_or_new().await;
map
}
}