Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Just print to stdout
  • Loading branch information
kyleconroy committed Oct 20, 2023
commit 2c1120224e6ee41dbdef341ce53308a55061c38d
2 changes: 1 addition & 1 deletion internal/cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import (
)

func init() {
createDBCmd.Flags().StringP("env", "e", "DATABASE_URL", "environment variable to set (default: DATABASE_URL)")
createDBCmd.Flags().StringP("queryset", "q", "", "queryset to use")
uploadCmd.Flags().BoolP("dry-run", "", false, "dump upload request (default: false)")
initCmd.Flags().BoolP("v1", "", false, "generate v1 config yaml file")
initCmd.Flags().BoolP("v2", "", true, "generate v2 config yaml file")
Expand Down
90 changes: 29 additions & 61 deletions internal/cmd/createdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@ package cmd

import (
"context"
"errors"
"fmt"
"os"
"os/exec"
"runtime/trace"
"strings"

"github.com/spf13/cobra"
"github.com/sqlc-dev/sqlc/internal/config"
"github.com/sqlc-dev/sqlc/internal/opts"
"github.com/sqlc-dev/sqlc/internal/migrations"
"github.com/sqlc-dev/sqlc/internal/quickdb"
pb "github.com/sqlc-dev/sqlc/internal/quickdb/v1"
"github.com/sqlc-dev/sqlc/internal/sql/sqlpath"
Expand All @@ -20,103 +17,74 @@ import (
var createDBCmd = &cobra.Command{
Use: "createdb",
Short: "Create an ephemeral database",
Args: cobra.MinimumNArgs(1),
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
defer trace.StartRegion(cmd.Context(), "createdb").End()
stderr := cmd.ErrOrStderr()
dir, name := getConfigPath(stderr, cmd.Flag("file"))
env, err := cmd.Flags().GetString("env")
if err != nil {
return err
}
code, err := CreateDB(cmd.Context(), dir, name, args, env, &Options{
err := CreateDB(cmd.Context(), dir, name, &Options{
Env: ParseEnv(cmd),
Stderr: stderr,
})
if err != nil {
fmt.Fprintln(stderr, err.Error())
os.Exit(code)
os.Exit(1)
}
return nil
},
}

func CreateDB(ctx context.Context, dir, filename string, args []string, env string, o *Options) (int, error) {
dbg := opts.DebugFromEnv()
if !dbg.ProcessPlugins {
return 1, fmt.Errorf("process-plugins disabled")
}
func CreateDB(ctx context.Context, dir, filename string, o *Options) error {
_, conf, err := o.ReadConfig(dir, filename)
if err != nil {
return 1, err
return err
}
// Find the first SQL with a managed database
var pkg *config.SQL
// Find the first queryset with a managed database
var queryset *config.SQL
var count int
for _, sql := range conf.SQL {
sql := sql
if sql.Database != nil && sql.Database.Managed {
pkg = &sql
break
queryset = &sql
count += 1
}
}
if pkg == nil {
return 1, fmt.Errorf("no managed database found")
if queryset == nil {
return fmt.Errorf("no querysets configured to use a managed database")
}
if count > 1 {
return fmt.Errorf("multiple querysets configured to use managed databases")
}
if pkg.Engine != config.EnginePostgreSQL {
return 1, fmt.Errorf("managed: only PostgreSQL currently")
if queryset.Engine != config.EnginePostgreSQL {
return fmt.Errorf("managed databases currently only support PostgreSQL")
}

var migrations []string
files, err := sqlpath.Glob(pkg.Schema)
var ddl []string
files, err := sqlpath.Glob(queryset.Schema)
if err != nil {
return 1, err
return err
}
for _, schema := range files {
contents, err := os.ReadFile(schema)
if err != nil {
return 1, fmt.Errorf("read file: %w", err)
return fmt.Errorf("read file: %w", err)
}
migrations = append(migrations, string(contents))
ddl = append(ddl, migrations.RemoveRollbackStatements(string(contents)))
}

client, err := quickdb.NewClientFromConfig(conf.Cloud)
if err != nil {
return 1, fmt.Errorf("client error: %w", err)
return fmt.Errorf("client error: %w", err)
}

resp, err := client.CreateEphemeralDatabase(ctx, &pb.CreateEphemeralDatabaseRequest{
Engine: "postgresql",
Region: quickdb.GetClosestRegion(),
Migrations: migrations,
Migrations: ddl,
})
if err != nil {
return 1, fmt.Errorf("managed: create database: %w", err)
}

defer func() {
client.DropEphemeralDatabase(ctx, &pb.DropEphemeralDatabaseRequest{
DatabaseId: resp.DatabaseId,
})
}()

cmd := exec.Command(args[0], args[1:]...)
cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%s", env, resp.Uri))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = []string{fmt.Sprintf("%s=%s", env, resp.Uri)}
for _, val := range os.Environ() {
if strings.HasPrefix(val, "SQLC_AUTH_TOKEN") {
continue
}
cmd.Env = append(cmd.Env, val)
return fmt.Errorf("managed: create database: %w", err)
}

if err := cmd.Run(); err != nil {
var exitErr *exec.ExitError
if errors.As(err, &exitErr) {
return exitErr.ExitCode(), err
}
return 1, err
}

return 0, nil
fmt.Println(resp.Uri)
return nil
}