diff --git a/go/cmd/dolt/cli/command.go b/go/cmd/dolt/cli/command.go index bed893845d..587172b817 100644 --- a/go/cmd/dolt/cli/command.go +++ b/go/cmd/dolt/cli/command.go @@ -245,7 +245,7 @@ func CheckEnvIsValid(dEnv *env.DoltEnv) bool { return true } -// CheckUserNameAndEmail returns true if the user name and email are set for this environment, or prints and error and +// CheckUserNameAndEmail returns true if the user name and email are set for this environment, or prints an error and // returns false if not. func CheckUserNameAndEmail(dEnv *env.DoltEnv) bool { ok := true diff --git a/go/cmd/dolt/commands/sql.go b/go/cmd/dolt/commands/sql.go index 215f075a4b..041ee1c424 100644 --- a/go/cmd/dolt/commands/sql.go +++ b/go/cmd/dolt/commands/sql.go @@ -212,9 +212,8 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage) } - if !cli.CheckUserNameAndEmail(dEnv) { - return 1 - } + // We need a username and password for many SQL commands, so set defaults if they don't exist + dEnv.Config.SetFailsafes(env.DefaultFailsafeConfig) mrEnv, verr := getMultiRepoEnv(ctx, apr, dEnv, cmd) if verr != nil { diff --git a/go/cmd/dolt/commands/sqlserver/server.go b/go/cmd/dolt/commands/sqlserver/server.go index 7c4035b11a..eecf47792c 100644 --- a/go/cmd/dolt/commands/sqlserver/server.go +++ b/go/cmd/dolt/commands/sqlserver/server.go @@ -49,7 +49,7 @@ func Serve(ctx context.Context, version string, serverConfig ServerConfig, serve // Code is easier to work through if we assume that serverController is never nil if serverController == nil { - serverController = CreateServerController() + serverController = NewServerController() } var mySQLServer *server.Server diff --git a/go/cmd/dolt/commands/sqlserver/server_test.go b/go/cmd/dolt/commands/sqlserver/server_test.go index 016e5971d8..6e7ed5b58e 100644 --- a/go/cmd/dolt/commands/sqlserver/server_test.go +++ b/go/cmd/dolt/commands/sqlserver/server_test.go @@ -52,7 +52,7 @@ var ( ) func TestServerArgs(t *testing.T) { - serverController := CreateServerController() + serverController := NewServerController() go func() { startServer(context.Background(), "test", "dolt sql-server", []string{ "-H", "localhost", @@ -92,7 +92,7 @@ listener: read_timeout_millis: 5000 write_timeout_millis: 5000 ` - serverController := CreateServerController() + serverController := NewServerController() go func() { dEnv := dtestutils.CreateEnvWithSeedData(t) dEnv.FS.WriteFile("config.yaml", []byte(yamlConfig)) @@ -125,7 +125,7 @@ func TestServerBadArgs(t *testing.T) { for _, test := range tests { t.Run(strings.Join(test, " "), func(t *testing.T) { - serverController := CreateServerController() + serverController := NewServerController() go func(serverController *ServerController) { startServer(context.Background(), "test", "dolt sql-server", test, env, serverController) }(serverController) @@ -160,7 +160,7 @@ func TestServerGoodParams(t *testing.T) { for _, test := range tests { t.Run(ConfigInfo(test), func(t *testing.T) { - sc := CreateServerController() + sc := NewServerController() go func(config ServerConfig, sc *ServerController) { _, _ = Serve(context.Background(), "", config, sc, env) }(test, sc) @@ -181,7 +181,7 @@ func TestServerSelect(t *testing.T) { env := dtestutils.CreateEnvWithSeedData(t) serverConfig := DefaultServerConfig().withLogLevel(LogLevel_Fatal).withPort(15300) - sc := CreateServerController() + sc := NewServerController() defer sc.StopServer() go func() { _, _ = Serve(context.Background(), "", serverConfig, sc, env) @@ -230,7 +230,7 @@ func TestServerSelect(t *testing.T) { // If a port is already in use, throw error "Port XXXX already in use." func TestServerFailsIfPortInUse(t *testing.T) { - serverController := CreateServerController() + serverController := NewServerController() server := &http.Server{ Addr: ":15200", Handler: http.DefaultServeMux, @@ -256,7 +256,7 @@ func TestServerSetDefaultBranch(t *testing.T) { dEnv := dtestutils.CreateEnvWithSeedData(t) serverConfig := DefaultServerConfig().withLogLevel(LogLevel_Fatal).withPort(15302) - sc := CreateServerController() + sc := NewServerController() defer sc.StopServer() go func() { _, _ = Serve(context.Background(), "", serverConfig, sc, dEnv) @@ -403,7 +403,7 @@ func TestReadReplica(t *testing.T) { dsess.InitPersistedSystemVars(multiSetup.MrEnv.GetEnv(readReplicaDbName)) // start server as read replica - sc := CreateServerController() + sc := NewServerController() serverConfig := DefaultServerConfig().withLogLevel(LogLevel_Fatal).withPort(15303) func() { diff --git a/go/cmd/dolt/commands/sqlserver/servercontroller.go b/go/cmd/dolt/commands/sqlserver/servercontroller.go index cca70f2586..47cecc3572 100644 --- a/go/cmd/dolt/commands/sqlserver/servercontroller.go +++ b/go/cmd/dolt/commands/sqlserver/servercontroller.go @@ -19,8 +19,6 @@ import ( ) type ServerController struct { - //serverClosed *sync.WaitGroup - //serverStarted *sync.WaitGroup startCh chan struct{} closeCh chan struct{} closeCalled *sync.Once @@ -31,16 +29,15 @@ type ServerController struct { closeError error } -// CreateServerController creates a `ServerController` for use with synchronizing on `Serve`. -func CreateServerController() *ServerController { - sc := &ServerController{ +// NewServerController creates a `ServerController` for use with synchronizing on `Serve`. +func NewServerController() *ServerController { + return &ServerController{ startCh: make(chan struct{}), closeCh: make(chan struct{}), closeCalled: &sync.Once{}, closeRegistered: &sync.Once{}, stopRegistered: &sync.Once{}, } - return sc } // registerCloseFunction is called within `Serve` to associate the close function with a future `StopServer` call. diff --git a/go/cmd/dolt/commands/sqlserver/sqlclient.go b/go/cmd/dolt/commands/sqlserver/sqlclient.go index 98ae88492b..8901dd0463 100644 --- a/go/cmd/dolt/commands/sqlserver/sqlclient.go +++ b/go/cmd/dolt/commands/sqlserver/sqlclient.go @@ -113,7 +113,7 @@ func (cmd SqlClientCmd) Exec(ctx context.Context, commandStr string, args []stri } cli.PrintErrf("Starting server with Config %v\n", ConfigInfo(serverConfig)) - serverController = CreateServerController() + serverController = NewServerController() go func() { _, _ = Serve(ctx, SqlServerCmd{}.VersionStr, serverConfig, serverController, dEnv) }() diff --git a/go/cmd/dolt/commands/sqlserver/sqlserver.go b/go/cmd/dolt/commands/sqlserver/sqlserver.go index 2c06d1108b..03dee7693e 100644 --- a/go/cmd/dolt/commands/sqlserver/sqlserver.go +++ b/go/cmd/dolt/commands/sqlserver/sqlserver.go @@ -162,7 +162,7 @@ func (cmd SqlServerCmd) RequiresRepo() bool { // Exec executes the command func (cmd SqlServerCmd) Exec(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv) int { - controller := CreateServerController() + controller := NewServerController() newCtx, cancelF := context.WithCancel(context.Background()) go func() { <-ctx.Done() @@ -176,6 +176,9 @@ func startServer(ctx context.Context, versionStr, commandStr string, args []stri ap := SqlServerCmd{}.CreateArgParser() help, _ := cli.HelpAndUsagePrinters(cli.GetCommandDocumentation(commandStr, sqlServerDocs, ap)) + // We need a username and password for many SQL commands, so set defaults if they don't exist + dEnv.Config.SetFailsafes(env.DefaultFailsafeConfig) + apr := cli.ParseArgsOrDie(ap, args, help) serverConfig, err := GetServerConfig(dEnv, apr) diff --git a/go/libraries/doltcore/env/config.go b/go/libraries/doltcore/env/config.go index f255d1cb28..50516b688c 100644 --- a/go/libraries/doltcore/env/config.go +++ b/go/libraries/doltcore/env/config.go @@ -234,11 +234,24 @@ func (dcc *DoltCliConfig) WriteableConfig() config.ReadWriteConfig { return writeableLocalDoltCliConfig{dcc} } -// Returns a copy of this config with the config given as failsafes, i.e. values that will be returned as a last -// resort if they are not found elsewhere in the config hierarchy. -// func (dcc *DoltCliConfig) WithFailsafes(cfg config.ReadableConfig) *DoltCliConfig { -// dcc.ch. -// } +// SetFailsafes sets the config values given as failsafes, i.e. values that will be returned as a last resort if they +// are not found elsewhere in the config hierarchy. The "failsafe" config can be written to in order to conform to the +// interface of ConfigHierarchy, but values will not persist beyond this session. +// Calling SetFailsafes more than once will overwrite any previous values. +// Should only be called after primary configuration of the config hierarchy has been completed. +func (dcc DoltCliConfig) SetFailsafes(cfg map[string]string) { + existing, ok := dcc.ch.GetConfig("failsafe") + if !ok { + dcc.ch.AddConfig("failsafe", config.NewEmptyMapConfig()) + } + + _ = existing.SetStrings(cfg) +} + +var DefaultFailsafeConfig = map[string]string { + UserEmailKey: "doltuser@dolthub.com", + UserNameKey: "Dolt System Account", +} func (w writeableLocalDoltCliConfig) SetStrings(updates map[string]string) error { localCfg, ok := w.GetConfig(LocalConfig) diff --git a/go/libraries/utils/config/map_config.go b/go/libraries/utils/config/map_config.go index 6e3fdac5cc..e2e9c07158 100644 --- a/go/libraries/utils/config/map_config.go +++ b/go/libraries/utils/config/map_config.go @@ -50,7 +50,7 @@ func (mc *MapConfig) GetStringOrDefault(key, defStr string) string { return defStr } -// SetString sets the values for a map of updates. +// SetStrings sets the values for a map of updates. func (mc *MapConfig) SetStrings(updates map[string]string) error { for k, v := range updates { mc.properties[k] = v diff --git a/go/performance/replicationbench/replica_test.go b/go/performance/replicationbench/replica_test.go index 2c19106ea5..d476c057c7 100644 --- a/go/performance/replicationbench/replica_test.go +++ b/go/performance/replicationbench/replica_test.go @@ -163,7 +163,7 @@ func getProfFile(b *testing.B) *os.File { } func executeServerQueries(ctx context.Context, b *testing.B, dEnv *env.DoltEnv, cfg srv.ServerConfig, queries []query) { - serverController := srv.CreateServerController() + serverController := srv.NewServerController() eg, ctx := errgroup.WithContext(ctx) diff --git a/go/performance/serverbench/bench_test.go b/go/performance/serverbench/bench_test.go index f2ccc75fda..3b80b9f5b1 100644 --- a/go/performance/serverbench/bench_test.go +++ b/go/performance/serverbench/bench_test.go @@ -175,7 +175,7 @@ func getProfFile(b *testing.B) *os.File { } func executeServerQueries(ctx context.Context, b *testing.B, dEnv *env.DoltEnv, cfg srv.ServerConfig, queries []query) { - serverController := srv.CreateServerController() + serverController := srv.NewServerController() eg, ctx := errgroup.WithContext(ctx)