diff --git a/go/cmd/dolt/commands/engine/sqlengine.go b/go/cmd/dolt/commands/engine/sqlengine.go index 631804fd03..c91962022b 100644 --- a/go/cmd/dolt/commands/engine/sqlengine.go +++ b/go/cmd/dolt/commands/engine/sqlengine.go @@ -370,7 +370,7 @@ func getInitialDBStateWithDefaultBranch(ctx context.Context, db dsqle.SqlDatabas // NewSqlEngineForEnv returns a SqlEngine configured for the environment provided, with a single root user func NewSqlEngineForEnv(ctx context.Context, dEnv *env.DoltEnv) (*SqlEngine, error) { - mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.FS, dEnv) if err != nil { return nil, err } diff --git a/go/cmd/dolt/commands/filter-branch.go b/go/cmd/dolt/commands/filter-branch.go index ec9ea4c2f4..82ac8985b3 100644 --- a/go/cmd/dolt/commands/filter-branch.go +++ b/go/cmd/dolt/commands/filter-branch.go @@ -242,7 +242,7 @@ func rebaseSqlEngine(ctx context.Context, dEnv *env.DoltEnv, cm *doltdb.Commit) opts := editor.Options{Deaf: dEnv.DbEaFactory(), Tempdir: dEnv.TempTableFilesDir()} db := dsqle.NewDatabase(dbName, dEnv.DbData(), opts) - mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.FS, dEnv) if err != nil { return nil, nil, err } diff --git a/go/cmd/dolt/commands/sql.go b/go/cmd/dolt/commands/sql.go index bcab35742f..5fde911bd8 100644 --- a/go/cmd/dolt/commands/sql.go +++ b/go/cmd/dolt/commands/sql.go @@ -50,7 +50,6 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess" "github.com/dolthub/dolt/go/libraries/doltcore/sqle/dtables" "github.com/dolthub/dolt/go/libraries/utils/argparser" - "github.com/dolthub/dolt/go/libraries/utils/filesys" "github.com/dolthub/dolt/go/libraries/utils/iohelp" "github.com/dolthub/dolt/go/libraries/utils/osutil" ) @@ -442,24 +441,11 @@ func getMultiRepoEnv(ctx context.Context, apr *argparser.ArgParseResults, dEnv * return nil, errhand.VerboseErrorFromError(err) } - mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), fs, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(ctx, fs, dEnv) if err != nil { return nil, errhand.VerboseErrorFromError(err) } - if dEnv.Valid() { - if _, ok := fs.(*filesys.InMemFS); ok { - mrEnv.AddEnv("dolt", dEnv) - } else { - path, err := dEnv.FS.Abs(".") - if err != nil { - return nil, errhand.VerboseErrorFromError(err) - } - dbName := filepath.Base(path) - mrEnv.AddEnv(dbName, dEnv) - } - } - return mrEnv, nil } diff --git a/go/cmd/dolt/commands/sqlserver/server.go b/go/cmd/dolt/commands/sqlserver/server.go index 22010bf116..7b5c354d6d 100644 --- a/go/cmd/dolt/commands/sqlserver/server.go +++ b/go/cmd/dolt/commands/sqlserver/server.go @@ -19,7 +19,6 @@ import ( "fmt" "net" "net/http" - "path/filepath" "strconv" "time" @@ -34,7 +33,6 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/env" _ "github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions" "github.com/dolthub/dolt/go/libraries/doltcore/sqlserver" - "github.com/dolthub/dolt/go/libraries/utils/filesys" ) // Serve starts a MySQL-compatible server. Returns any errors that were encountered. @@ -100,23 +98,10 @@ func Serve( } // TODO: this should be the global config, probably? - mrEnv, err = env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), fs, dEnv.Version) + mrEnv, err = env.MultiEnvForDirectory(ctx, fs, dEnv) if err != nil { return err, nil } - - if dEnv.Valid() { - if _, ok := fs.(*filesys.InMemFS); ok { - mrEnv.AddEnv("dolt", dEnv) - } else { - path, err := dEnv.FS.Abs(".") - if err != nil { - return nil, err - } - dbName := filepath.Base(path) - mrEnv.AddEnv(dbName, dEnv) - } - } } else { if len(serverConfig.DataDir()) > 0 { fs, err = fs.WithWorkingDir(serverConfig.DataDir()) diff --git a/go/libraries/doltcore/env/multi_repo_env.go b/go/libraries/doltcore/env/multi_repo_env.go index 540fddba66..d94798bca2 100644 --- a/go/libraries/doltcore/env/multi_repo_env.go +++ b/go/libraries/doltcore/env/multi_repo_env.go @@ -17,6 +17,7 @@ package env import ( "context" "fmt" + "net/url" "os" "path/filepath" "strings" @@ -216,14 +217,48 @@ func getRepoRootDir(path, pathSeparator string) string { // MultiEnvForDirectory returns a MultiRepoEnv for the directory rooted at the file system given func MultiEnvForDirectory( ctx context.Context, - config config.ReadWriteConfig, fs filesys.Filesys, - version string, + dEnv *DoltEnv, ) (*MultiRepoEnv, error) { mrEnv := &MultiRepoEnv{ envs: make([]NamedEnv, 0), fs: fs, - cfg: config, + cfg: dEnv.Config.WriteableConfig(), + } + + if dEnv.Valid() { + dbName := "dolt" + if dEnv.RSLoadErr != nil { + return nil, fmt.Errorf("error loading environment: %s", dEnv.RSLoadErr.Error()) + } else if dEnv.DBLoadError != nil { + return nil, fmt.Errorf("error loading environment: %s", dEnv.DBLoadError.Error()) + } else if dEnv.CfgLoadErr != nil { + return nil, fmt.Errorf("error loading environment: %s", dEnv.CfgLoadErr.Error()) + } + u, err := earl.Parse(dEnv.urlStr) + if err != nil { + return nil, err + } + + if u.Scheme == dbfactory.FileScheme { + path, err := url.PathUnescape(u.Path) + if err != nil { + return nil, err + } + + path, err = dEnv.FS.Abs(path) + if err != nil { + return nil, err + } + + dirName := getRepoRootDir(path, string(os.PathSeparator)) + + if dirName != "" { + dbName = dirToDBName(dirName) + } + } + + mrEnv.AddEnv(dbName, dEnv) } // TODO: need to know if current directory is a database @@ -240,7 +275,7 @@ func MultiEnvForDirectory( return false } - newEnv := Load(ctx, GetCurrentUserHomeDir, newFs, doltdb.LocalDirDoltDB, version) + newEnv := Load(ctx, GetCurrentUserHomeDir, newFs, doltdb.LocalDirDoltDB, dEnv.Version) if newEnv.Valid() { mrEnv.AddEnv(dirToDBName(dir), newEnv) } diff --git a/go/libraries/doltcore/env/multi_repo_env_test.go b/go/libraries/doltcore/env/multi_repo_env_test.go index 0d9ff08bc7..7aac85902e 100644 --- a/go/libraries/doltcore/env/multi_repo_env_test.go +++ b/go/libraries/doltcore/env/multi_repo_env_test.go @@ -104,7 +104,7 @@ func TestMultiEnvForDirectory(t *testing.T) { envPath := filepath.Join(rootPath, " test---name _ 123") dEnv := initRepoWithRelativePath(t, envPath, hdp) - mrEnv, err := MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) require.NoError(t, err) assert.Len(t, mrEnv.envs, 1) @@ -124,7 +124,7 @@ func TestMultiEnvForDirectoryWithMultipleRepos(t *testing.T) { subEnv1 := initRepoWithRelativePath(t, filepath.Join(envPath, "abc"), hdp) subEnv2 := initRepoWithRelativePath(t, filepath.Join(envPath, "def"), hdp) - mrEnv, err := MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) require.NoError(t, err) assert.Len(t, mrEnv.envs, 3) diff --git a/go/libraries/doltcore/mvdata/engine_table_reader.go b/go/libraries/doltcore/mvdata/engine_table_reader.go index 5161cb7273..ccd356fe86 100644 --- a/go/libraries/doltcore/mvdata/engine_table_reader.go +++ b/go/libraries/doltcore/mvdata/engine_table_reader.go @@ -39,7 +39,7 @@ type sqlEngineTableReader struct { } func NewSqlEngineReader(ctx context.Context, dEnv *env.DoltEnv, tableName string) (*sqlEngineTableReader, error) { - mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) if err != nil { return nil, err } diff --git a/go/libraries/doltcore/mvdata/engine_table_writer.go b/go/libraries/doltcore/mvdata/engine_table_writer.go index 771bc6c9bd..6a6b4ca262 100644 --- a/go/libraries/doltcore/mvdata/engine_table_writer.go +++ b/go/libraries/doltcore/mvdata/engine_table_writer.go @@ -65,7 +65,7 @@ type SqlEngineTableWriter struct { } func NewSqlEngineTableWriter(ctx context.Context, dEnv *env.DoltEnv, createTableSchema, rowOperationSchema schema.Schema, options *MoverOptions, statsCB noms.StatsCB) (*SqlEngineTableWriter, error) { - mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) if err != nil { return nil, err } diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_harness.go b/go/libraries/doltcore/sqle/enginetest/dolt_harness.go index e786813ae7..beeab64e30 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_harness.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_harness.go @@ -73,7 +73,7 @@ var _ enginetest.ValidatingHarness = (*DoltHarness)(nil) func newDoltHarness(t *testing.T) *DoltHarness { dEnv := dtestutils.CreateTestEnv() - mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) require.NoError(t, err) b := env.GetDefaultInitBranch(dEnv.Config) pro := sqle.NewDoltDatabaseProvider(b, mrEnv.FileSystem()) @@ -322,7 +322,7 @@ func (d *DoltHarness) NewDatabaseProvider(dbs ...sql.Database) sql.MutableDataba // NewDatabases must be called before NewDatabaseProvider, we grab the DoltEnvs // previously created by NewDatabases and re-add them to the new MultiRepoEnv. dEnv := dtestutils.CreateTestEnv() - mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) require.NoError(d.t, err) d.multiRepoEnv = mrEnv for _, db := range dbs { diff --git a/go/libraries/doltcore/sqle/index/mergeable_indexes_setup_test.go b/go/libraries/doltcore/sqle/index/mergeable_indexes_setup_test.go index ff7ac5961c..41bbeaf44a 100644 --- a/go/libraries/doltcore/sqle/index/mergeable_indexes_setup_test.go +++ b/go/libraries/doltcore/sqle/index/mergeable_indexes_setup_test.go @@ -94,7 +94,7 @@ func setupIndexes(t *testing.T, tableName, insertQuery string) (*sqle.Engine, *e cols: idxv2v1Cols, } - mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) require.NoError(t, err) b := env.GetDefaultInitBranch(dEnv.Config) pro := dsqle.NewDoltDatabaseProvider(b, mrEnv.FileSystem(), db) diff --git a/go/libraries/doltcore/sqle/logictest/dolt/doltharness.go b/go/libraries/doltcore/sqle/logictest/dolt/doltharness.go index 929388861c..f5bf3c27d0 100644 --- a/go/libraries/doltcore/sqle/logictest/dolt/doltharness.go +++ b/go/libraries/doltcore/sqle/logictest/dolt/doltharness.go @@ -308,7 +308,7 @@ func schemaToSchemaString(sch sql.Schema) (string, error) { func sqlNewEngine(dEnv *env.DoltEnv) (*sqle.Engine, error) { opts := editor.Options{Deaf: dEnv.DbEaFactory(), Tempdir: dEnv.TempTableFilesDir()} db := dsql.NewDatabase("dolt", dEnv.DbData(), opts) - mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) if err != nil { return nil, err } diff --git a/go/performance/microsysbench/sysbench_test.go b/go/performance/microsysbench/sysbench_test.go index 84324a9e74..6369c5a1fb 100644 --- a/go/performance/microsysbench/sysbench_test.go +++ b/go/performance/microsysbench/sysbench_test.go @@ -111,7 +111,7 @@ func setupBenchmark(t *testing.B, dEnv *env.DoltEnv) (*sql.Context, *engine.SqlE Autocommit: true, } - mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version) + mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.FS, dEnv) require.NoError(t, err) eng, err := engine.NewSqlEngine(ctx, mrEnv, engine.FormatNull, config)