90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
package mmm
|
|
|
|
import (
|
|
"encoding/binary"
|
|
|
|
"fiatjaf.com/nostr"
|
|
"github.com/PowerDNS/lmdb-go/lmdb"
|
|
)
|
|
|
|
func (b *MultiMmapManager) DebugAtPosition(offset uint64) (idPrefix []byte, layers []*IndexingLayer) {
|
|
b.lmdbEnv.View(func(txn *lmdb.Txn) error {
|
|
txn.RawRead = true
|
|
|
|
cursor, err := txn.OpenCursor(b.indexId)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer cursor.Close()
|
|
|
|
for key, val, err := cursor.Get(nil, nil, lmdb.First); err == nil; key, val, err = cursor.Get(key, val, lmdb.Next) {
|
|
pos := positionFromBytes(val[0:12])
|
|
|
|
if pos.start == offset {
|
|
idPrefix = key
|
|
layers = make([]*IndexingLayer, 0, (len(val)-12)/2)
|
|
|
|
for s := 12; s < len(val); s += 2 {
|
|
layer := b.layers.ByID(binary.BigEndian.Uint16(val[s : s+2]))
|
|
layers = append(layers, layer)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
func (il *IndexingLayer) HasAtPosition(offset uint64) (
|
|
exists bool,
|
|
createdAt nostr.Timestamp,
|
|
kind nostr.Kind,
|
|
) {
|
|
il.lmdbEnv.View(func(txn *lmdb.Txn) error {
|
|
txn.RawRead = true
|
|
|
|
{
|
|
cursor, err := txn.OpenCursor(il.indexCreatedAt)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer cursor.Close()
|
|
|
|
for key, val, err := cursor.Get(nil, nil, lmdb.First); err == nil; key, val, err = cursor.Get(key, val, lmdb.Next) {
|
|
pos := positionFromBytes(val[0:12])
|
|
|
|
if pos.start == offset {
|
|
exists = true
|
|
createdAt = nostr.Timestamp(binary.BigEndian.Uint32(key))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
cursor, err := txn.OpenCursor(il.indexKind)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer cursor.Close()
|
|
|
|
for key, val, err := cursor.Get(nil, nil, lmdb.First); err == nil; key, val, err = cursor.Get(key, val, lmdb.Next) {
|
|
pos := positionFromBytes(val[0:12])
|
|
if pos.start == offset {
|
|
exists = true
|
|
kind = nostr.Kind(binary.BigEndian.Uint16(key))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
return
|
|
}
|