# HG changeset patch # User Sascha L. Teichmann # Date 1707861570 -3600 # Node ID a3a975ea93caf60437676734d7fc1a35be0df923 # Parent 7a05a23f97d9a97ac440fe85b69583b1c1bc33b5 Implemented restore mode in meshmigrate. diff -r 7a05a23f97d9 -r a3a975ea93ca cmd/meshmigrate/main.go --- a/cmd/meshmigrate/main.go Tue Feb 13 22:23:38 2024 +0100 +++ b/cmd/meshmigrate/main.go Tue Feb 13 22:59:30 2024 +0100 @@ -22,6 +22,7 @@ "fmt" "log" "os" + "regexp" "strconv" "strings" @@ -68,6 +69,56 @@ WHERE id = $4` ) +func restore(creds *credentials, dry bool) error { + db, err := creds.openDB() + if err != nil { + return err + } + defer db.Close() + + dir, err := os.Getwd() + if err != nil { + return err + } + log.Println(dir) + entries, err := os.ReadDir(dir) + if err != nil { + return err + } + log.Println(len(entries)) + pattern := regexp.MustCompile(`^mesh-(\d+)-v(\d+)\.idx\.gz$`) + for _, entry := range entries { + name := entry.Name() + m := pattern.FindStringSubmatch(name) + if m == nil { + continue + } + id, err := strconv.ParseInt(m[1], 10, 64) + if err != nil { + return err + } + version, err := strconv.ParseInt(m[2], 10, 64) + if err != nil { + return err + } + data, err := os.ReadFile(name) + if err != nil { + return err + } + h := sha1.New() + h.Write(data) + checksum := hex.EncodeToString(h.Sum(nil)) + log.Printf("restore mesh %d version %d\n", id, version) + if dry { + continue + } + if _, err := db.Exec(updateSQL, version, data, checksum, id); err != nil { + return err + } + } + return nil +} + func process( creds *credentials, to int, @@ -189,6 +240,15 @@ return ids, nil } +func checkMode(mode string) error { + switch mode { + case "migrate", "restore": + return nil + default: + return fmt.Errorf("unknown mode %q", mode) + } +} + func main() { var ( creds credentials @@ -197,6 +257,7 @@ dry bool backup bool to int + mode string ) flag.StringVar(&creds.host, "host", "localhost", "host of the database server") flag.UintVar(&creds.port, "port", 5432, "port of the database server") @@ -208,8 +269,14 @@ flag.BoolVar(&dry, "dry", false, "to a dry run") flag.BoolVar(&backup, "backup", true, "store backup in file system") flag.IntVar(&to, "to", 2, "version to store") + flag.StringVar(&mode, "mode", "migrate", "operation mode: migrate, restore") flag.Parse() ids, err := toIDs(idsS) check(err) - check(process(&creds, to, ids, limit, dry, backup)) + check(checkMode(mode)) + if mode == "migrate" { + check(process(&creds, to, ids, limit, dry, backup)) + } else { + check(restore(&creds, dry)) + } }