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  }