Files
nostrlib/eventstore/badger/delete.go
2025-04-15 08:49:28 -03:00

73 lines
1.6 KiB
Go

package badger
import (
"context"
"encoding/hex"
"log"
"github.com/dgraph-io/badger/v4"
"github.com/nbd-wtf/go-nostr"
)
var serialDelete uint32 = 0
func (b *BadgerBackend) DeleteEvent(ctx context.Context, evt *nostr.Event) error {
deletionHappened := false
err := b.Update(func(txn *badger.Txn) error {
var err error
deletionHappened, err = b.delete(txn, evt)
return err
})
if err != nil {
return err
}
// after deleting, run garbage collector (sometimes)
if deletionHappened {
serialDelete = (serialDelete + 1) % 256
if serialDelete == 0 {
if err := b.RunValueLogGC(0.8); err != nil && err != badger.ErrNoRewrite {
log.Println("badger gc errored:" + err.Error())
}
}
}
return nil
}
func (b *BadgerBackend) delete(txn *badger.Txn, evt *nostr.Event) (bool, error) {
idx := make([]byte, 1, 5)
idx[0] = rawEventStorePrefix
// query event by id to get its idx
idPrefix8, _ := hex.DecodeString(evt.ID[0 : 8*2])
prefix := make([]byte, 1+8)
prefix[0] = indexIdPrefix
copy(prefix[1:], idPrefix8)
opts := badger.IteratorOptions{
PrefetchValues: false,
}
it := txn.NewIterator(opts)
it.Seek(prefix)
if it.ValidForPrefix(prefix) {
idx = append(idx, it.Item().Key()[1+8:]...)
}
it.Close()
// if no idx was found, end here, this event doesn't exist
if len(idx) == 1 {
return false, nil
}
// calculate all index keys we have for this event and delete them
for k := range b.getIndexKeysForEvent(evt, idx[1:]) {
if err := txn.Delete(k); err != nil {
return false, err
}
}
// delete the raw event
return true, txn.Delete(idx)
}