package psql // This file adds code to the psql package that is needed for integration with // v0.34, but which is not part of the original implementation. // // In v0.35, ADR 65 was implemented in which the TxIndexer and BlockIndexer // interfaces were merged into a hybrid EventSink interface. The Backport* // types defined here bridge the psql EventSink (which was built in terms of // the v0.35 interface) to the old interfaces. // // We took this narrower approach to backporting to avoid pulling in a much // wider-reaching set of changes in v0.35 that would have broken several of the // v0.34.x APIs. The result is sufficient to work with the node plumbing as it // exists in the v0.34 branch. import ( "context" "errors" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/pubsub/query" "github.com/tendermint/tendermint/state/txindex" "github.com/tendermint/tendermint/types" ) const ( eventTypeBeginBlock = "begin_block" eventTypeEndBlock = "end_block" ) // TxIndexer returns a bridge from es to the Tendermint v0.34 transaction indexer. func (es *EventSink) TxIndexer() BackportTxIndexer { return BackportTxIndexer{psql: es} } // BackportTxIndexer implements the txindex.TxIndexer interface by delegating // indexing operations to an underlying PostgreSQL event sink. type BackportTxIndexer struct{ psql *EventSink } // AddBatch indexes a batch of transactions in Postgres, as part of TxIndexer. func (b BackportTxIndexer) AddBatch(batch *txindex.Batch) error { return b.psql.IndexTxEvents(batch.Ops) } // Index indexes a single transaction result in Postgres, as part of TxIndexer. func (b BackportTxIndexer) Index(txr *abci.TxResult) error { return b.psql.IndexTxEvents([]*abci.TxResult{txr}) } // Get is implemented to satisfy the TxIndexer interface, but is not supported // by the psql event sink and reports an error for all inputs. func (BackportTxIndexer) Get([]byte) (*abci.TxResult, error) { return nil, errors.New("the TxIndexer.Get method is not supported") } // Search is implemented to satisfy the TxIndexer interface, but it is not // supported by the psql event sink and reports an error for all inputs. func (BackportTxIndexer) Search(context.Context, *query.Query) ([]*abci.TxResult, error) { return nil, errors.New("the TxIndexer.Search method is not supported") } // BlockIndexer returns a bridge that implements the Tendermint v0.34 block // indexer interface, using the Postgres event sink as a backing store. func (es *EventSink) BlockIndexer() BackportBlockIndexer { return BackportBlockIndexer{psql: es} } // BackportBlockIndexer implements the indexer.BlockIndexer interface by // delegating indexing operations to an underlying PostgreSQL event sink. type BackportBlockIndexer struct{ psql *EventSink } // Has is implemented to satisfy the BlockIndexer interface, but it is not // supported by the psql event sink and reports an error for all inputs. func (BackportBlockIndexer) Has(height int64) (bool, error) { return false, errors.New("the BlockIndexer.Has method is not supported") } // Index indexes block begin and end events for the specified block. It is // part of the BlockIndexer interface. func (b BackportBlockIndexer) Index(block types.EventDataNewBlockHeader) error { return b.psql.IndexBlockEvents(block) } // Search is implemented to satisfy the BlockIndexer interface, but it is not // supported by the psql event sink and reports an error for all inputs. func (BackportBlockIndexer) Search(context.Context, *query.Query) ([]int64, error) { return nil, errors.New("the BlockIndexer.Search method is not supported") }