github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/txmgmt/statedb/statecouchdb/redolog.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package statecouchdb
     8  
     9  import (
    10  	"bytes"
    11  	"encoding/gob"
    12  
    13  	"github.com/hechain20/hechain/common/ledger/util/leveldbhelper"
    14  	"github.com/hechain20/hechain/core/ledger/internal/version"
    15  	"github.com/hechain20/hechain/core/ledger/kvledger/txmgmt/statedb"
    16  )
    17  
    18  var redoLogKey = []byte{byte(0)}
    19  
    20  type redoLoggerProvider struct {
    21  	leveldbProvider *leveldbhelper.Provider
    22  }
    23  
    24  type redoLogger struct {
    25  	dbHandle *leveldbhelper.DBHandle
    26  }
    27  
    28  type redoRecord struct {
    29  	UpdateBatch *statedb.UpdateBatch
    30  	Version     *version.Height
    31  }
    32  
    33  func newRedoLoggerProvider(dirPath string) (*redoLoggerProvider, error) {
    34  	provider, err := leveldbhelper.NewProvider(&leveldbhelper.Conf{DBPath: dirPath})
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  	return &redoLoggerProvider{leveldbProvider: provider}, nil
    39  }
    40  
    41  func (p *redoLoggerProvider) newRedoLogger(dbName string) *redoLogger {
    42  	return &redoLogger{
    43  		dbHandle: p.leveldbProvider.GetDBHandle(dbName),
    44  	}
    45  }
    46  
    47  func (p *redoLoggerProvider) close() {
    48  	p.leveldbProvider.Close()
    49  }
    50  
    51  func (l *redoLogger) persist(r *redoRecord) error {
    52  	v, err := encodeRedologVal(r)
    53  	if err != nil {
    54  		return err
    55  	}
    56  	return l.dbHandle.Put(redoLogKey, v, true)
    57  }
    58  
    59  func (l *redoLogger) load() (*redoRecord, error) {
    60  	v, err := l.dbHandle.Get(redoLogKey)
    61  	if err != nil || v == nil {
    62  		return nil, err
    63  	}
    64  	return decodeRedologVal(v)
    65  }
    66  
    67  func encodeRedologVal(r *redoRecord) ([]byte, error) {
    68  	buf := bytes.NewBuffer(nil)
    69  	encoder := gob.NewEncoder(buf)
    70  	if err := encoder.Encode(r); err != nil {
    71  		return nil, err
    72  	}
    73  	return buf.Bytes(), nil
    74  }
    75  
    76  func decodeRedologVal(b []byte) (*redoRecord, error) {
    77  	decoder := gob.NewDecoder(bytes.NewBuffer(b))
    78  	var r *redoRecord
    79  	if err := decoder.Decode(&r); err != nil {
    80  		return nil, err
    81  	}
    82  	return r, nil
    83  }