Skip to main content

vecdb/traits/
any_stored.rs

1use std::path::PathBuf;
2
3use rawdb::{Database, Region};
4
5use crate::{AnyVec, Header, Result, Stamp};
6
7/// Trait for stored vectors that persist data to disk (as opposed to lazy computed vectors).
8pub trait AnyStoredVec: AnyVec {
9    fn db_path(&self) -> PathBuf;
10
11    fn region(&self) -> &Region;
12
13    fn header(&self) -> &Header;
14
15    fn mut_header(&mut self) -> &mut Header;
16
17    /// Number of stamped change files to keep for rollback support.
18    fn saved_stamped_changes(&self) -> u16;
19
20    /// Writes pending changes to storage.
21    /// Returns `Ok(true)` if data was written, `Ok(false)` if nothing to write.
22    #[doc(hidden)]
23    fn write(&mut self) -> Result<bool>;
24
25    #[doc(hidden)]
26    fn db(&self) -> Database;
27
28    #[inline]
29    fn flush(&mut self) -> Result<()> {
30        if self.write()? {
31            self.region().flush()?;
32        }
33        Ok(())
34    }
35
36    /// The actual length stored on disk.
37    fn real_stored_len(&self) -> usize;
38    /// The effective stored length (may differ from real_stored_len during truncation).
39    fn stored_len(&self) -> usize;
40
41    fn update_stamp(&mut self, stamp: Stamp) {
42        self.mut_header().update_stamp(stamp);
43    }
44
45    fn stamp(&self) -> Stamp {
46        self.header().stamp()
47    }
48
49    #[inline]
50    fn stamped_write(&mut self, stamp: Stamp) -> Result<()> {
51        self.update_stamp(stamp);
52        self.write()?;
53        Ok(())
54    }
55
56    /// Flushes with the given stamp, saving changes to enable rollback.
57    /// Named with trailing underscore to avoid conflict with GenericStoredVec method.
58    fn any_stamped_write_with_changes(&mut self, stamp: Stamp) -> Result<()>;
59
60    /// Flushes with the given stamp, optionally saving changes for rollback.
61    #[inline]
62    fn any_stamped_write_maybe_with_changes(
63        &mut self,
64        stamp: Stamp,
65        with_changes: bool,
66    ) -> Result<()> {
67        if with_changes {
68            self.any_stamped_write_with_changes(stamp)
69        } else {
70            self.stamped_write(stamp)
71        }
72    }
73
74    fn serialize_changes(&self) -> Result<Vec<u8>>;
75
76    /// Removes this vector's region from the database.
77    fn remove(self) -> Result<()>;
78
79    /// Resets the vector state, clearing all data.
80    fn any_reset(&mut self) -> Result<()>;
81}