From 4b8f3b4d16db086ee1ed8171b34868c9b98fd82b Mon Sep 17 00:00:00 2001 From: Shawn Smith Date: Mon, 30 Sep 2019 18:38:33 +0900 Subject: [PATCH] badger migration: add migration tool --- tools/migrate/main.go | 89 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 tools/migrate/main.go diff --git a/tools/migrate/main.go b/tools/migrate/main.go new file mode 100644 index 0000000..4667137 --- /dev/null +++ b/tools/migrate/main.go @@ -0,0 +1,89 @@ +// migrate cache from boltdb to badger +package main + +import ( + "fmt" + "log" + "time" + + "github.com/boltdb/bolt" + "github.com/dgraph-io/badger" +) + +func migrate() error { + db, err := bolt.Open("/Users/shawn/goreportcard.db", 0755, &bolt.Options{Timeout: 1 * time.Second}) + if err != nil { + return fmt.Errorf("could not open bolt db: %v", err) + } + defer db.Close() + + badgerDB, err := badger.Open(badger.DefaultOptions("/tmp/badger")) + if err != nil { + return err + } + + // migrate meta info + err = db.View(func(tx *bolt.Tx) error { + rb := tx.Bucket([]byte("meta")) + if rb == nil { + return fmt.Errorf("scores bucket not found") + } + + err = rb.ForEach(func(k, v []byte) error { + log.Printf("Migrating %q...", string(k)) + err = badgerDB.Update(func(txn *badger.Txn) error { + return txn.Set(k, v) + }) + + return err + }) + + if err != nil { + return err + } + + return nil + }) + + // migrate repo data + err = db.View(func(tx *bolt.Tx) error { + defer func() { + if r := recover(); r != nil { + fmt.Println("Recovered", r) + } + }() + + rb := tx.Bucket([]byte("repos")) + if rb == nil { + return fmt.Errorf("repos bucket not found") + } + + err = rb.ForEach(func(k, v []byte) error { + log.Printf("Migrating %q...", string(k)) + err = badgerDB.Update(func(txn *badger.Txn) error { + return txn.Set([]byte("repos-"+string(k)), v) + }) + + return err + }) + + if err != nil { + return err + } + + return nil + }) + + if err != nil { + log.Fatal(err) + } + + return nil +} + +func main() { + err := migrate() + if err != nil { + log.Fatal(err) + } +}