@ -99,12 +99,13 @@ func (d *D) SaveEvent(c context.Context, ev *event.E) (kc, vc int, err error) {
@@ -99,12 +99,13 @@ func (d *D) SaveEvent(c context.Context, ev *event.E) (kc, vc int, err error) {
}
}
} else {
// Don't save the older event
// Don't save the older event - return an error
err = errorf . E ( "blocked: event is older than existing replaceable event" )
return
}
}
} else if kind . IsParameterizedReplaceable ( ev . Kind ) {
// find the events and delete them
// find the events and check timestamps before deleting
dTag := ev . Tags . GetFirst ( [ ] byte ( "d" ) )
if dTag == nil {
err = errorf . E ( "event is missing a d tag identifier" )
@ -121,19 +122,41 @@ func (d *D) SaveEvent(c context.Context, ev *event.E) (kc, vc int, err error) {
@@ -121,19 +122,41 @@ func (d *D) SaveEvent(c context.Context, ev *event.E) (kc, vc int, err error) {
if sers , err = d . GetSerialsFromFilter ( f ) ; chk . E ( err ) {
return
}
// if found, delete them
// if found, check timestamps before deleting
if len ( sers ) > 0 {
var shouldReplace bool = true
for _ , s := range sers {
var oldEv * event . E
if oldEv , err = d . FetchEventBySerial ( s ) ; chk . E ( err ) {
continue
}
if err = d . DeleteEventBySerial (
c , s , oldEv ,
) ; chk . E ( err ) {
continue
// Only replace if the new event is newer or same timestamp
if ev . CreatedAt < oldEv . CreatedAt {
log . I . F ( "SaveEvent: rejecting older addressable event ID=%s (created_at=%d) - existing event ID=%s (created_at=%d)" ,
hex . Enc ( ev . ID ) , ev . CreatedAt , hex . Enc ( oldEv . ID ) , oldEv . CreatedAt )
shouldReplace = false
break
}
}
if shouldReplace {
for _ , s := range sers {
var oldEv * event . E
if oldEv , err = d . FetchEventBySerial ( s ) ; chk . E ( err ) {
continue
}
log . I . F ( "SaveEvent: replacing older addressable event ID=%s (created_at=%d) with newer event ID=%s (created_at=%d)" ,
hex . Enc ( oldEv . ID ) , oldEv . CreatedAt , hex . Enc ( ev . ID ) , ev . CreatedAt )
if err = d . DeleteEventBySerial (
c , s , oldEv ,
) ; chk . E ( err ) {
continue
}
}
} else {
// Don't save the older event - return an error
err = errorf . E ( "blocked: event is older than existing addressable event" )
return
}
}
}
// Get the next sequence number for the event