aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-01 21:04:36 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-01 21:04:36 +0100
commitab85c03f50144b7f1718200e5d68c489dab69963 (patch)
tree93d7b7ab2fd13428a982a21e3800eea477552d81
parent26c362a32a0856e912e95ac5f87c0241b36d5e2b (diff)
downloadjellything-ab85c03f50144b7f1718200e5d68c489dab69963.tar
jellything-ab85c03f50144b7f1718200e5d68c489dab69963.tar.bz2
jellything-ab85c03f50144b7f1718200e5d68c489dab69963.tar.zst
fix resume on reverse value index
-rw-r--r--database/src/kv/index.rs28
-rw-r--r--server/src/ui/items.rs2
2 files changed, 23 insertions, 7 deletions
diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs
index dd2471b..5505079 100644
--- a/database/src/kv/index.rs
+++ b/database/src/kv/index.rs
@@ -127,17 +127,21 @@ pub fn iter_index<'a>(
}
Sort::Value(value_sort) => {
assert!(value_sort.offset.is_none(), "TODO");
- let mut start = prefix.clone();
+ let (mut start, rev) = match value_sort.order {
+ SortOrder::Ascending => (prefix.clone(), false),
+ SortOrder::Descending => (inc_key(prefix.clone()), true),
+ };
if let Some(resume) = resume {
- start.extend(resume);
- start = inc_key(start);
+ start = prefix.iter().copied().chain(resume).collect();
+ if rev {
+ start = dec_key(start);
+ } else {
+ start = inc_key(start);
+ }
}
Box::new(
PrefixIterator {
- inner: match value_sort.order {
- SortOrder::Ascending => txn.iter(&start, false)?,
- SortOrder::Descending => txn.iter(&inc_key(prefix.clone()), true)?,
- },
+ inner: txn.iter(&start, rev)?,
prefix: prefix.clone().into(),
}
.map(move |k| {
@@ -164,6 +168,16 @@ fn inc_key(mut k: Vec<u8>) -> Vec<u8> {
}
k
}
+fn dec_key(mut k: Vec<u8>) -> Vec<u8> {
+ for v in k.iter_mut().rev() {
+ let (nv, carry) = v.overflowing_sub(1);
+ *v = nv;
+ if !carry {
+ break;
+ }
+ }
+ k
+}
fn randomize(mut x: u64) -> u64 {
for _ in 0..15 {
diff --git a/server/src/ui/items.rs b/server/src/ui/items.rs
index bd4b759..8e3b602 100644
--- a/server/src/ui/items.rs
+++ b/server/src/ui/items.rs
@@ -23,6 +23,7 @@ pub fn r_items(ri: RequestInfo, cont: Option<&str>) -> MyResult<RawHtml<String>>
.transpose()
.map_err(|_| anyhow!("invalid contination token"))?;
+ eprintln!("cont in {cont_in:?}");
let mut items = Vec::new();
let mut cont_out = None;
ri.state.database.transaction(&mut |txn| {
@@ -53,6 +54,7 @@ pub fn r_items(ri: RequestInfo, cont: Option<&str>) -> MyResult<RawHtml<String>>
}
Ok(())
})?;
+ eprintln!("cont out {cont_out:?}");
Ok(ri.respond_ui(&Items {
ri: &ri.render_info(),