|
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")
|
|
}
|