use std::ops::ControlFlow;
use std::sync::Arc;
use crate::error::Result;
use crate::objects::{HashAlgo, Object, ObjectId, ObjectInfo};
use crate::odb::store::{ObjectStore, ObjectStream};
use super::Odb;
#[derive(Debug)]
struct OdbReadStore(Odb);
impl ObjectStore for OdbReadStore {
fn hash_algo(&self) -> HashAlgo {
self.0.hash_algo()
}
fn read(&self, oid: &ObjectId) -> Result<Option<Object>> {
self.0.try_read_once(oid)
}
fn read_info(&self, oid: &ObjectId) -> Result<Option<ObjectInfo>> {
self.0.try_read_info_once(oid)
}
fn contains(&self, oid: &ObjectId) -> Result<bool> {
self.0.contains(oid)
}
fn contains_many(&self, oids: &[ObjectId]) -> Result<Vec<bool>> {
self.0.contains_many(oids)
}
fn open_stream(&self, oid: &ObjectId) -> Result<Option<ObjectStream<'_>>> {
self.0.open_stream(oid)
}
fn for_each_object(&self, f: &mut dyn FnMut(&ObjectId) -> ControlFlow<()>) -> Result<()> {
self.0.for_each_object(f)
}
fn lookup_prefix(&self, prefix: &str, limit: usize, out: &mut Vec<ObjectId>) -> Result<()> {
self.0.lookup_prefix(prefix, limit, out)
}
fn refresh(&self) -> Result<bool> {
let odb = &self.0;
let mut changed = odb.primary_writable()?.refresh()?;
for source in &odb.extra_read_sources {
changed |= source.refresh()?;
}
if odb.alternates_enabled {
changed |= odb.sources()?.refresh()?;
}
Ok(changed)
}
}
impl Odb {
#[must_use]
pub fn read_store(&self) -> Arc<dyn ObjectStore> {
Arc::new(OdbReadStore(self.clone()))
}
}