diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-03-01 21:04:36 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-03-01 21:04:36 +0100 |
| commit | ab85c03f50144b7f1718200e5d68c489dab69963 (patch) | |
| tree | 93d7b7ab2fd13428a982a21e3800eea477552d81 | |
| parent | 26c362a32a0856e912e95ac5f87c0241b36d5e2b (diff) | |
| download | jellything-ab85c03f50144b7f1718200e5d68c489dab69963.tar jellything-ab85c03f50144b7f1718200e5d68c489dab69963.tar.bz2 jellything-ab85c03f50144b7f1718200e5d68c489dab69963.tar.zst | |
fix resume on reverse value index
| -rw-r--r-- | database/src/kv/index.rs | 28 | ||||
| -rw-r--r-- | server/src/ui/items.rs | 2 |
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(), |