diff options
author | metamuffin <metamuffin@disroot.org> | 2024-11-27 22:34:03 +0000 |
---|---|---|
committer | lialenck <lialenck@noreply.codeberg.org> | 2024-11-27 22:34:03 +0000 |
commit | 2a17ceac1ab5cdee98d20a928795a1aba06c8be7 (patch) | |
tree | 1c5c31e238870776dc324a91ddface2ae15e050a /src/cache.rs | |
parent | 467674743fb638ea56713aecc719a80505b82a17 (diff) | |
download | embeddings-sort-2a17ceac1ab5cdee98d20a928795a1aba06c8be7.tar embeddings-sort-2a17ceac1ab5cdee98d20a928795a1aba06c8be7.tar.bz2 embeddings-sort-2a17ceac1ab5cdee98d20a928795a1aba06c8be7.tar.zst |
Replace sled with redb (Also replaces serde to bincode.) (#2)
Reviewed-on: https://codeberg.org/lialenck/embeddings-sort/pulls/2
Co-authored-by: metamuffin <metamuffin@disroot.org>
Co-committed-by: metamuffin <metamuffin@disroot.org>
Diffstat (limited to 'src/cache.rs')
-rw-r--r-- | src/cache.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/cache.rs b/src/cache.rs new file mode 100644 index 0000000..608adb5 --- /dev/null +++ b/src/cache.rs @@ -0,0 +1,45 @@ +use crate::{FileHash, MetricElem}; +use anyhow::Result; +use bincode::config::standard; +use redb::{Database, TableDefinition}; +use std::path::Path; + +const T_ENTRIES: TableDefinition<(&str, FileHash), &[u8]> = TableDefinition::new("entries"); + +pub struct Cache { + db: Database, +} +impl Cache { + pub fn open(path: &Path) -> Result<Self> { + let db = Database::create(path)?; + let txn = db.begin_write()?; + txn.open_table(T_ENTRIES)?; + txn.commit()?; + Ok(Self { db }) + } + pub fn get<E: MetricElem>(&self, type_name: &'static str, hash: FileHash) -> Result<Option<E>> { + let txn = self.db.begin_read()?; + let table = txn.open_table(T_ENTRIES)?; + if let Some(e) = table.get((type_name, hash))? { + Ok(Some(bincode::decode_from_slice(e.value(), standard())?.0)) + } else { + Ok(None) + } + } + pub fn insert<E: MetricElem>( + &self, + type_name: &'static str, + hash: FileHash, + value: &E, + ) -> Result<()> { + let txn = self.db.begin_write()?; + let mut table = txn.open_table(T_ENTRIES)?; + table.insert( + (type_name, hash), + bincode::encode_to_vec(value, standard())?.as_slice(), + )?; + drop(table); + txn.commit()?; + Ok(()) + } +} |