Files
orly/pkg/database/delete-event.go
mleku 66be769f7a Add support for expiration indexing and event deletion
- pkg/database/database.go
  - Added `RunMigrations` to handle new index versions.
  - Integrated `DeleteExpired` for scheduled cleanup of expired events within a goroutine.

- pkg/database/delete-event.go
  - Refactored the existing deletion logic into `DeleteEventBySerial`.

- pkg/database/delete-expired.go
  - Added new implementation to handle deletion of expired events using expiration indexes.

- pkg/database/migrations.go
  - Implemented `RunMigrations` to handle database versioning and reindexing when new keys are introduced.

- pkg/database/indexes/keys.go
  - Added `ExpirationPrefix` and `VersionPrefix` for new expiration and version indexes.
  - Implemented encoding structs for expiration and version handling.

- pkg/encoders/event/writer.go
  - Added JSON marshaling logic to serialize events with or without whitespace.

- pkg/encoders/event/reader.go
  - Refined unmarshaling logic for handling event keys and values robustly.

- pkg/protocol/socketapi/handleEvent.go
  - Formatted log statements and updated logging verbosity for event handling.

- pkg/app/relay/handleRelayinfo.go
  - Re-enabled relay handling for expiration timestamps.

- pkg/database/indexes/types.go (new file)
  - Introduced structures for `Uint40s` and other types used in indexes.
2025-08-15 15:50:31 +01:00

77 lines
1.7 KiB
Go

package database
import (
"bytes"
"github.com/dgraph-io/badger/v4"
"orly.dev/pkg/database/indexes"
"orly.dev/pkg/database/indexes/types"
"orly.dev/pkg/encoders/event"
"orly.dev/pkg/encoders/eventid"
"orly.dev/pkg/utils/chk"
"orly.dev/pkg/utils/context"
)
// DeleteEvent removes an event from the database identified by `eid`. If
// noTombstone is false or not provided, a tombstone is created for the event.
func (d *D) DeleteEvent(c context.T, eid *eventid.T) (err error) {
d.Logger.Warningf("deleting event %0x", eid.Bytes())
// Get the serial number for the event ID
var ser *types.Uint40
ser, err = d.GetSerialById(eid.Bytes())
if chk.E(err) {
return
}
if ser == nil {
// Event wasn't found, nothing to delete
return
}
// Fetch the event to get its data
var ev *event.E
ev, err = d.FetchEventBySerial(ser)
if chk.E(err) {
return
}
if ev == nil {
// Event wasn't found, nothing to delete. this shouldn't happen.
return
}
if err = d.DeleteEventBySerial(c, ser, ev); chk.E(err) {
return
}
return
}
func (d *D) DeleteEventBySerial(
c context.T, ser *types.Uint40, ev *event.E,
) (err error) {
// Get all indexes for the event
var idxs [][]byte
idxs, err = GetIndexesForEvent(ev, ser.Get())
if chk.E(err) {
return
}
// Get the event key
eventKey := new(bytes.Buffer)
if err = indexes.EventEnc(ser).MarshalWrite(eventKey); chk.E(err) {
return
}
// Delete the event and all its indexes in a transaction
err = d.Update(
func(txn *badger.Txn) (err error) {
// Delete the event
if err = txn.Delete(eventKey.Bytes()); chk.E(err) {
return
}
// Delete all indexes
for _, key := range idxs {
if err = txn.Delete(key); chk.E(err) {
return
}
}
return
},
)
return
}