- 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.
77 lines
1.7 KiB
Go
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
|
|
}
|