github.com/kaleido-io/firefly@v0.0.0-20210622132723-8b4b6aacb971/internal/events/offset_calc.go (about) 1 // Copyright © 2021 Kaleido, Inc. 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 package events 18 19 import ( 20 "context" 21 "strconv" 22 23 "github.com/kaleido-io/firefly/internal/i18n" 24 "github.com/kaleido-io/firefly/internal/log" 25 "github.com/kaleido-io/firefly/pkg/database" 26 "github.com/kaleido-io/firefly/pkg/fftypes" 27 ) 28 29 func calcFirstOffset(ctx context.Context, di database.Plugin, pfe *fftypes.SubOptsFirstEvent) (firstOffset int64, err error) { 30 firstEvent := fftypes.SubOptsFirstEventNewest 31 if pfe != nil { 32 firstEvent = *pfe 33 } 34 firstOffset = -1 35 var useNewest bool 36 switch firstEvent { 37 case "", fftypes.SubOptsFirstEventNewest: 38 useNewest = true 39 case fftypes.SubOptsFirstEventOldest: 40 useNewest = false 41 default: 42 specificSequence, err := strconv.ParseInt(string(firstEvent), 10, 64) 43 if err != nil { 44 return -1, i18n.WrapError(ctx, err, i18n.MsgInvalidFirstEvent, firstEvent) 45 } 46 if specificSequence < -1 { 47 return -1, i18n.NewError(ctx, i18n.MsgNumberMustBeGreaterEqual, -1) 48 } 49 firstOffset = specificSequence 50 useNewest = false 51 } 52 if useNewest { 53 f := database.EventQueryFactory.NewFilter(ctx).And().Sort("sequence").Descending().Limit(1) 54 newestEvents, err := di.GetEvents(ctx, f) 55 if err != nil { 56 return firstOffset, err 57 } 58 if len(newestEvents) > 0 { 59 return newestEvents[0].Sequence, nil 60 } 61 } 62 log.L(ctx).Debugf("Event poller initial offest: %d (newest=%t)", firstOffset, useNewest) 63 return firstOffset, err 64 }