github.com/omnigres/cli@v0.1.4/cmd/migrate.go (about) 1 package cmd 2 3 import ( 4 "context" 5 "database/sql" 6 "fmt" 7 "github.com/charmbracelet/log" 8 "github.com/omnigres/cli/orb" 9 "github.com/spf13/cobra" 10 "os" 11 ) 12 13 var migrateCmd = &cobra.Command{ 14 Use: "migrate", 15 Short: "Migrate revisions", 16 Run: func(cmd *cobra.Command, args []string) { 17 var cluster orb.OrbCluster 18 var err error 19 cluster, err = getOrbCluster() 20 if err != nil { 21 log.Fatal(err) 22 } 23 24 log.Debug("Workspace", "workspace", workspace) 25 cwd, err := os.Getwd() 26 if err != nil { 27 log.Fatal(err) 28 } 29 30 orbs, err := currentOrbs(cluster, cwd) 31 if err != nil { 32 log.Fatal(err) 33 } 34 35 ctx := context.Background() 36 log.Debug("Migrate revisions in orbs", "orbs", orbs) 37 migrateRevisions( 38 ctx, 39 cluster, 40 orbs, 41 ) 42 }, 43 } 44 45 func migrateRevisions( 46 ctx context.Context, 47 cluster orb.OrbCluster, 48 orbs []string, 49 ) (err error) { 50 var db *sql.DB 51 db, err = cluster.Connect(ctx, "omnigres") 52 if err != nil { 53 log.Error("Could not connect to orb. Ensure the docker container is running, perhaps 'omnigres start' will fix it.") 54 return 55 } 56 for _, orbName := range orbs { 57 log.Infof("Migrating orb %s", orbName) 58 conn, err := db.Conn(ctx) 59 if err != nil { 60 log.Error(err) 61 return err 62 } 63 err = setupCloudevents(ctx, conn) 64 if err != nil { 65 log.Error(err) 66 return err 67 } 68 defer conn.Close() 69 70 var dbExists bool 71 err = db.QueryRowContext( 72 ctx, 73 `select exists(select from pg_database where datname = $1)`, 74 orbName, 75 ).Scan(&dbExists) 76 if err != nil { 77 log.Fatal(err) 78 } 79 80 if !dbExists { 81 _, err = db.ExecContext(ctx, fmt.Sprintf(`create database %q`, orbName)) 82 if err != nil { 83 log.Fatal(err) 84 } 85 } 86 87 var rows *sql.Rows 88 rows, err = conn.QueryContext( 89 ctx, 90 `select revision, omni_schema.migrate_to_schema_revision(omni_vfs.local_fs($1), 'revisions', revision, $2) is null as success 91 from omni_schema.schema_revisions(omni_vfs.local_fs($1), 'revisions')`, 92 fmt.Sprintf("/mnt/host/%s", orbName), 93 fmt.Sprintf("dbname=%s user=omnigres", orbName), 94 ) 95 if err != nil { 96 log.Error(err) 97 return err 98 } 99 var revision string 100 var success bool 101 for rows.Next() { 102 err = rows.Scan(&revision, &success) 103 if success { 104 log.Infof("✅ Applied revision %s", revision) 105 } else { 106 log.Infof("🔴 Failed to apply revision %s", revision) 107 } 108 } 109 } 110 111 return nil 112 }