github.com/decred/dcrlnd@v0.7.6/channeldb/dcrmigrations/migration01/dcrmigration01.go (about)

     1  package dcrmigration01
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  
     7  	"github.com/decred/dcrd/wire"
     8  	"github.com/decred/dcrlnd/kvdb"
     9  )
    10  
    11  var (
    12  	byteOrder = binary.BigEndian
    13  
    14  	// outpointBucket is an index mapping outpoints to a tlv
    15  	// stream of channel data.
    16  	outpointBucket = []byte("outpoint-bucket")
    17  )
    18  
    19  // FixMigration20 fixes a version of the version 20 that had a wrong
    20  // implementation for the writeOutpoint codec function. This assumes that
    21  // migration20 was executed and now needs to be fixed.
    22  func FixMigration20(tx kvdb.RwTx) error {
    23  	// Get the target bucket.
    24  	bucket := tx.ReadWriteBucket(outpointBucket)
    25  
    26  	// Collect the data that needs migration.
    27  	var keys []*wire.OutPoint
    28  	values := map[*wire.OutPoint][]byte{}
    29  	err := bucket.ForEach(func(k, v []byte) error {
    30  		op := new(wire.OutPoint)
    31  		r := bytes.NewReader(k)
    32  		if err := readMig20Outpoint(r, op); err != nil {
    33  			return err
    34  		}
    35  
    36  		keys = append(keys, op)
    37  		switch {
    38  		case v == nil:
    39  			values[op] = nil
    40  		case len(v) == 0:
    41  			values[op] = []byte{}
    42  		default:
    43  			values[op] = append([]byte(nil), v...)
    44  		}
    45  
    46  		return nil
    47  	})
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	log.Infof("Migrating %d entries", len(keys))
    53  
    54  	for _, op := range keys {
    55  		log.Debugf("Migrating outpoint %s", op)
    56  
    57  		var oldOpBuf bytes.Buffer
    58  		if err := writeMig20Outpoint(&oldOpBuf, op); err != nil {
    59  			return err
    60  		}
    61  
    62  		if err := bucket.Delete(oldOpBuf.Bytes()); err != nil {
    63  			return err
    64  		}
    65  
    66  		var newOpBuf bytes.Buffer
    67  		if err := writeOkOutpoint(&newOpBuf, op); err != nil {
    68  			return err
    69  		}
    70  		value := values[op]
    71  		if err := bucket.Put(newOpBuf.Bytes(), value); err != nil {
    72  			return err
    73  		}
    74  	}
    75  
    76  	return nil
    77  }