gix_odb/store_impls/dynamic/
write.rs

1use std::{io::Read, ops::Deref};
2
3use gix_hash::ObjectId;
4use gix_object::Kind;
5
6use crate::store;
7
8mod error {
9    use crate::{loose, store};
10
11    /// The error returned by the [dynamic Store's][crate::Store] [`Write`](gix_object::Write) implementation.
12    #[derive(Debug, thiserror::Error)]
13    #[allow(missing_docs)]
14    pub enum Error {
15        #[error(transparent)]
16        LoadIndex(#[from] store::load_index::Error),
17        #[error(transparent)]
18        LooseWrite(#[from] loose::write::Error),
19        #[error(transparent)]
20        Io(#[from] std::io::Error),
21    }
22}
23pub use error::Error;
24
25use crate::store_impls::dynamic;
26
27impl<S> gix_object::Write for store::Handle<S>
28where
29    S: Deref<Target = dynamic::Store> + Clone,
30{
31    fn write_stream(&self, kind: Kind, size: u64, from: &mut dyn Read) -> Result<ObjectId, gix_object::write::Error> {
32        let mut snapshot = self.snapshot.borrow_mut();
33        Ok(match snapshot.loose_dbs.first() {
34            Some(ldb) => ldb.write_stream(kind, size, from)?,
35            None => {
36                let new_snapshot = self
37                    .store
38                    .load_one_index(self.refresh, snapshot.marker)
39                    .map_err(Box::new)?
40                    .expect("there is always at least one ODB, and this code runs only once for initialization");
41                *snapshot = new_snapshot;
42                snapshot.loose_dbs[0].write_stream(kind, size, from)?
43            }
44        })
45    }
46}