github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/internal/state/indexer/sink/sink.go (about) 1 package sink 2 3 import ( 4 "errors" 5 "strings" 6 7 "github.com/ari-anchor/sei-tendermint/config" 8 "github.com/ari-anchor/sei-tendermint/internal/state/indexer" 9 "github.com/ari-anchor/sei-tendermint/internal/state/indexer/sink/kv" 10 "github.com/ari-anchor/sei-tendermint/internal/state/indexer/sink/null" 11 "github.com/ari-anchor/sei-tendermint/internal/state/indexer/sink/psql" 12 ) 13 14 // EventSinksFromConfig constructs a slice of indexer.EventSink using the provided 15 // configuration. 16 func EventSinksFromConfig(cfg *config.Config, dbProvider config.DBProvider, chainID string) ([]indexer.EventSink, error) { 17 if len(cfg.TxIndex.Indexer) == 0 { 18 return []indexer.EventSink{null.NewEventSink()}, nil 19 } 20 21 // check for duplicated sinks 22 sinks := map[string]struct{}{} 23 for _, s := range cfg.TxIndex.Indexer { 24 sl := strings.ToLower(s) 25 if _, ok := sinks[sl]; ok { 26 return nil, errors.New("found duplicated sinks, please check the tx-index section in the config.toml") 27 } 28 sinks[sl] = struct{}{} 29 } 30 eventSinks := []indexer.EventSink{} 31 for k := range sinks { 32 switch indexer.EventSinkType(k) { 33 case indexer.NULL: 34 // When we see null in the config, the eventsinks will be reset with the 35 // nullEventSink. 36 return []indexer.EventSink{null.NewEventSink()}, nil 37 38 case indexer.KV: 39 store, err := dbProvider(&config.DBContext{ID: "tx_index", Config: cfg}) 40 if err != nil { 41 return nil, err 42 } 43 44 eventSinks = append(eventSinks, kv.NewEventSink(store)) 45 46 case indexer.PSQL: 47 conn := cfg.TxIndex.PsqlConn 48 if conn == "" { 49 return nil, errors.New("the psql connection settings cannot be empty") 50 } 51 52 es, err := psql.NewEventSink(conn, chainID) 53 if err != nil { 54 return nil, err 55 } 56 eventSinks = append(eventSinks, es) 57 default: 58 return nil, errors.New("unsupported event sink type") 59 } 60 } 61 return eventSinks, nil 62 63 }