From 1b51d99f4b4364b73b41a196c929ac9108ec2d8b Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 20 Aug 2024 12:28:00 -0300 Subject: [PATCH] bolt: fix count. --- bolt/count.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/bolt/count.go b/bolt/count.go index 5cff530..ec77a17 100644 --- a/bolt/count.go +++ b/bolt/count.go @@ -26,10 +26,20 @@ func (b *BoltBackend) CountEvents(ctx context.Context, filter nostr.Filter) (int raw := txn.Bucket(bucketRaw) c := bucket.Cursor() - for k, v := c.Seek(q.startingPoint); k != nil && bytes.HasPrefix(k, q.prefix); k, v = c.Prev() { + + key, _ := c.Seek(q.startingPoint) + if key == nil { + key, _ = c.Last() + } else { + key, _ = c.Prev() + } + + for ; key != nil && bytes.HasPrefix(key, q.prefix); key, _ = c.Prev() { + idxOffset := len(key) - 4 // this is where the idx actually starts + // "id" indexes don't contain a timestamp if !q.skipTimestamp { - createdAt := binary.BigEndian.Uint32(k[len(k)-4:]) + createdAt := binary.BigEndian.Uint32(key[idxOffset-4 : idxOffset]) if createdAt < since { break } @@ -39,7 +49,7 @@ func (b *BoltBackend) CountEvents(ctx context.Context, filter nostr.Filter) (int count++ } else { // fetch actual event - val := raw.Get(v) + val := raw.Get(key[len(key)-4:]) evt := &nostr.Event{} if err := nostr_binary.Unmarshal(val, evt); err != nil { log.Printf("bolt: value read error (id %x): %s\n", val[0:32], err)