aboutsummaryrefslogtreecommitdiff
path: root/database/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-06 14:02:14 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-06 14:02:14 +0100
commite3d5e9d29a558173d5e6c499695480bed83008be (patch)
treea64ced22a1a63bbac589e26e21c8f291b3d6d929 /database/src
parentc914529348b8aa74a142b12f2a3b7532350d3f04 (diff)
downloadjellything-e3d5e9d29a558173d5e6c499695480bed83008be.tar
jellything-e3d5e9d29a558173d5e6c499695480bed83008be.tar.bz2
jellything-e3d5e9d29a558173d5e6c499695480bed83008be.tar.zst
idk
Diffstat (limited to 'database/src')
-rw-r--r--database/src/kv/counters.rs29
-rw-r--r--database/src/kv/helpers.rs19
-rw-r--r--database/src/kv/index.rs36
-rw-r--r--database/src/kv/index_key.rs12
-rw-r--r--database/src/kv/mod.rs22
5 files changed, 84 insertions, 34 deletions
diff --git a/database/src/kv/counters.rs b/database/src/kv/counters.rs
index bcbe6a0..c5fd5f9 100644
--- a/database/src/kv/counters.rs
+++ b/database/src/kv/counters.rs
@@ -4,8 +4,8 @@
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
use crate::{
- Query, RowNum,
- kv::{SubtreeNum, binning::Binning},
+ Query,
+ kv::{SubtreeNum, binning::Binning, helpers::read_counter},
};
use anyhow::Result;
use jellyobject::Object;
@@ -19,20 +19,6 @@ impl Counters {
ob: Object<'_>,
remove: bool,
) -> Result<()> {
- for (b, &table) in &self.0 {
- let mut k = vec![vec![]];
- b.apply(ob, &mut k);
- if k.is_empty() {
- continue;
- }
- let mut counter = read_counter(txn, table, 0)?;
- if remove {
- counter += k.len() as u64;
- } else {
- counter -= k.len() as u64;
- }
- write_counter(txn, table, counter)?;
- }
Ok(())
}
pub fn count(&self, txn: &dyn jellykv::Transaction, query: &Query) -> Result<Option<u64>> {
@@ -46,14 +32,3 @@ impl Counters {
Ok(Some(total))
}
}
-
-pub fn write_counter(txn: &mut dyn jellykv::Transaction, t: SubtreeNum, value: u64) -> Result<()> {
- txn.set(&t.to_be_bytes(), &value.to_be_bytes())
-}
-pub fn read_counter(txn: &dyn jellykv::Transaction, t: SubtreeNum, default: u64) -> Result<u64> {
- Ok(txn
- .get(&t.to_be_bytes())?
- .map(|k| k.as_slice().try_into().map(RowNum::from_be_bytes).ok())
- .flatten()
- .unwrap_or(default))
-}
diff --git a/database/src/kv/helpers.rs b/database/src/kv/helpers.rs
new file mode 100644
index 0000000..0764fe6
--- /dev/null
+++ b/database/src/kv/helpers.rs
@@ -0,0 +1,19 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2026 metamuffin <metamuffin.org>
+*/
+
+use crate::{RowNum, kv::SubtreeNum};
+use anyhow::Result;
+
+pub fn write_counter(txn: &mut dyn jellykv::Transaction, t: SubtreeNum, value: u64) -> Result<()> {
+ txn.set(&t.to_be_bytes(), &value.to_be_bytes())
+}
+pub fn read_counter(txn: &dyn jellykv::Transaction, t: SubtreeNum, default: u64) -> Result<u64> {
+ Ok(txn
+ .get(&t.to_be_bytes())?
+ .map(|k| k.as_slice().try_into().map(RowNum::from_be_bytes).ok())
+ .flatten()
+ .unwrap_or(default))
+}
diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs
new file mode 100644
index 0000000..09242c4
--- /dev/null
+++ b/database/src/kv/index.rs
@@ -0,0 +1,36 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2026 metamuffin <metamuffin.org>
+*/
+
+use anyhow::Result;
+use jellyobject::Object;
+
+use crate::{
+ RowNum,
+ kv::{
+ SubtreeNum,
+ helpers::{read_counter, write_counter},
+ index_key::{IndexKey, SortKey},
+ },
+};
+
+pub fn update_index(
+ txn: &mut dyn jellykv::Transaction,
+ is: SubtreeNum,
+ ik: IndexKey,
+ row: RowNum,
+ ob: Object<'_>,
+ remove: bool,
+) -> Result<()> {
+ let mut k = vec![vec![]];
+ ik.0.apply(ob, &mut k);
+ match ik.1 {
+ SortKey::None => {}
+ SortKey::Count => {}
+ SortKey::Value(path, multi_behaviour) => {}
+ SortKey::Text(path) => {}
+ }
+ Ok(())
+}
diff --git a/database/src/kv/index_key.rs b/database/src/kv/index_key.rs
index 55aa5e8..a4b2f01 100644
--- a/database/src/kv/index_key.rs
+++ b/database/src/kv/index_key.rs
@@ -5,13 +5,17 @@
*/
use crate::{
MultiBehaviour, Sort,
- kv::binning::{Binning, BinningComponent},
+ kv::{
+ T_INDICES,
+ binning::{Binning, BinningComponent},
+ },
};
use jellyobject::{Path, Tag};
-pub struct IndexKey(Binning, SortKey);
+#[derive(Debug)]
+pub struct IndexKey(pub Binning, pub SortKey);
-#[derive(Hash, PartialEq, Eq)]
+#[derive(Debug, Hash, PartialEq, Eq)]
pub enum SortKey {
None,
Count,
@@ -32,11 +36,13 @@ impl Sort {
impl IndexKey {
pub fn to_bytes(&self) -> Vec<u8> {
let mut out = Vec::new();
+ out.extend(T_INDICES.to_be_bytes());
self.0.write(&mut out);
self.1.write(&mut out);
out
}
pub fn from_bytes(mut b: &[u8]) -> Self {
+ b = &b[4..]; // remove subtree prefix
let binning = Binning::read(&mut b);
let sort = SortKey::read(&mut b);
assert!(b.is_empty());
diff --git a/database/src/kv/mod.rs b/database/src/kv/mod.rs
index 9408916..ad1dcff 100644
--- a/database/src/kv/mod.rs
+++ b/database/src/kv/mod.rs
@@ -6,13 +6,21 @@
pub mod binning;
pub mod counters;
+pub mod helpers;
+pub mod index;
pub mod index_key;
pub mod prefix_iterator;
pub mod sort;
+use std::borrow::Cow;
+
use crate::{
Database, Query, RowIter, RowNum, Transaction,
- kv::counters::{read_counter, write_counter},
+ kv::{
+ helpers::{read_counter, write_counter},
+ index_key::IndexKey,
+ prefix_iterator::PrefixIterator,
+ },
};
use anyhow::{Result, anyhow};
use jellyobject::ObjectBuffer;
@@ -46,9 +54,15 @@ impl Transaction for &mut dyn jellykv::Transaction {
)?;
let ob = entry.as_object();
- // for idx in self.indices.values() {
- // idx.add(txn, row, ob)?;
- // }
+
+ let indices = PrefixIterator {
+ inner: jellykv::Transaction::iter(*self, &T_INDICES.to_be_bytes(), false)?,
+ prefix: Cow::Borrowed(&T_INDICES.to_be_bytes()),
+ };
+ for i in indices {
+ let ik = IndexKey::from_bytes(&i?);
+ eprintln!("{ik:?}");
+ }
Ok(row)
}