aboutsummaryrefslogtreecommitdiff
path: root/database/src/indices/key.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-12-24 09:02:17 +0100
committermetamuffin <metamuffin@disroot.org>2025-12-24 09:02:17 +0100
commitd543f6fe11a32dcead2310f1fb4c2abd303f5f8c (patch)
tree3ba8274f0906250809ca5fa1b08c9b5f53b88cc7 /database/src/indices/key.rs
parenteac0de36221440571fe686074b04b71bf98cf727 (diff)
downloadjellything-d543f6fe11a32dcead2310f1fb4c2abd303f5f8c.tar
jellything-d543f6fe11a32dcead2310f1fb4c2abd303f5f8c.tar.bz2
jellything-d543f6fe11a32dcead2310f1fb4c2abd303f5f8c.tar.zst
db abstraction looks good
Diffstat (limited to 'database/src/indices/key.rs')
-rw-r--r--database/src/indices/key.rs36
1 files changed, 31 insertions, 5 deletions
diff --git a/database/src/indices/key.rs b/database/src/indices/key.rs
index ab56f76..9f9511b 100644
--- a/database/src/indices/key.rs
+++ b/database/src/indices/key.rs
@@ -5,8 +5,9 @@
*/
use crate::{
- backends::WriteTransaction,
+ backends::{ReadTransaction, WriteTransaction},
indices::Index,
+ prefix_iterator::PrefixIterator,
table::{RowNum, Table, TableNum},
};
use anyhow::Result;
@@ -21,22 +22,47 @@ impl<T: 'static> KeyIndex<T> {
table.indices.push(Box::new(Self { id, key }));
Self { id, key }
}
- pub fn key(&self, id: RowNum, val: &T) -> Vec<u8> {
+ pub fn key(&self, id: RowNum, key: &[u8]) -> Vec<u8> {
let mut v = Vec::new();
v.extend(self.id.to_be_bytes());
- v.extend((self.key)(val));
+ v.extend(key);
v.extend(id.to_be_bytes());
v
}
+ pub fn lookup<'a>(
+ &self,
+ db: &'a dyn ReadTransaction,
+ key: &[u8],
+ ) -> Result<PrefixIterator<'a>> {
+ let mut prefix = Vec::new();
+ prefix.extend(self.id.to_be_bytes());
+ prefix.extend(key);
+ Ok(PrefixIterator {
+ inner: db.iter(&prefix, false)?,
+ prefix: prefix.into(),
+ })
+ }
}
impl<T: 'static> Index<T> for KeyIndex<T> {
fn add(&self, db: &mut dyn WriteTransaction, id: RowNum, val: &T) -> Result<()> {
- db.set(&self.key(id, val), &[])
+ db.set(&self.key(id, (self.key)(val)), &[])
}
fn remove(&self, db: &mut dyn WriteTransaction, id: RowNum, val: &T) -> Result<()> {
- db.del(&self.key(id, val))
+ db.del(&self.key(id, (self.key)(val)))
}
fn compare(&self, before: &T, after: &T) -> bool {
(self.key)(before) == (self.key)(after)
}
}
+
+// fn inc_key(key: &[u8]) -> Vec<u8> {
+// let mut key = key.to_owned();
+// for i in (0..key.len()).rev() {
+// let (nv, carry) = key[i].overflowing_add(1);
+// key[i] = nv;
+// if !carry {
+// break;
+// }
+// }
+// key
+// }