github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/store/mainchain/storages/receipt_store.go (about)

     1  package storages
     2  
     3  import (
     4  	"bytes"
     5  
     6  	"github.com/sixexorg/magnetic-ring/common"
     7  	"github.com/sixexorg/magnetic-ring/common/sink"
     8  	"github.com/sixexorg/magnetic-ring/core/mainchain/types"
     9  	"github.com/sixexorg/magnetic-ring/store/db"
    10  	mcom "github.com/sixexorg/magnetic-ring/store/mainchain/common"
    11  )
    12  
    13  //prototype pattern
    14  type ReceiptStore struct {
    15  	enableCache bool
    16  	dbDir       string
    17  	store       *db.LevelDBStore
    18  }
    19  
    20  func NewReceiptStore(dbDir string, enableCache bool) (*ReceiptStore, error) {
    21  	var err error
    22  	store, err := db.NewLevelDBStore(dbDir)
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  	receiptStore := &ReceiptStore{
    27  		dbDir:       dbDir,
    28  		store:       store,
    29  		enableCache: enableCache,
    30  	}
    31  	return receiptStore, nil
    32  }
    33  
    34  func (this *ReceiptStore) NewBatch() {
    35  	this.store.NewBatch()
    36  }
    37  func (this *ReceiptStore) CommitTo() error {
    38  	return this.store.BatchCommit()
    39  }
    40  func (this *ReceiptStore) BatchSave(receipts types.Receipts) {
    41  	for _, v := range receipts {
    42  		sk := sink.NewZeroCopySink(nil)
    43  		sk.WriteBool(v.Status)
    44  		sk.WriteUint64(v.GasUsed)
    45  		this.store.Put(this.getKey(v.TxHash), sk.Bytes())
    46  	}
    47  }
    48  func (this *ReceiptStore) GetReceipt(txHash common.Hash) (*types.Receipt, error) {
    49  	key := this.getKey(txHash)
    50  	val, err := this.store.Get(key)
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  	receipt := &types.Receipt{}
    55  	buff := bytes.NewBuffer(key[1:])
    56  	buff.Write(val)
    57  	err = receipt.Deserialize(buff)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  	return receipt, nil
    62  }
    63  
    64  func (this *ReceiptStore) getKey(txHash common.Hash) []byte {
    65  	buff := make([]byte, 1+common.HashLength)
    66  	buff[0] = byte(mcom.ST_RECEIPT)
    67  	copy(buff[1:common.HashLength+1], txHash[:])
    68  	return buff
    69  }