You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.8 KiB

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