changeset 5699:a3a975ea93ca sr-v2

Implemented restore mode in meshmigrate.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 13 Feb 2024 22:59:30 +0100
parents 7a05a23f97d9
children 45240edad249
files cmd/meshmigrate/main.go
diffstat 1 files changed, 68 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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))
+	}
 }