package indexer import ( "bytes" "fmt" db "github.com/tendermint/go-db" "github.com/tendermint/go-wire" "github.com/tendermint/tendermint/types" ) // KV is a simplest possible indexer, backed by Key-Value storage (levelDB). // It could only index transaction by its identifier. type KV struct { store db.DB } // NewKV returns new instance of KV indexer. func NewKV(store db.DB) *KV { return &KV{store: store} } // Tx gets transaction from the KV storage and returns it or nil if the // transaction is not found. func (indexer *KV) Tx(hash []byte) (*types.TxResult, error) { if len(hash) == 0 { return nil, ErrorEmptyHash } rawBytes := indexer.store.Get(hash) if rawBytes == nil { return nil, nil } r := bytes.NewReader(rawBytes) var n int var err error txResult := wire.ReadBinary(&types.TxResult{}, r, 0, &n, &err).(*types.TxResult) if err != nil { return nil, fmt.Errorf("Error reading TxResult: %v", err) } return txResult, nil } // Batch writes a batch of transactions into the KV storage. func (indexer *KV) Batch(b *Batch) error { storeBatch := indexer.store.NewBatch() for hash, result := range b.Ops { rawBytes := wire.BinaryBytes(&result) storeBatch.Set([]byte(hash), rawBytes) } storeBatch.Write() return nil }