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 }