mirror of
https://github.com/dolthub/dolt.git
synced 2026-04-27 07:26:31 -05:00
Merge branch 'main' into andy/dolt-docs
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
set -e
|
||||
|
||||
if [ "$#" -lt 9 ]; then
|
||||
echo "Usage: ./get-dolt-dolt-job-json.sh <jobName> <fromServer> <fromVersion> <toServer> <toVersion> <timePrefix> <actorPrefix> <nomsBinFormat> <issueNumber>"
|
||||
echo "Usage: ./get-dolt-dolt-job-json.sh <jobName> <fromServer> <fromVersion> <toServer> <toVersion> <timePrefix> <actorPrefix> <nomsBinFormat> <format> <issueNumber>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -15,7 +15,8 @@ toVersion="$5"
|
||||
timePrefix="$6"
|
||||
actorPrefix="$7"
|
||||
nomsBinFormat="$8"
|
||||
issueNumber="$9"
|
||||
format="$9"
|
||||
issueNumber="${10}"
|
||||
|
||||
echo '
|
||||
{
|
||||
@@ -57,8 +58,9 @@ echo '
|
||||
"--results-prefix='$actorPrefix'",
|
||||
"--mysql-schema-file=schema.sql",
|
||||
"--nbf='$nomsBinFormat'",
|
||||
"--results-schema=results-schema.sql",
|
||||
"--results-schema=/results-schema.sql",
|
||||
"--issue-number='$issueNumber'",
|
||||
"--output='$format'",
|
||||
"--fileNames=100k-sorted.csv",
|
||||
"--fileNames=100k-random.csv",
|
||||
"--fileNames=1m-sorted.csv",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
set -e
|
||||
|
||||
if [ "$#" -lt 9 ]; then
|
||||
echo "Usage: ./get-mysql-dolt-job-json.sh <jobName> <fromServer> <fromVersion> <toServer> <toVersion> <timePrefix> <actorPrefix> <nomsBinFormat> <issueNumber>"
|
||||
echo "Usage: ./get-mysql-dolt-job-json.sh <jobName> <fromServer> <fromVersion> <toServer> <toVersion> <timePrefix> <actorPrefix> <nomsBinFormat> <format> <issueNumber>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -15,7 +15,8 @@ toVersion="$5"
|
||||
timePrefix="$6"
|
||||
actorPrefix="$7"
|
||||
nomsBinFormat="$8"
|
||||
issueNumber="$9"
|
||||
format="$9"
|
||||
issueNumber="${10}"
|
||||
|
||||
echo '
|
||||
{
|
||||
@@ -58,8 +59,9 @@ echo '
|
||||
"--mysql-exec=/usr/sbin/mysqld",
|
||||
"--mysql-schema-file=schema.sql",
|
||||
"--nbf='$nomsBinFormat'",
|
||||
"--results-schema=results-schema.sql",
|
||||
"--results-schema=/results-schema.sql",
|
||||
"--issue-number='$issueNumber'",
|
||||
"--output='$format'",
|
||||
"--fileNames=100k-sorted.csv",
|
||||
"--fileNames=100k-random.csv",
|
||||
"--fileNames=1m-sorted.csv",
|
||||
|
||||
@@ -43,6 +43,11 @@ timeprefix=$(date +%Y/%m/%d)
|
||||
|
||||
actorprefix="$MODE/$ACTOR/$actorShort"
|
||||
|
||||
format="markdown"
|
||||
if [[ "$MODE" = "release" || "$MODE" = "nightly" ]]; then
|
||||
format="html"
|
||||
fi
|
||||
|
||||
# set value to ISSUE_NUMBER environment variable
|
||||
# or default to -1
|
||||
issuenumber=${ISSUE_NUMBER:-"-1"}
|
||||
@@ -57,6 +62,7 @@ source \
|
||||
"$timeprefix" \
|
||||
"$actorprefix" \
|
||||
"$NOMS_BIN_FORMAT" \
|
||||
"$format" \
|
||||
"$issuenumber" > job.json
|
||||
|
||||
out=$(KUBECONFIG="$KUBECONFIG" kubectl apply -f job.json || true)
|
||||
|
||||
@@ -96,3 +96,4 @@ jobs:
|
||||
REPO_ACCESS_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
|
||||
KUBECONFIG: "./kubeconfig"
|
||||
TEMPLATE_SCRIPT: "./.github/scripts/import-benchmarking/get-dolt-dolt-job-json.sh"
|
||||
NOMS_BIN_FORMAT: "__LD_1__"
|
||||
|
||||
@@ -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.DoltEnvAsMultiEnv(ctx, dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -228,7 +228,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.DoltEnvAsMultiEnv(ctx, dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
+127
-43
@@ -36,6 +36,7 @@ import (
|
||||
"github.com/dolthub/vitess/go/vt/vterrors"
|
||||
"github.com/fatih/color"
|
||||
"github.com/flynn-archive/go-shlex"
|
||||
"gopkg.in/src-d/go-errors.v1"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/commands/engine"
|
||||
@@ -68,32 +69,39 @@ Multiple SQL statements must be separated by semicolons. Use {{.EmphasisLeft}}-b
|
||||
|
||||
Queries can be saved to the query catalog with {{.EmphasisLeft}}-s{{.EmphasisRight}}. Alternatively {{.EmphasisLeft}}-x{{.EmphasisRight}} can be used to execute a saved query by name.
|
||||
|
||||
By default this command uses the dolt database in the current working directory, as well as any dolt databases that are found in the current directory. Any databases created with CREATE DATABASE are placed in the current directory as well. Running with {{.EmphasisLeft}}--multi-db-dir <directory>{{.EmphasisRight}} uses each of the subdirectories of the supplied directory (each subdirectory must be a valid dolt data repository) as databases. Subdirectories starting with '.' are ignored.`,
|
||||
By default this command uses the dolt database in the current working directory, as well as any dolt databases that are found in the current directory. Any databases created with CREATE DATABASE are placed in the current directory as well. Running with {{.EmphasisLeft}}--data-dir <directory>{{.EmphasisRight}} uses each of the subdirectories of the supplied directory (each subdirectory must be a valid dolt data repository) as databases. Subdirectories starting with '.' are ignored.`,
|
||||
|
||||
Synopsis: []string{
|
||||
"",
|
||||
"< script.sql",
|
||||
"[--multi-db-dir {{.LessThan}}directory{{.GreaterThan}}] [-r {{.LessThan}}result format{{.GreaterThan}}]",
|
||||
"[--data-dir {{.LessThan}}directory{{.GreaterThan}}] [-r {{.LessThan}}result format{{.GreaterThan}}]",
|
||||
"-q {{.LessThan}}query{{.GreaterThan}} [-r {{.LessThan}}result format{{.GreaterThan}}] [-s {{.LessThan}}name{{.GreaterThan}} -m {{.LessThan}}message{{.GreaterThan}}] [-b]",
|
||||
"-q {{.LessThan}}query{{.GreaterThan}} --multi-db-dir {{.LessThan}}directory{{.GreaterThan}} [-r {{.LessThan}}result format{{.GreaterThan}}] [-b]",
|
||||
"-q {{.LessThan}}query{{.GreaterThan}} --data-dir {{.LessThan}}directory{{.GreaterThan}} [-r {{.LessThan}}result format{{.GreaterThan}}] [-b]",
|
||||
"-x {{.LessThan}}name{{.GreaterThan}}",
|
||||
"--list-saved",
|
||||
},
|
||||
}
|
||||
|
||||
var ErrMultipleDoltCfgDirs = errors.NewKind("multiple .doltcfg directories detected: '%s' and '%s'; pass one of the directories using option --doltcfg-dir")
|
||||
|
||||
const (
|
||||
QueryFlag = "query"
|
||||
FormatFlag = "result-format"
|
||||
saveFlag = "save"
|
||||
executeFlag = "execute"
|
||||
listSavedFlag = "list-saved"
|
||||
messageFlag = "message"
|
||||
BatchFlag = "batch"
|
||||
multiDBDirFlag = "multi-db-dir"
|
||||
continueFlag = "continue"
|
||||
fileInputFlag = "file"
|
||||
privilegeFilePathFlag = "privilege-file"
|
||||
welcomeMsg = `# Welcome to the DoltSQL shell.
|
||||
QueryFlag = "query"
|
||||
FormatFlag = "result-format"
|
||||
saveFlag = "save"
|
||||
executeFlag = "execute"
|
||||
listSavedFlag = "list-saved"
|
||||
messageFlag = "message"
|
||||
BatchFlag = "batch"
|
||||
DataDirFlag = "data-dir"
|
||||
MultiDBDirFlag = "multi-db-dir"
|
||||
CfgDirFlag = "doltcfg-dir"
|
||||
DefaultCfgDirName = ".doltcfg"
|
||||
PrivsFilePathFlag = "privilege-file"
|
||||
DefaultPrivsName = "privileges.db"
|
||||
continueFlag = "continue"
|
||||
fileInputFlag = "file"
|
||||
|
||||
welcomeMsg = `# Welcome to the DoltSQL shell.
|
||||
# Statements must be terminated with ';'.
|
||||
# "exit" or "quit" (or Ctrl-D) to exit.`
|
||||
)
|
||||
@@ -140,10 +148,12 @@ func (cmd SqlCmd) ArgParser() *argparser.ArgParser {
|
||||
ap.SupportsFlag(listSavedFlag, "l", "List all saved queries")
|
||||
ap.SupportsString(messageFlag, "m", "saved query description", "Used with --query and --save, saves the query with the descriptive message given. See also --name")
|
||||
ap.SupportsFlag(BatchFlag, "b", "Use to enable more efficient batch processing for large SQL import scripts consisting of only INSERT statements. Other statements types are not guaranteed to work in this mode.")
|
||||
ap.SupportsString(multiDBDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within ")
|
||||
ap.SupportsString(DataDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within. Defaults the the current directory.")
|
||||
ap.SupportsString(MultiDBDirFlag, "", "directory", "DEPRECATED: Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within. Defaults the the current directory.")
|
||||
ap.SupportsString(CfgDirFlag, "", "directory", "Defines a directory that contains configuration files for dolt. Defaults to $data-dir/.doltcfg.")
|
||||
ap.SupportsFlag(continueFlag, "c", "Continue running queries on an error. Used for batch mode only.")
|
||||
ap.SupportsString(fileInputFlag, "", "input file", "Execute statements from the file given")
|
||||
ap.SupportsString(privilegeFilePathFlag, "", "privilege file", "Path to a file to load and store users and grants. Without this flag, the database has a single user with all permissions, and more cannot be added.")
|
||||
ap.SupportsString(PrivsFilePathFlag, "", "privilege file", "Path to a file to load and store users and grants. Defaults to $doltcfg-dir/privileges.db")
|
||||
return ap
|
||||
}
|
||||
|
||||
@@ -153,7 +163,7 @@ func (cmd SqlCmd) EventType() eventsapi.ClientEventType {
|
||||
}
|
||||
|
||||
// RequiresRepo indicates that this command does not have to be run from within a dolt data repository directory.
|
||||
// In this case it is because this command supports the multiDBDirFlag which can pass in a directory. In the event that
|
||||
// In this case it is because this command supports the DataDirFlag which can pass in a directory. In the event that
|
||||
// that parameter is not provided there is additional error handling within this command to make sure that this was in
|
||||
// fact run from within a dolt data repository directory.
|
||||
func (cmd SqlCmd) RequiresRepo() bool {
|
||||
@@ -173,8 +183,6 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
}
|
||||
|
||||
privsFp, _ := apr.GetValue(privilegeFilePathFlag)
|
||||
|
||||
// We need a username and password for many SQL commands, so set defaults if they don't exist
|
||||
dEnv.Config.SetFailsafes(env.DefaultFailsafeConfig)
|
||||
|
||||
@@ -183,6 +191,71 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
}
|
||||
|
||||
var cfgDirPath string
|
||||
var dataDir string
|
||||
if multiDbDir, ok := apr.GetValue(MultiDBDirFlag); ok {
|
||||
dataDir = multiDbDir
|
||||
} else if dataDirPath, ok := apr.GetValue(DataDirFlag); ok {
|
||||
dataDir = dataDirPath
|
||||
}
|
||||
|
||||
cfgDir, cfgDirSpecified := apr.GetValue(CfgDirFlag)
|
||||
if cfgDirSpecified {
|
||||
if exists, _ := dEnv.FS.Exists(cfgDir); !exists {
|
||||
if err := dEnv.FS.MkDirs(cfgDir); err != nil {
|
||||
absPath, _ := dEnv.FS.Abs(cfgDir)
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(fmt.Errorf("couldn't create directory at %s", absPath)), usage)
|
||||
}
|
||||
}
|
||||
cfgDirPath = cfgDir
|
||||
} else if len(dataDir) != 0 {
|
||||
path := filepath.Join(dataDir, DefaultCfgDirName)
|
||||
if exists, _ := dEnv.FS.Exists(path); !exists {
|
||||
if err := dEnv.FS.MkDirs(path); err != nil {
|
||||
absPath, _ := dEnv.FS.Abs(path)
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(fmt.Errorf("couldn't create directory at %s", absPath)), usage)
|
||||
}
|
||||
}
|
||||
cfgDirPath = path
|
||||
} else {
|
||||
// Look in parent directory for doltcfg
|
||||
path := filepath.Join("..", DefaultCfgDirName)
|
||||
if exists, isDir := dEnv.FS.Exists(path); exists && isDir {
|
||||
cfgDirPath = path
|
||||
}
|
||||
|
||||
// Look in data directory (which is necessarily current directory) for doltcfg, create one here if none found
|
||||
path = filepath.Join(dataDir, DefaultCfgDirName)
|
||||
if exists, isDir := dEnv.FS.Exists(path); exists && isDir {
|
||||
if len(cfgDirPath) != 0 {
|
||||
p1, err := dEnv.FS.Abs(cfgDirPath)
|
||||
if err != nil {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
}
|
||||
p2, err := dEnv.FS.Abs(path)
|
||||
if err != nil {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
}
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(ErrMultipleDoltCfgDirs.New(p1, p2)), usage)
|
||||
}
|
||||
cfgDirPath = path
|
||||
} else if len(cfgDirPath) == 0 {
|
||||
if err := dEnv.FS.MkDirs(path); err != nil {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
}
|
||||
cfgDirPath = path
|
||||
}
|
||||
}
|
||||
|
||||
// If no privilege filepath specified, default to doltcfg directory
|
||||
privsFp, hasPrivsFp := apr.GetValue(PrivsFilePathFlag)
|
||||
if !hasPrivsFp {
|
||||
privsFp, err = dEnv.FS.Abs(filepath.Join(cfgDirPath, DefaultPrivsName))
|
||||
if err != nil {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
}
|
||||
}
|
||||
|
||||
initialRoots, err := mrEnv.GetWorkingRoots(ctx)
|
||||
if err != nil {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
@@ -205,7 +278,7 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE
|
||||
}
|
||||
|
||||
if query, queryOK := apr.GetValue(QueryFlag); queryOK {
|
||||
return queryMode(ctx, mrEnv, initialRoots, apr, query, currentDb, format, usage)
|
||||
return queryMode(ctx, mrEnv, initialRoots, apr, query, currentDb, format, usage, privsFp)
|
||||
} else if savedQueryName, exOk := apr.GetValue(executeFlag); exOk {
|
||||
return savedQueryMode(ctx, mrEnv, initialRoots, savedQueryName, currentDb, format, usage, privsFp)
|
||||
} else if apr.Contains(listSavedFlag) {
|
||||
@@ -309,6 +382,7 @@ func queryMode(
|
||||
currentDb string,
|
||||
format engine.PrintResultFormat,
|
||||
usage cli.UsagePrinter,
|
||||
privsFp string,
|
||||
) int {
|
||||
|
||||
// query mode has 3 sub modes:
|
||||
@@ -320,7 +394,6 @@ func queryMode(
|
||||
|
||||
_, continueOnError := apr.GetValue(continueFlag)
|
||||
|
||||
privsFp, _ := apr.GetValue(privilegeFilePathFlag)
|
||||
if saveName != "" {
|
||||
verr := execQuery(ctx, mrEnv, query, format, currentDb, privsFp)
|
||||
if verr != nil {
|
||||
@@ -358,20 +431,22 @@ func queryMode(
|
||||
|
||||
// getMultiRepoEnv returns an appropriate MultiRepoEnv for this invocation of the command
|
||||
func getMultiRepoEnv(ctx context.Context, apr *argparser.ArgParseResults, dEnv *env.DoltEnv, cmd SqlCmd) (*env.MultiRepoEnv, errhand.VerboseError) {
|
||||
var mrEnv *env.MultiRepoEnv
|
||||
multiDir, multiDbMode := apr.GetValue(multiDBDirFlag)
|
||||
if multiDbMode {
|
||||
var err error
|
||||
mrEnv, err = env.LoadMultiEnvFromDir(ctx, env.GetCurrentUserHomeDir, dEnv.Config.WriteableConfig(), dEnv.FS, multiDir, cmd.VersionStr, dEnv.IgnoreLockFile)
|
||||
if err != nil {
|
||||
return nil, errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
} else {
|
||||
var err error
|
||||
mrEnv, err = env.DoltEnvAsMultiEnv(ctx, dEnv)
|
||||
if err != nil {
|
||||
return nil, errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
var err error
|
||||
fs := dEnv.FS
|
||||
|
||||
if dataDir, ok := apr.GetValue(MultiDBDirFlag); ok {
|
||||
fs, err = fs.WithWorkingDir(dataDir)
|
||||
} else if dataDir, ok := apr.GetValue(DataDirFlag); ok {
|
||||
fs, err = fs.WithWorkingDir(dataDir)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
|
||||
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), fs, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
if err != nil {
|
||||
return nil, errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
|
||||
return mrEnv, nil
|
||||
@@ -635,12 +710,17 @@ func validateSqlArgs(apr *argparser.ArgParseResults) error {
|
||||
_, batch := apr.GetValue(BatchFlag)
|
||||
_, list := apr.GetValue(listSavedFlag)
|
||||
_, execute := apr.GetValue(executeFlag)
|
||||
_, multiDB := apr.GetValue(multiDBDirFlag)
|
||||
_, dataDir := apr.GetValue(DataDirFlag)
|
||||
_, multiDbDir := apr.GetValue(MultiDBDirFlag)
|
||||
|
||||
if len(apr.Args) > 0 && !query {
|
||||
return errhand.BuildDError("Invalid Argument: use --query or -q to pass inline SQL queries").Build()
|
||||
}
|
||||
|
||||
if dataDir && multiDbDir {
|
||||
return errhand.BuildDError("Invalid Argument: --data-dir is not compatible with --multi-db-dir").Build()
|
||||
}
|
||||
|
||||
if execute {
|
||||
if list {
|
||||
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --list-saved").Build()
|
||||
@@ -650,8 +730,8 @@ func validateSqlArgs(apr *argparser.ArgParseResults) error {
|
||||
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --message|-m").Build()
|
||||
} else if save {
|
||||
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --save|-s").Build()
|
||||
} else if multiDB {
|
||||
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --multi-db-dir").Build()
|
||||
} else if dataDir || multiDbDir {
|
||||
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --data-dir").Build()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -664,13 +744,13 @@ func validateSqlArgs(apr *argparser.ArgParseResults) error {
|
||||
return errhand.BuildDError("Invalid Argument: --list-saved is not compatible with --message|-m").Build()
|
||||
} else if save {
|
||||
return errhand.BuildDError("Invalid Argument: --list-saved is not compatible with --save|-s").Build()
|
||||
} else if multiDB {
|
||||
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --multi-db-dir").Build()
|
||||
} else if dataDir || multiDbDir {
|
||||
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --data-dir").Build()
|
||||
}
|
||||
}
|
||||
|
||||
if save && multiDB {
|
||||
return errhand.BuildDError("Invalid Argument: --multi-db-dir queries cannot be saved").Build()
|
||||
if save && (dataDir || multiDbDir) {
|
||||
return errhand.BuildDError("Invalid Argument: --data-dir queries cannot be saved").Build()
|
||||
}
|
||||
|
||||
if batch {
|
||||
@@ -692,6 +772,10 @@ func validateSqlArgs(apr *argparser.ArgParseResults) error {
|
||||
}
|
||||
}
|
||||
|
||||
if multiDbDir {
|
||||
cli.PrintErrln("WARNING: --multi-db-dir is deprecated, use --data-dir instead")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -85,30 +85,23 @@ func Serve(
|
||||
}
|
||||
|
||||
var mrEnv *env.MultiRepoEnv
|
||||
dbNamesAndPaths := serverConfig.DatabaseNamesAndPaths()
|
||||
var err error
|
||||
fs := dEnv.FS
|
||||
|
||||
dbNamesAndPaths := serverConfig.DatabaseNamesAndPaths()
|
||||
if len(dbNamesAndPaths) == 0 {
|
||||
if len(serverConfig.DataDir()) > 0 && serverConfig.DataDir() != "." {
|
||||
fs, err := dEnv.FS.WithWorkingDir(serverConfig.DataDir())
|
||||
if err != nil {
|
||||
return err, nil
|
||||
}
|
||||
|
||||
// TODO: this should be the global config, probably?
|
||||
mrEnv, err = env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), fs, dEnv.Version, dEnv.IgnoreLockFile)
|
||||
if err != nil {
|
||||
return err, nil
|
||||
}
|
||||
} else {
|
||||
var err error
|
||||
mrEnv, err = env.DoltEnvAsMultiEnv(ctx, dEnv)
|
||||
fs, err = dEnv.FS.WithWorkingDir(serverConfig.DataDir())
|
||||
if err != nil {
|
||||
return err, nil
|
||||
}
|
||||
}
|
||||
|
||||
mrEnv, err = env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), fs, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
if err != nil {
|
||||
return err, nil
|
||||
}
|
||||
} else {
|
||||
var err error
|
||||
fs := dEnv.FS
|
||||
if len(serverConfig.DataDir()) > 0 {
|
||||
fs, err = fs.WithWorkingDir(serverConfig.DataDir())
|
||||
if err != nil {
|
||||
@@ -116,8 +109,15 @@ func Serve(
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: this should be the global config, probably?
|
||||
mrEnv, err = env.LoadMultiEnv(ctx, env.GetCurrentUserHomeDir, dEnv.Config.WriteableConfig(), fs, version, dEnv.IgnoreLockFile, dbNamesAndPaths...)
|
||||
mrEnv, err = env.MultiEnvForPaths(
|
||||
ctx,
|
||||
env.GetCurrentUserHomeDir,
|
||||
dEnv.Config.WriteableConfig(),
|
||||
fs,
|
||||
version,
|
||||
dEnv.IgnoreLockFile,
|
||||
dbNamesAndPaths...,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return err, nil
|
||||
|
||||
@@ -47,6 +47,8 @@ const (
|
||||
defaultQueryParallelism = 2
|
||||
defaultPersistenceBahavior = loadPerisistentGlobals
|
||||
defaultDataDir = "."
|
||||
defaultCfgDir = "./.doltcfg"
|
||||
defaultPrivilegeFilePath = "./.doltcfg/privileges.db"
|
||||
defaultMetricsHost = ""
|
||||
defaultMetricsPort = -1
|
||||
)
|
||||
@@ -102,6 +104,8 @@ type ServerConfig interface {
|
||||
DatabaseNamesAndPaths() []env.EnvNameAndPath
|
||||
// DataDir is the path to a directory to use as the data dir, both to create new databases and locate existing ones.
|
||||
DataDir() string
|
||||
// CfgDir is the path to a directory to use to store the dolt configuration files.
|
||||
CfgDir() string
|
||||
// MaxConnections returns the maximum number of simultaneous connections the server will allow. The default is 1
|
||||
MaxConnections() uint64
|
||||
// QueryParallelism returns the parallelism that should be used by the go-mysql-server analyzer
|
||||
@@ -139,6 +143,7 @@ type commandLineServerConfig struct {
|
||||
logLevel LogLevel
|
||||
dbNamesAndPaths []env.EnvNameAndPath
|
||||
dataDir string
|
||||
cfgDir string
|
||||
autoCommit bool
|
||||
maxConnections uint64
|
||||
queryParallelism int
|
||||
@@ -258,6 +263,10 @@ func (cfg *commandLineServerConfig) DataDir() string {
|
||||
return cfg.dataDir
|
||||
}
|
||||
|
||||
func (cfg *commandLineServerConfig) CfgDir() string {
|
||||
return cfg.cfgDir
|
||||
}
|
||||
|
||||
// withHost updates the host and returns the called `*commandLineServerConfig`, which is useful for chaining calls.
|
||||
func (cfg *commandLineServerConfig) withHost(host string) *commandLineServerConfig {
|
||||
cfg.host = host
|
||||
@@ -323,6 +332,11 @@ func (cfg *commandLineServerConfig) withDataDir(dataDir string) *commandLineServ
|
||||
return cfg
|
||||
}
|
||||
|
||||
func (cfg *commandLineServerConfig) withCfgDir(cfgDir string) *commandLineServerConfig {
|
||||
cfg.cfgDir = cfgDir
|
||||
return cfg
|
||||
}
|
||||
|
||||
func (cfg *commandLineServerConfig) withPersistenceBehavior(persistenceBehavior string) *commandLineServerConfig {
|
||||
cfg.persistenceBehavior = persistenceBehavior
|
||||
return cfg
|
||||
@@ -348,6 +362,8 @@ func DefaultServerConfig() *commandLineServerConfig {
|
||||
queryParallelism: defaultQueryParallelism,
|
||||
persistenceBehavior: defaultPersistenceBahavior,
|
||||
dataDir: defaultDataDir,
|
||||
cfgDir: defaultCfgDir,
|
||||
privilegeFilePath: defaultPrivilegeFilePath,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ You may also start a dolt server and automatically connect to it using this clie
|
||||
Similar to {{.EmphasisLeft}}dolt sql-server{{.EmphasisRight}}, this command may use a YAML configuration file or command line arguments. For more information on the YAML file, refer to the documentation on {{.EmphasisLeft}}dolt sql-server{{.EmphasisRight}}.`,
|
||||
Synopsis: []string{
|
||||
"[-d] --config {{.LessThan}}file{{.GreaterThan}}",
|
||||
"[-d] [-H {{.LessThan}}host{{.GreaterThan}}] [-P {{.LessThan}}port{{.GreaterThan}}] [-u {{.LessThan}}user{{.GreaterThan}}] [-p {{.LessThan}}password{{.GreaterThan}}] [-t {{.LessThan}}timeout{{.GreaterThan}}] [-l {{.LessThan}}loglevel{{.GreaterThan}}] [--multi-db-dir {{.LessThan}}directory{{.GreaterThan}}] [--query-parallelism {{.LessThan}}num-go-routines{{.GreaterThan}}] [-r]",
|
||||
"[-d] [-H {{.LessThan}}host{{.GreaterThan}}] [-P {{.LessThan}}port{{.GreaterThan}}] [-u {{.LessThan}}user{{.GreaterThan}}] [-p {{.LessThan}}password{{.GreaterThan}}] [-t {{.LessThan}}timeout{{.GreaterThan}}] [-l {{.LessThan}}loglevel{{.GreaterThan}}] [--data-dir {{.LessThan}}directory{{.GreaterThan}}] [--query-parallelism {{.LessThan}}num-go-routines{{.GreaterThan}}] [-r]",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -112,6 +112,11 @@ func (cmd SqlClientCmd) Exec(ctx context.Context, commandStr string, args []stri
|
||||
cli.PrintErrln(err.Error())
|
||||
return 1
|
||||
}
|
||||
if err = SetupDoltConfig(dEnv, apr, serverConfig); err != nil {
|
||||
cli.PrintErrln(color.RedString("Bad Configuration"))
|
||||
cli.PrintErrln(err.Error())
|
||||
return 1
|
||||
}
|
||||
cli.PrintErrf("Starting server with Config %v\n", ConfigInfo(serverConfig))
|
||||
|
||||
serverController = NewServerController()
|
||||
|
||||
@@ -18,6 +18,7 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
@@ -25,6 +26,7 @@ import (
|
||||
"github.com/fatih/color"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/commands"
|
||||
eventsapi "github.com/dolthub/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/argparser"
|
||||
@@ -39,13 +41,11 @@ const (
|
||||
timeoutFlag = "timeout"
|
||||
readonlyFlag = "readonly"
|
||||
logLevelFlag = "loglevel"
|
||||
multiDBDirFlag = "multi-db-dir"
|
||||
noAutoCommitFlag = "no-auto-commit"
|
||||
configFileFlag = "config"
|
||||
queryParallelismFlag = "query-parallelism"
|
||||
maxConnectionsFlag = "max-connections"
|
||||
persistenceBehaviorFlag = "persistence-behavior"
|
||||
privilegeFilePathFlag = "privilege-file"
|
||||
)
|
||||
|
||||
func indentLines(s string) string {
|
||||
@@ -102,7 +102,7 @@ SUPPORTED CONFIG FILE FIELDS:
|
||||
If a config file is not provided many of these settings may be configured on the command line.`,
|
||||
Synopsis: []string{
|
||||
"--config {{.LessThan}}file{{.GreaterThan}}",
|
||||
"[-H {{.LessThan}}host{{.GreaterThan}}] [-P {{.LessThan}}port{{.GreaterThan}}] [-u {{.LessThan}}user{{.GreaterThan}}] [-p {{.LessThan}}password{{.GreaterThan}}] [-t {{.LessThan}}timeout{{.GreaterThan}}] [-l {{.LessThan}}loglevel{{.GreaterThan}}] [--multi-db-dir {{.LessThan}}directory{{.GreaterThan}}] [--query-parallelism {{.LessThan}}num-go-routines{{.GreaterThan}}] [-r]",
|
||||
"[-H {{.LessThan}}host{{.GreaterThan}}] [-P {{.LessThan}}port{{.GreaterThan}}] [-u {{.LessThan}}user{{.GreaterThan}}] [-p {{.LessThan}}password{{.GreaterThan}}] [-t {{.LessThan}}timeout{{.GreaterThan}}] [-l {{.LessThan}}loglevel{{.GreaterThan}}] [--data-dir {{.LessThan}}directory{{.GreaterThan}}] [--query-parallelism {{.LessThan}}num-go-routines{{.GreaterThan}}] [-r]",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -137,12 +137,14 @@ func (cmd SqlServerCmd) ArgParser() *argparser.ArgParser {
|
||||
ap.SupportsInt(timeoutFlag, "t", "connection timeout", fmt.Sprintf("Defines the timeout, in seconds, used for connections\nA value of `0` represents an infinite timeout (default `%v`)", serverConfig.ReadTimeout()))
|
||||
ap.SupportsFlag(readonlyFlag, "r", "Disable modification of the database")
|
||||
ap.SupportsString(logLevelFlag, "l", "log level", fmt.Sprintf("Defines the level of logging provided\nOptions are: `trace', `debug`, `info`, `warning`, `error`, `fatal` (default `%v`)", serverConfig.LogLevel()))
|
||||
ap.SupportsString(multiDBDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases.")
|
||||
ap.SupportsString(commands.DataDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within. Defaults the the current directory.")
|
||||
ap.SupportsString(commands.MultiDBDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within. Defaults the the current directory. This is deprecated, you should use --data-dir instead.")
|
||||
ap.SupportsString(commands.CfgDirFlag, "", "directory", "Defines a directory that contains configuration files for dolt. Defaults to $data-dir/.doltcfg.")
|
||||
ap.SupportsFlag(noAutoCommitFlag, "", "Set @@autocommit = off for the server")
|
||||
ap.SupportsInt(queryParallelismFlag, "", "num-go-routines", fmt.Sprintf("Set the number of go routines spawned to handle each query (default `%d`)", serverConfig.QueryParallelism()))
|
||||
ap.SupportsInt(maxConnectionsFlag, "", "max-connections", fmt.Sprintf("Set the number of connections handled by the server (default `%d`)", serverConfig.MaxConnections()))
|
||||
ap.SupportsString(persistenceBehaviorFlag, "", "persistence-behavior", fmt.Sprintf("Indicate whether to `load` or `ignore` persisted global variables (default `%s`)", serverConfig.PersistenceBehavior()))
|
||||
ap.SupportsString(privilegeFilePathFlag, "", "privilege file", "Path to a file to load and store users and grants. Without this flag, the database has a single user with all permissions, and more cannot be added.")
|
||||
ap.SupportsString(commands.PrivsFilePathFlag, "", "privilege file", "Path to a file to load and store users and grants. Defaults to $doltcfg-dir/privileges.db")
|
||||
return ap
|
||||
}
|
||||
|
||||
@@ -152,7 +154,7 @@ func (cmd SqlServerCmd) EventType() eventsapi.ClientEventType {
|
||||
}
|
||||
|
||||
// RequiresRepo indicates that this command does not have to be run from within a dolt data repository directory.
|
||||
// In this case it is because this command supports the multiDBDirFlag which can pass in a directory. In the event that
|
||||
// In this case it is because this command supports the dataDirFlag which can pass in a directory. In the event that
|
||||
// that parameter is not provided there is additional error handling within this command to make sure that this was in
|
||||
// fact run from within a dolt data repository directory.
|
||||
func (cmd SqlServerCmd) RequiresRepo() bool {
|
||||
@@ -171,6 +173,14 @@ func (cmd SqlServerCmd) Exec(ctx context.Context, commandStr string, args []stri
|
||||
return startServer(newCtx, cmd.VersionStr, commandStr, args, dEnv, controller)
|
||||
}
|
||||
|
||||
func validateSqlServerArgs(apr *argparser.ArgParseResults) error {
|
||||
_, multiDbDir := apr.GetValue(commands.MultiDBDirFlag)
|
||||
if multiDbDir {
|
||||
cli.PrintErrln("WARNING: --multi-db-dir is deprecated, use --data-dir instead")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func startServer(ctx context.Context, versionStr, commandStr string, args []string, dEnv *env.DoltEnv, serverController *ServerController) int {
|
||||
ap := SqlServerCmd{}.ArgParser()
|
||||
help, _ := cli.HelpAndUsagePrinters(cli.CommandDocsForCommandString(commandStr, sqlServerDocs, ap))
|
||||
@@ -179,8 +189,10 @@ func startServer(ctx context.Context, versionStr, commandStr string, args []stri
|
||||
dEnv.Config.SetFailsafes(env.DefaultFailsafeConfig)
|
||||
|
||||
apr := cli.ParseArgsOrDie(ap, args, help)
|
||||
if err := validateSqlServerArgs(apr); err != nil {
|
||||
return 1
|
||||
}
|
||||
serverConfig, err := GetServerConfig(dEnv, apr)
|
||||
|
||||
if err != nil {
|
||||
if serverController != nil {
|
||||
serverController.StopServer()
|
||||
@@ -191,6 +203,16 @@ func startServer(ctx context.Context, versionStr, commandStr string, args []stri
|
||||
cli.PrintErrln(err.Error())
|
||||
return 1
|
||||
}
|
||||
if err = SetupDoltConfig(dEnv, apr, serverConfig); err != nil {
|
||||
if serverController != nil {
|
||||
serverController.StopServer()
|
||||
serverController.serverStopped(err)
|
||||
}
|
||||
|
||||
cli.PrintErrln(color.RedString("Failed to start server. Bad Configuration"))
|
||||
cli.PrintErrln(err.Error())
|
||||
return 1
|
||||
}
|
||||
|
||||
cli.PrintErrf("Starting server with Config %v\n", ConfigInfo(serverConfig))
|
||||
|
||||
@@ -216,6 +238,79 @@ func GetServerConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResults) (ServerC
|
||||
return getCommandLineServerConfig(dEnv, apr)
|
||||
}
|
||||
|
||||
// SetupDoltConfig updates the given server config with where to create .doltcfg directory
|
||||
func SetupDoltConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResults, config ServerConfig) error {
|
||||
if _, ok := apr.GetValue(configFileFlag); ok {
|
||||
return nil
|
||||
}
|
||||
serverConfig := config.(*commandLineServerConfig)
|
||||
|
||||
_, dataDirFlag1 := apr.GetValue(commands.MultiDBDirFlag)
|
||||
_, dataDirFlag2 := apr.GetValue(commands.DataDirFlag)
|
||||
dataDirSpecified := dataDirFlag1 || dataDirFlag2
|
||||
|
||||
var cfgDirPath string
|
||||
dataDir := serverConfig.DataDir()
|
||||
cfgDir, cfgDirSpecified := apr.GetValue(commands.CfgDirFlag)
|
||||
if cfgDirSpecified {
|
||||
if exists, _ := dEnv.FS.Exists(cfgDir); !exists {
|
||||
if err := dEnv.FS.MkDirs(cfgDir); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
cfgDirPath = cfgDir
|
||||
} else if dataDirSpecified {
|
||||
path := filepath.Join(dataDir, commands.DefaultCfgDirName)
|
||||
if exists, _ := dEnv.FS.Exists(path); !exists {
|
||||
if err := dEnv.FS.MkDirs(path); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
cfgDirPath = path
|
||||
} else {
|
||||
// Look in parent directory for doltcfg
|
||||
path := filepath.Join("..", commands.DefaultCfgDirName)
|
||||
if exists, isDir := dEnv.FS.Exists(path); exists && isDir {
|
||||
cfgDirPath = path
|
||||
}
|
||||
|
||||
// Look in data directory (which is necessarily current directory) for doltcfg, create one here if none found
|
||||
path = filepath.Join(dataDir, commands.DefaultCfgDirName)
|
||||
if exists, isDir := dEnv.FS.Exists(path); exists && isDir {
|
||||
if len(cfgDirPath) != 0 {
|
||||
p1, err := dEnv.FS.Abs(cfgDirPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
p2, err := dEnv.FS.Abs(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return commands.ErrMultipleDoltCfgDirs.New(p1, p2)
|
||||
}
|
||||
cfgDirPath = path
|
||||
} else if len(cfgDirPath) == 0 {
|
||||
if err := dEnv.FS.MkDirs(path); err != nil {
|
||||
return err
|
||||
}
|
||||
cfgDirPath = path
|
||||
}
|
||||
}
|
||||
serverConfig.withCfgDir(cfgDirPath)
|
||||
|
||||
if privsFp, ok := apr.GetValue(commands.PrivsFilePathFlag); ok {
|
||||
serverConfig.withPrivilegeFilePath(privsFp)
|
||||
} else {
|
||||
path, err := dEnv.FS.Abs(filepath.Join(cfgDirPath, commands.DefaultPrivsName))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
serverConfig.withPrivilegeFilePath(path)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getCommandLineServerConfig sets server config variables and persisted global variables with values defined on command line.
|
||||
// If not defined, it sets variables to default values.
|
||||
func getCommandLineServerConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResults) (ServerConfig, error) {
|
||||
@@ -268,16 +363,24 @@ func getCommandLineServerConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResult
|
||||
serverConfig.withLogLevel(LogLevel(logLevel))
|
||||
}
|
||||
|
||||
if multiDBDir, ok := apr.GetValue(multiDBDirFlag); ok {
|
||||
dbNamesAndPaths, err := env.DBNamesAndPathsFromDir(dEnv.FS, multiDBDir)
|
||||
if dataDir, ok := apr.GetValue(commands.MultiDBDirFlag); ok {
|
||||
dbNamesAndPaths, err := env.DBNamesAndPathsFromDir(dEnv.FS, dataDir)
|
||||
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to read databases in path specified by --multi-db-dir. error: " + err.Error())
|
||||
return nil, errors.New("failed to read databases in path specified by --data-dir. error: " + err.Error())
|
||||
}
|
||||
|
||||
// We set datadir to multi-db-dir here too
|
||||
// TODO: rename multi-db-dir to data_dir
|
||||
serverConfig.withDBNamesAndPaths(dbNamesAndPaths).withDataDir(multiDBDir)
|
||||
serverConfig.withDBNamesAndPaths(dbNamesAndPaths).withDataDir(dataDir)
|
||||
}
|
||||
|
||||
if dataDir, ok := apr.GetValue(commands.DataDirFlag); ok {
|
||||
dbNamesAndPaths, err := env.DBNamesAndPathsFromDir(dEnv.FS, dataDir)
|
||||
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to read databases in path specified by --data-dir. error: " + err.Error())
|
||||
}
|
||||
|
||||
serverConfig.withDBNamesAndPaths(dbNamesAndPaths).withDataDir(dataDir)
|
||||
}
|
||||
|
||||
if queryParallelism, ok := apr.GetInt(queryParallelismFlag); ok {
|
||||
@@ -293,9 +396,6 @@ func getCommandLineServerConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResult
|
||||
}
|
||||
|
||||
serverConfig.autoCommit = !apr.Contains(noAutoCommitFlag)
|
||||
if privilegeFilePath, ok := apr.GetValue(privilegeFilePathFlag); ok {
|
||||
serverConfig.withPrivilegeFilePath(privilegeFilePath)
|
||||
}
|
||||
|
||||
return serverConfig, nil
|
||||
}
|
||||
|
||||
@@ -121,6 +121,7 @@ type YAMLConfig struct {
|
||||
DatabaseConfig []DatabaseYAMLConfig `yaml:"databases"`
|
||||
PerformanceConfig PerformanceYAMLConfig `yaml:"performance"`
|
||||
DataDirStr *string `yaml:"data_dir"`
|
||||
CfgDirStr *string `yaml:"cfg_dir"`
|
||||
MetricsConfig MetricsYAMLConfig `yaml:"metrics"`
|
||||
PrivilegeFile *string `yaml:"privilege_file"`
|
||||
Vars []UserSessionVars `yaml:"user_session_vars"`
|
||||
@@ -381,3 +382,10 @@ func (cfg YAMLConfig) DataDir() string {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (cfg YAMLConfig) CfgDir() string {
|
||||
if cfg.CfgDirStr != nil {
|
||||
return *cfg.DataDirStr
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/dolthub/go-mysql-server v0.12.1-0.20220713232319-7ff7cdf2c557
|
||||
github.com/dolthub/go-mysql-server v0.12.1-0.20220714001054-da066833dd8f
|
||||
github.com/google/flatbuffers v2.0.6+incompatible
|
||||
github.com/gosuri/uilive v0.0.4
|
||||
github.com/kch42/buzhash v0.0.0-20160816060738-9bdec3dec7c6
|
||||
|
||||
@@ -173,8 +173,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/dolthub/fslock v0.0.3 h1:iLMpUIvJKMKm92+N1fmHVdxJP5NdyDK5bK7z7Ba2s2U=
|
||||
github.com/dolthub/fslock v0.0.3/go.mod h1:QWql+P17oAAMLnL4HGB5tiovtDuAjdDTPbuqx7bYfa0=
|
||||
github.com/dolthub/go-mysql-server v0.12.1-0.20220713232319-7ff7cdf2c557 h1:1nkWy/hLg1MecgiI7N6Y61I/mbw2Yer1hEDGvPIeyvU=
|
||||
github.com/dolthub/go-mysql-server v0.12.1-0.20220713232319-7ff7cdf2c557/go.mod h1:fhyVDvV0K59cdk9N7TQsPjr2Hp/Qseej8+R9tVqPDCg=
|
||||
github.com/dolthub/go-mysql-server v0.12.1-0.20220714001054-da066833dd8f h1:ELaJt6/rpR1bIafRJriYeLjIv+P6Gg3DV2IaKRQ8RQY=
|
||||
github.com/dolthub/go-mysql-server v0.12.1-0.20220714001054-da066833dd8f/go.mod h1:fhyVDvV0K59cdk9N7TQsPjr2Hp/Qseej8+R9tVqPDCg=
|
||||
github.com/dolthub/ishell v0.0.0-20220112232610-14e753f0f371 h1:oyPHJlzumKta1vnOQqUnfdz+pk3EmnHS3Nd0cCT0I2g=
|
||||
github.com/dolthub/ishell v0.0.0-20220112232610-14e753f0f371/go.mod h1:dhGBqcCEfK5kuFmeO5+WOx3hqc1k3M29c1oS/R7N4ms=
|
||||
github.com/dolthub/jsonpath v0.0.0-20210609232853-d49537a30474 h1:xTrR+l5l+1Lfq0NvhiEsctylXinUMFhhsqaEcl414p8=
|
||||
@@ -236,7 +236,6 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
||||
|
||||
@@ -43,7 +43,7 @@ var DoltDataDir = filepath.Join(DoltDir, DataDir)
|
||||
type FileFactory struct {
|
||||
}
|
||||
|
||||
// CreateDB creates an local filesys backed database
|
||||
// CreateDB creates a local filesys backed database
|
||||
func (fact FileFactory) CreateDB(ctx context.Context, nbf *types.NomsBinFormat, urlObj *url.URL, params map[string]interface{}) (datas.Database, types.ValueReadWriter, tree.NodeStore, error) {
|
||||
path, err := url.PathUnescape(urlObj.Path)
|
||||
|
||||
|
||||
+27
-104
@@ -17,7 +17,6 @@ package env
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
@@ -25,7 +24,6 @@ import (
|
||||
|
||||
"gopkg.in/src-d/go-errors.v1"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/dbfactory"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/config"
|
||||
@@ -228,80 +226,6 @@ func getRepoRootDir(path, pathSeparator string) string {
|
||||
return name
|
||||
}
|
||||
|
||||
// DoltEnvAsMultiEnv returns a MultiRepoEnv which wraps the DoltEnv and names it based on the directory DoltEnv refers
|
||||
// to. If the env given doesn't contain a valid dolt database, creates a MultiEnvRepo from any databases found in the
|
||||
// directory at the root of the filesystem and returns that.
|
||||
func DoltEnvAsMultiEnv(ctx context.Context, dEnv *DoltEnv) (*MultiRepoEnv, error) {
|
||||
if !dEnv.Valid() {
|
||||
cfg := dEnv.Config.WriteableConfig()
|
||||
return MultiEnvForDirectory(ctx, cfg, dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile)
|
||||
}
|
||||
|
||||
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 {
|
||||
if u.Scheme == dbfactory.FileScheme {
|
||||
path, err := url.PathUnescape(u.Path)
|
||||
|
||||
if err == nil {
|
||||
path, err = dEnv.FS.Abs(path)
|
||||
|
||||
if err == nil {
|
||||
dirName := getRepoRootDir(path, string(os.PathSeparator))
|
||||
|
||||
if dirName != "" {
|
||||
dbName = dirToDBName(dirName)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: revisit this, callers should specify which config they want to use in a multi-DB environment
|
||||
localCfg := dEnv.Config.WriteableConfig()
|
||||
|
||||
mrEnv := &MultiRepoEnv{
|
||||
envs: make([]NamedEnv, 0),
|
||||
fs: dEnv.FS,
|
||||
cfg: localCfg,
|
||||
}
|
||||
|
||||
mrEnv.AddEnv(dbName, dEnv)
|
||||
|
||||
// If there are other directories in the same root, try to load them as additional databases
|
||||
dEnv.FS.Iter(".", false, func(path string, size int64, isDir bool) (stop bool) {
|
||||
if !isDir {
|
||||
return false
|
||||
}
|
||||
|
||||
dir := filepath.Base(path)
|
||||
|
||||
newFs, err := dEnv.FS.WithWorkingDir(dir)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
newEnv := Load(ctx, GetCurrentUserHomeDir, newFs, doltdb.LocalDirDoltDB, dEnv.Version)
|
||||
if newEnv.Valid() {
|
||||
mrEnv.AddEnv(dirToDBName(dir), newEnv)
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
return mrEnv, nil
|
||||
}
|
||||
|
||||
// MultiEnvForDirectory returns a MultiRepoEnv for the directory rooted at the file system given
|
||||
func MultiEnvForDirectory(
|
||||
ctx context.Context,
|
||||
@@ -309,6 +233,7 @@ func MultiEnvForDirectory(
|
||||
fs filesys.Filesys,
|
||||
version string,
|
||||
ignoreLockFile bool,
|
||||
oldDEnv *DoltEnv, // TODO: eventually get rid of this
|
||||
) (*MultiRepoEnv, error) {
|
||||
mrEnv := &MultiRepoEnv{
|
||||
envs: make([]NamedEnv, 0),
|
||||
@@ -317,6 +242,29 @@ func MultiEnvForDirectory(
|
||||
ignoreLockFile: ignoreLockFile,
|
||||
}
|
||||
|
||||
// Load current fs and put into mr env
|
||||
var dEnv *DoltEnv
|
||||
var dbName string
|
||||
// Only directly copy the oldDEnv for in-memory filesystems; something is wrong with loading them
|
||||
if _, ok := fs.(*filesys.InMemFS); ok {
|
||||
dbName = "dolt"
|
||||
dEnv = oldDEnv
|
||||
} else {
|
||||
path, err := fs.Abs("")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
envName := getRepoRootDir(path, string(os.PathSeparator))
|
||||
dbName = dirToDBName(envName)
|
||||
dEnv = oldDEnv
|
||||
// TODO: idk how or why, but this breaks docs.bats
|
||||
//dEnv = Load(ctx, GetCurrentUserHomeDir, fs, doltdb.LocalDirDoltDB, version)
|
||||
}
|
||||
|
||||
if dEnv.Valid() {
|
||||
mrEnv.AddEnv(dbName, dEnv)
|
||||
}
|
||||
|
||||
// If there are other directories in the directory, try to load them as additional databases
|
||||
fs.Iter(".", false, func(path string, size int64, isDir bool) (stop bool) {
|
||||
if !isDir {
|
||||
@@ -330,7 +278,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)
|
||||
}
|
||||
@@ -341,9 +289,9 @@ func MultiEnvForDirectory(
|
||||
return mrEnv, nil
|
||||
}
|
||||
|
||||
// LoadMultiEnv takes a variable list of EnvNameAndPath objects loads each of the environments, and returns a new
|
||||
// MultiEnvForPaths takes a variable list of EnvNameAndPath objects loads each of the environments, and returns a new
|
||||
// MultiRepoEnv
|
||||
func LoadMultiEnv(
|
||||
func MultiEnvForPaths(
|
||||
ctx context.Context,
|
||||
hdp HomeDirProvider,
|
||||
cfg config.ReadWriteConfig,
|
||||
@@ -427,31 +375,6 @@ func DBNamesAndPathsFromDir(fs filesys.Filesys, path string) ([]EnvNameAndPath,
|
||||
return envNamesAndPaths, nil
|
||||
}
|
||||
|
||||
// LoadMultiEnvFromDir looks at each subfolder of the given path as a Dolt repository and attempts to return a MultiRepoEnv
|
||||
// with initialized environments for each of those subfolder data repositories. subfolders whose name starts with '.' are
|
||||
// skipped.
|
||||
func LoadMultiEnvFromDir(
|
||||
ctx context.Context,
|
||||
hdp HomeDirProvider,
|
||||
cfg config.ReadWriteConfig,
|
||||
fs filesys.Filesys,
|
||||
path, version string,
|
||||
ignoreLockFile bool,
|
||||
) (*MultiRepoEnv, error) {
|
||||
envNamesAndPaths, err := DBNamesAndPathsFromDir(fs, path)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
multiDbDirFs, err := fs.WithWorkingDir(path)
|
||||
if err != nil {
|
||||
return nil, errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
|
||||
return LoadMultiEnv(ctx, hdp, cfg, multiDbDirFs, version, ignoreLockFile, envNamesAndPaths...)
|
||||
}
|
||||
|
||||
func dirToDBName(dirName string) string {
|
||||
dbName := strings.TrimSpace(dirName)
|
||||
dbName = strings.Map(func(r rune) rune {
|
||||
|
||||
+25
-34
@@ -96,7 +96,7 @@ func initRepoWithRelativePath(t *testing.T, envPath string, hdp HomeDirProvider)
|
||||
return Load(context.Background(), hdp, fs, urlStr, "test")
|
||||
}
|
||||
|
||||
func TestDoltEnvAsMultiEnv(t *testing.T) {
|
||||
func TestMultiEnvForDirectory(t *testing.T) {
|
||||
rootPath, err := test.ChangeToTestDir("TestDoltEnvAsMultiEnv")
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -104,17 +104,34 @@ func TestDoltEnvAsMultiEnv(t *testing.T) {
|
||||
envPath := filepath.Join(rootPath, " test---name _ 123")
|
||||
dEnv := initRepoWithRelativePath(t, envPath, hdp)
|
||||
|
||||
mrEnv, err := DoltEnvAsMultiEnv(context.Background(), dEnv)
|
||||
mrEnv, err := MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, mrEnv.envs, 1)
|
||||
|
||||
for _, e := range mrEnv.envs {
|
||||
assert.Equal(t, "test_name_123", e.name)
|
||||
assert.Equal(t, dEnv, e.env)
|
||||
type envCmp struct {
|
||||
name string
|
||||
doltDir string
|
||||
}
|
||||
|
||||
expected := []envCmp{
|
||||
{
|
||||
name: "test_name_123",
|
||||
doltDir: dEnv.GetDoltDir(),
|
||||
},
|
||||
}
|
||||
|
||||
var actual []envCmp
|
||||
for _, env := range mrEnv.envs {
|
||||
actual = append(actual, envCmp{
|
||||
name: env.name,
|
||||
doltDir: env.env.GetDoltDir(),
|
||||
})
|
||||
}
|
||||
|
||||
assert.Equal(t, expected, actual)
|
||||
}
|
||||
|
||||
func TestDoltEnvAsMultiEnvWithMultipleRepos(t *testing.T) {
|
||||
func TestMultiEnvForDirectoryWithMultipleRepos(t *testing.T) {
|
||||
rootPath, err := test.ChangeToTestDir("TestDoltEnvAsMultiEnvWithMultipleRepos")
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -124,7 +141,7 @@ func TestDoltEnvAsMultiEnvWithMultipleRepos(t *testing.T) {
|
||||
subEnv1 := initRepoWithRelativePath(t, filepath.Join(envPath, "abc"), hdp)
|
||||
subEnv2 := initRepoWithRelativePath(t, filepath.Join(envPath, "def"), hdp)
|
||||
|
||||
mrEnv, err := DoltEnvAsMultiEnv(context.Background(), dEnv)
|
||||
mrEnv, err := MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, mrEnv.envs, 3)
|
||||
|
||||
@@ -183,7 +200,7 @@ func TestLoadMultiEnv(t *testing.T) {
|
||||
envNamesAndPaths[i] = EnvNameAndPath{name, filepath.Join(rootPath, name)}
|
||||
}
|
||||
|
||||
mrEnv, err := LoadMultiEnv(context.Background(), hdp, config.NewEmptyMapConfig(), filesys.LocalFS, "test", false, envNamesAndPaths...)
|
||||
mrEnv, err := MultiEnvForPaths(context.Background(), hdp, config.NewEmptyMapConfig(), filesys.LocalFS, "test", false, envNamesAndPaths...)
|
||||
require.NoError(t, err)
|
||||
|
||||
for _, name := range names {
|
||||
@@ -191,29 +208,3 @@ func TestLoadMultiEnv(t *testing.T) {
|
||||
assert.NotNil(t, e)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadMultiEnvFromDir(t *testing.T) {
|
||||
dirNameToDBName := map[string]string{
|
||||
"env 1": "env_1",
|
||||
" env 2": "env_2",
|
||||
"env-3": "env_3",
|
||||
}
|
||||
|
||||
names := make([]string, 0, len(dirNameToDBName))
|
||||
for k := range dirNameToDBName {
|
||||
names = append(names, k)
|
||||
}
|
||||
|
||||
rootPath, hdp, envs := initMultiEnv(t, "TestLoadMultiEnvFromDir", names)
|
||||
mrEnv, err := LoadMultiEnvFromDir(context.Background(), hdp, config.NewEmptyMapConfig(), filesys.LocalFS, rootPath, "test", false)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Len(t, mrEnv.envs, len(names))
|
||||
for _, dirName := range names {
|
||||
dbName := dirNameToDBName[dirName]
|
||||
_, ok := envs[dirName]
|
||||
require.True(t, ok)
|
||||
e := mrEnv.GetEnv(dbName)
|
||||
require.NotNil(t, e)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,7 +344,7 @@ func setupConcurrencyTest(t *testing.T, ctx context.Context) (dEnv *env.DoltEnv)
|
||||
}
|
||||
|
||||
func engineFromEnvironment(ctx context.Context, dEnv *env.DoltEnv) (eng *engine.SqlEngine) {
|
||||
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ type sqlEngineTableReader struct {
|
||||
}
|
||||
|
||||
func NewSqlEngineReader(ctx context.Context, dEnv *env.DoltEnv, tableName string) (*sqlEngineTableReader, error) {
|
||||
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -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.DoltEnvAsMultiEnv(ctx, dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ var _ enginetest.ValidatingHarness = (*DoltHarness)(nil)
|
||||
|
||||
func newDoltHarness(t *testing.T) *DoltHarness {
|
||||
dEnv := dtestutils.CreateTestEnv()
|
||||
mrEnv, err := env.DoltEnvAsMultiEnv(context.Background(), dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, 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.DoltEnvAsMultiEnv(context.Background(), dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
require.NoError(d.t, err)
|
||||
d.multiRepoEnv = mrEnv
|
||||
for _, db := range dbs {
|
||||
|
||||
@@ -94,7 +94,7 @@ func setupIndexes(t *testing.T, tableName, insertQuery string) (*sqle.Engine, *e
|
||||
cols: idxv2v1Cols,
|
||||
}
|
||||
|
||||
mrEnv, err := env.DoltEnvAsMultiEnv(context.Background(), dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
require.NoError(t, err)
|
||||
b := env.GetDefaultInitBranch(dEnv.Config)
|
||||
pro := dsqle.NewDoltDatabaseProvider(b, mrEnv.FileSystem(), db)
|
||||
|
||||
@@ -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.DoltEnvAsMultiEnv(context.Background(), dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -32,63 +32,18 @@ type Persister struct {
|
||||
var _ mysql_db.MySQLDbPersistence = &Persister{}
|
||||
|
||||
func NewPersister(fp string) *Persister {
|
||||
// Create file if it does not exist, panic if something goes wrong
|
||||
if len(fp) > 0 {
|
||||
_, err := os.Stat(fp)
|
||||
if err != nil && errors.Is(err, os.ErrNotExist) {
|
||||
err = ioutil.WriteFile(fp, []byte{}, 0644)
|
||||
}
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
return &Persister{
|
||||
privsFilePath: fp,
|
||||
fileMutex: &sync.Mutex{},
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Persister) ValidateCanPersist() error {
|
||||
if len(p.privsFilePath) == 0 {
|
||||
return errors.New("no privilege file specified, to persist users/grants run with --privilege-file=<file_path>")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Persister) Persist(ctx *sql.Context, data []byte) error {
|
||||
p.fileMutex.Lock()
|
||||
defer p.fileMutex.Unlock()
|
||||
|
||||
if err := p.ValidateCanPersist(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ioutil.WriteFile(p.privsFilePath, data, 0777)
|
||||
}
|
||||
|
||||
// SetPrivilegeFilePath sets the file path that will be used for loading privileges.
|
||||
// TODO: this is probably not needed
|
||||
func (p Persister) SetPrivilegeFilePath(fp string) {
|
||||
// do nothing for empty file path
|
||||
if len(fp) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
p.fileMutex.Lock()
|
||||
defer p.fileMutex.Unlock()
|
||||
|
||||
// Create file if it does not exist, panic if something goes wrong
|
||||
_, err := os.Stat(fp)
|
||||
if err != nil && errors.Is(err, os.ErrNotExist) {
|
||||
err = ioutil.WriteFile(fp, []byte{}, 0644)
|
||||
}
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
p.privsFilePath = fp
|
||||
}
|
||||
|
||||
// LoadData reads the mysql.db file, returns nil if empty or not found
|
||||
func (p Persister) LoadData() ([]byte, error) {
|
||||
// do nothing if no filepath specified
|
||||
|
||||
@@ -85,7 +85,7 @@ func (fs localFS) WithWorkingDir(path string) (Filesys, error) {
|
||||
|
||||
var errStopMarker = errors.New("stop")
|
||||
|
||||
// Iter iterates over the files and subdirectories within a given directory (Optionally recursively.
|
||||
// Iter iterates over the files and subdirectories within a given directory (Optionally recursively).
|
||||
func (fs *localFS) Iter(path string, recursive bool, cb FSIterCB) error {
|
||||
var err error
|
||||
path, err = fs.Abs(path)
|
||||
|
||||
@@ -111,7 +111,7 @@ func setupBenchmark(t *testing.B, dEnv *env.DoltEnv) (*sql.Context, *engine.SqlE
|
||||
Autocommit: true,
|
||||
}
|
||||
|
||||
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
|
||||
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
|
||||
require.NoError(t, err)
|
||||
|
||||
eng, err := engine.NewSqlEngine(ctx, mrEnv, engine.FormatNull, config)
|
||||
|
||||
@@ -132,4 +132,3 @@ TXT
|
||||
[[ "$output" =~ "- 0. You just DO WHAT THE FUCK YOU WANT TO" ]] || false
|
||||
[[ "$output" =~ "+ 0. You just DO WHAT THE F*CK YOU WANT TO" ]] || false
|
||||
}
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ behavior:
|
||||
start_multi_db_server() {
|
||||
DEFAULT_DB="$1"
|
||||
let PORT="$$ % (65536-1024) + 1024"
|
||||
dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt --multi-db-dir ./ &
|
||||
dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt --data-dir ./ &
|
||||
SERVER_PID=$!
|
||||
wait_for_connection $PORT 5000
|
||||
}
|
||||
|
||||
@@ -61,18 +61,18 @@ teardown() {
|
||||
cd dbs1/repo1
|
||||
dolt config --local --add sqlserver.global.dolt_replicate_to_remote unknown
|
||||
cd ../..
|
||||
run dolt sql --multi-db-dir=dbs1 -b -q "select @@GLOBAL.dolt_replicate_to_remote"
|
||||
run dolt sql --data-dir=dbs1 -b -q "select @@GLOBAL.dolt_replicate_to_remote"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "remote1" ]] || false
|
||||
}
|
||||
|
||||
@test "replication-multidb: push on sqlengine commit" {
|
||||
dolt config --global --add sqlserver.global.dolt_replicate_to_remote remote1
|
||||
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
|
||||
clone_helper $TMPDIRS
|
||||
run dolt sql --multi-db-dir=dbs2 -b -q "use repo1; show tables" -r csv
|
||||
run dolt sql --data-dir=dbs2 -b -q "use repo1; show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 4 ]
|
||||
[[ "$output" =~ "t1" ]] || false
|
||||
@@ -80,15 +80,15 @@ teardown() {
|
||||
|
||||
@test "replication-multidb: pull on read" {
|
||||
push_helper $TMPDIRS
|
||||
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
|
||||
clone_helper $TMPDIRS
|
||||
push_helper $TMPDIRS
|
||||
|
||||
dolt config --global --add sqlserver.global.dolt_read_replica_remote remote1
|
||||
dolt config --global --add sqlserver.global.dolt_replicate_heads main
|
||||
run dolt sql --multi-db-dir=dbs2 -b -q "use repo1; show tables" -r csv
|
||||
run dolt sql --data-dir=dbs2 -b -q "use repo1; show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 4 ]
|
||||
[[ "$output" =~ "t1" ]] || false
|
||||
@@ -96,7 +96,7 @@ teardown() {
|
||||
|
||||
@test "replication-multidb: missing database config" {
|
||||
dolt config --global --add sqlserver.global.dolt_replicate_to_remote unknown
|
||||
run dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
run dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ ! "$output" =~ "panic" ]] || false
|
||||
[[ "$output" =~ "remote not found: 'unknown'" ]] || false
|
||||
@@ -105,7 +105,7 @@ teardown() {
|
||||
@test "replication-multidb: missing database config quiet warning" {
|
||||
dolt config --global --add sqlserver.global.dolt_replicate_to_remote unknown
|
||||
dolt config --global --add sqlserver.global.dolt_skip_replication_errors 1
|
||||
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
}
|
||||
|
||||
@test "replication-multidb: sql-server push on commit" {
|
||||
@@ -118,7 +118,7 @@ teardown() {
|
||||
multi_query repo1 1 "select dolt_commit('-am', 'cm')"
|
||||
|
||||
clone_helper $TMPDIRS
|
||||
run dolt sql --multi-db-dir=dbs2 -b -q "use repo1; show tables" -r csv
|
||||
run dolt sql --data-dir=dbs2 -b -q "use repo1; show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 4 ]
|
||||
[[ "$output" =~ "t1" ]] || false
|
||||
@@ -126,8 +126,8 @@ teardown() {
|
||||
|
||||
@test "replication-multidb: sql-server pull on read" {
|
||||
push_helper $TMPDIRS
|
||||
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
|
||||
clone_helper $TMPDIRS
|
||||
push_helper $TMPDIRS
|
||||
|
||||
@@ -97,12 +97,12 @@ SQL
|
||||
[ ! -d mydb ]
|
||||
}
|
||||
|
||||
@test "sql-create-database: with multi-db-dir" {
|
||||
@test "sql-create-database: with data-dir" {
|
||||
skiponwindows "failing with file in use error"
|
||||
|
||||
mkdir db_dir
|
||||
|
||||
dolt sql --multi-db-dir db_dir <<SQL
|
||||
dolt sql --data-dir db_dir <<SQL
|
||||
create database mydb1;
|
||||
create database mydb2;
|
||||
use mydb1;
|
||||
@@ -129,22 +129,22 @@ SQL
|
||||
|
||||
cd ../../
|
||||
|
||||
dolt sql --multi-db-dir db_dir -q "drop database mydb1"
|
||||
dolt sql --data-dir db_dir -q "drop database mydb1"
|
||||
|
||||
[ ! -d db_dir/mydb1 ]
|
||||
[ -d db_dir/mydb2 ]
|
||||
|
||||
run dolt sql --multi-db-dir db_dir -q "show databases"
|
||||
run dolt sql --data-dir db_dir -q "show databases"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "mydb2" ]] || false
|
||||
[[ ! "$output" =~ "mydb1" ]] || false
|
||||
[[ ! "$output" =~ "dolt_repo_$$" ]] || false
|
||||
|
||||
# multi-db-dir with abs path
|
||||
# data-dir with abs path
|
||||
absdir="/tmp/$$/db_dir"
|
||||
mkdir -p "$absdir"
|
||||
|
||||
dolt sql --multi-db-dir "$absdir" <<SQL
|
||||
dolt sql --data-dir "$absdir" <<SQL
|
||||
create database mydb1;
|
||||
create database mydb2;
|
||||
use mydb1;
|
||||
@@ -159,7 +159,7 @@ SQL
|
||||
[ -d "$absdir/mydb1" ]
|
||||
[ -d "$absdir/mydb2" ]
|
||||
|
||||
dolt sql --multi-db-dir "$absdir" -q "drop database mydb1"
|
||||
dolt sql --data-dir "$absdir" -q "drop database mydb1"
|
||||
|
||||
[ ! -d "$absdir/mydb1" ]
|
||||
[ -d "$absdir/mydb2" ]
|
||||
|
||||
@@ -359,7 +359,7 @@ SQL
|
||||
cd workspace
|
||||
dolt init
|
||||
cd ..
|
||||
dolt sql --multi-db-dir ./ -b -q "USE workspace;CREATE TABLE mytable LIKE otherdb.othertable;"
|
||||
dolt sql --data-dir ./ -b -q "USE workspace;CREATE TABLE mytable LIKE otherdb.othertable;"
|
||||
cd workspace
|
||||
run dolt schema show mytable
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -705,7 +705,7 @@ SQL
|
||||
cd repo2
|
||||
dolt init
|
||||
cd ..
|
||||
run dolt sql --multi-db-dir ./ -b -q "USE repo2;CREATE TEMPORARY TABLE temp2 LIKE repo1.tableone;"
|
||||
run dolt sql --data-dir ./ -b -q "USE repo2;CREATE TEMPORARY TABLE temp2 LIKE repo1.tableone;"
|
||||
[ "$status" -eq 0 ]
|
||||
cd repo2
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ teardown() {
|
||||
}
|
||||
|
||||
seed_repos_with_tables_with_use_statements() {
|
||||
dolt sql -r csv --multi-db-dir ./ -b -q "
|
||||
dolt sql -r csv --data-dir ./ -b -q "
|
||||
USE repo1;
|
||||
CREATE TABLE r1_t1 (pk BIGINT, PRIMARY KEY(pk));
|
||||
INSERT INTO r1_t1 (pk) values (0),(1),(2);
|
||||
@@ -31,7 +31,7 @@ seed_repos_with_tables_with_use_statements() {
|
||||
|
||||
@test "sql-multi-db: sql multi-db test show databases" {
|
||||
EXPECTED=$(echo -e "Database\ninformation_schema\nrepo1\nrepo2")
|
||||
run dolt sql -r csv --multi-db-dir ./ -q "SHOW DATABASES"
|
||||
run dolt sql -r csv --data-dir ./ -q "SHOW DATABASES"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "$EXPECTED" ]] || false
|
||||
}
|
||||
@@ -40,26 +40,26 @@ seed_repos_with_tables_with_use_statements() {
|
||||
seed_repos_with_tables_with_use_statements
|
||||
|
||||
EXPECTED_R1T1=$(echo -e "pk\n0\n1\n2")
|
||||
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo1; SELECT * FROM r1_t1;"
|
||||
run dolt sql -r csv --data-dir ./ -b -q "USE repo1; SELECT * FROM r1_t1;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "$EXPECTED_R1T1" ]] || false
|
||||
|
||||
EXPECTED_R2T1=$(echo -e "pk,c1\n2,200\n3,300\n4,400")
|
||||
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo2; SELECT * FROM r2_t1;"
|
||||
run dolt sql -r csv --data-dir ./ -b -q "USE repo2; SELECT * FROM r2_t1;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "$EXPECTED_R2T1" ]] || false
|
||||
|
||||
# test tables of other database inaccessible without database qualifier
|
||||
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo1; SELECT * FROM r2_t1;"
|
||||
run dolt sql -r csv --data-dir ./ -b -q "USE repo1; SELECT * FROM r2_t1;"
|
||||
[ ! "$status" -eq 0 ]
|
||||
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo2; SELECT * FROM r1_t1;"
|
||||
run dolt sql -r csv --data-dir ./ -b -q "USE repo2; SELECT * FROM r1_t1;"
|
||||
[ ! "$status" -eq 0 ]
|
||||
|
||||
# test tables in other databases accessible when qualified
|
||||
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo1; SELECT * FROM repo2.r2_t1;"
|
||||
run dolt sql -r csv --data-dir ./ -b -q "USE repo1; SELECT * FROM repo2.r2_t1;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "$EXPECTED_R2T1" ]] || false
|
||||
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo2; SELECT * FROM repo1.r1_t1;"
|
||||
run dolt sql -r csv --data-dir ./ -b -q "USE repo2; SELECT * FROM repo1.r1_t1;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "$EXPECTED_R1T1" ]] || false
|
||||
}
|
||||
@@ -67,7 +67,7 @@ seed_repos_with_tables_with_use_statements() {
|
||||
@test "sql-multi-db: sql test use invalid db name" {
|
||||
seed_repos_with_tables_with_use_statements
|
||||
|
||||
run dolt sql -r csv --multi-db-dir ./ -q "USE invalid_db_name;"
|
||||
run dolt sql -r csv --data-dir ./ -q "USE invalid_db_name;"
|
||||
[ ! "$status" -eq 0 ]
|
||||
echo $output
|
||||
[[ "$output" =~ "database not found: invalid_db_name" ]] || false
|
||||
@@ -77,7 +77,7 @@ seed_repos_with_tables_with_use_statements() {
|
||||
seed_repos_with_tables_with_use_statements
|
||||
|
||||
EXPECTED=$(echo -e "pk,c1\n2,200")
|
||||
run dolt sql -r csv --multi-db-dir ./ -b -q "
|
||||
run dolt sql -r csv --data-dir ./ -b -q "
|
||||
USE repo1;
|
||||
SELECT r1_t1.pk as pk, repo2.r2_t1.c1 as c1 FROM r1_t1 JOIN repo2.r2_t1 ON r1_t1.pk=repo2.r2_t1.pk;"
|
||||
echo \"\"\"$output\"\"\"
|
||||
@@ -87,11 +87,11 @@ seed_repos_with_tables_with_use_statements() {
|
||||
|
||||
@test "sql-multi-db: join on multiple databases with same name" {
|
||||
seed_repos_with_tables_with_use_statements
|
||||
dolt sql --multi-db-dir ./ -b -q "
|
||||
dolt sql --data-dir ./ -b -q "
|
||||
USE repo1;
|
||||
CREATE TABLE r2_t1 (pk BIGINT, c1 BIGINT, PRIMARY KEY(pk));
|
||||
INSERT INTO r2_t1 (pk, c1) values (2,200),(3,300),(4,400);"
|
||||
run dolt sql --multi-db-dir ./ -q "select * from repo1.r2_t1 join repo2.r2_t1 on repo1.r2_t1.pk=repo2.r2_t1.pk"
|
||||
run dolt sql --data-dir ./ -q "select * from repo1.r2_t1 join repo2.r2_t1 on repo1.r2_t1.pk=repo2.r2_t1.pk"
|
||||
skip "Fails on Not unique table/alias"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ ! $output =~ "Not unique table/alias" ]] || false
|
||||
@@ -109,7 +109,7 @@ seed_repos_with_tables_with_use_statements() {
|
||||
dolt clone file://../remote1 repo2
|
||||
|
||||
cd ..
|
||||
run dolt sql --multi-db-dir ./subremotes -b -q "
|
||||
run dolt sql --data-dir ./subremotes -b -q "
|
||||
USE repo2;
|
||||
select dolt_fetch() as f;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
@@ -2,151 +2,325 @@
|
||||
load $BATS_TEST_DIRNAME/helper/common.bash
|
||||
load $BATS_TEST_DIRNAME/helper/query-server-common.bash
|
||||
|
||||
make_repo() {
|
||||
mkdir "$1"
|
||||
cd "$1"
|
||||
dolt init
|
||||
cd ..
|
||||
# working dir will be test_db
|
||||
make_test_repo() {
|
||||
rm -rf test_db
|
||||
mkdir test_db
|
||||
cd test_db
|
||||
dolt init
|
||||
}
|
||||
|
||||
show_users() {
|
||||
dolt sql-client --host=0.0.0.0 --port=$PORT --user=dolt <<SQL
|
||||
SELECT user from mysql.user order by user;
|
||||
SQL
|
||||
# working dir will be test_db
|
||||
make_multi_test_repo() {
|
||||
rm -rf test_db
|
||||
mkdir test_db
|
||||
cd test_db
|
||||
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
}
|
||||
|
||||
create_user() {
|
||||
dolt sql-client --host=0.0.0.0 --port=$PORT --user=dolt <<SQL
|
||||
CREATE USER new_user;
|
||||
SQL
|
||||
# working dir will be dolt_repo$$
|
||||
delete_test_repo() {
|
||||
stop_sql_server
|
||||
cd ..
|
||||
rm -rf test_db
|
||||
}
|
||||
|
||||
setup() {
|
||||
setup_no_dolt_init
|
||||
make_repo repo1
|
||||
}
|
||||
|
||||
teardown() {
|
||||
stop_sql_server
|
||||
delete_test_repo
|
||||
teardown_common
|
||||
}
|
||||
|
||||
@test "sql-privs: no mysql.db, throws error when attempting to persist" {
|
||||
skiponwindows "redirecting SQL to sql-client returns nothing after welcome messages"
|
||||
cd repo1
|
||||
@test "sql-privs: default options" {
|
||||
make_test_repo
|
||||
|
||||
start_sql_server repo1
|
||||
start_sql_server test_db
|
||||
|
||||
# expect only dolt user
|
||||
run show_users
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
|
||||
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
|
||||
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
|
||||
[ "${lines[3]}" = '+------+' ]
|
||||
[ "${lines[4]}" = '| User |' ]
|
||||
[ "${lines[5]}" = '+------+' ]
|
||||
[ "${lines[6]}" = '| dolt |' ]
|
||||
[ "${lines[7]}" = '+------+' ]
|
||||
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt"
|
||||
|
||||
# create user, expect error
|
||||
run create_user
|
||||
[[ "$output" =~ "no privilege file specified, to persist users/grants run with --privilege-file=<file_path>" ]] || false
|
||||
# check for config directory
|
||||
run ls -a
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create user
|
||||
server_query test_db 1 "create user new_user" ""
|
||||
|
||||
# expect dolt user and new_user
|
||||
run show_users
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
|
||||
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
|
||||
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
|
||||
[ "${lines[3]}" = '+------+' ]
|
||||
[ "${lines[4]}" = '| User |' ]
|
||||
[ "${lines[5]}" = '+------+' ]
|
||||
[ "${lines[6]}" = '| dolt |' ]
|
||||
[ "${lines[7]}" = '+------+' ]
|
||||
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
|
||||
}
|
||||
|
||||
# restart server
|
||||
stop_sql_server
|
||||
start_sql_server repo1
|
||||
@test "sql-privs: multiple doltcfg directories causes error" {
|
||||
# setup repo
|
||||
rm -rf test_db
|
||||
mkdir test_db
|
||||
cd test_db
|
||||
|
||||
# expect only dolt user
|
||||
run show_users
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
|
||||
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
|
||||
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
|
||||
[ "${lines[3]}" = '+------+' ]
|
||||
[ "${lines[4]}" = '| User |' ]
|
||||
[ "${lines[5]}" = '+------+' ]
|
||||
[ "${lines[6]}" = '| dolt |' ]
|
||||
[ "${lines[7]}" = '+------+' ]
|
||||
mkdir .doltcfg
|
||||
|
||||
# remove mysql.db and privs.json if they exist
|
||||
rm -f mysql.db
|
||||
mkdir inner_db
|
||||
cd inner_db
|
||||
mkdir .doltcfg
|
||||
|
||||
# expect start server to fail
|
||||
run start_sql_server inner_db
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "multiple .doltcfg directories detected" ]] || false
|
||||
|
||||
# leave the directory
|
||||
cd ..
|
||||
}
|
||||
|
||||
@test "sql-privs: has mysql.db, reads from mysql.db" {
|
||||
skiponwindows "redirecting SQL to sql-client returns nothing after welcome messages"
|
||||
cd repo1
|
||||
@test "sql-privs: sql-server specify data-dir" {
|
||||
make_multi_test_repo
|
||||
|
||||
# remove/replace mysql.db if they exist
|
||||
rm -f mysql.db
|
||||
cp $BATS_TEST_DIRNAME/mysql.db .
|
||||
start_sql_server_with_args --host 0.0.0.0 --user=dolt --data-dir=db_dir
|
||||
|
||||
start_sql_server_with_args --privilege-file=mysql.db repo1
|
||||
# show databases, expect all
|
||||
server_query db1 1 "show databases" "Database\ndb1\ndb2\ndb3\ninformation_schema"
|
||||
|
||||
# expect dolt and mysql_user
|
||||
run show_users
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
|
||||
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
|
||||
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
|
||||
[ "${lines[3]}" = '+------------+' ]
|
||||
[ "${lines[4]}" = '| User |' ]
|
||||
[ "${lines[5]}" = '+------------+' ]
|
||||
[ "${lines[6]}" = '| dolt |' ]
|
||||
[ "${lines[7]}" = '| mysql_user |' ]
|
||||
[ "${lines[8]}" = '+------------+' ]
|
||||
# show users, expect just root user
|
||||
server_query db1 1 "select user from mysql.user order by user" "User\ndolt"
|
||||
|
||||
# expect no .doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# expect .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
server_query db1 1 "create user new_user" ""
|
||||
|
||||
# show users, expect root user and new_user
|
||||
server_query db1 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
|
||||
|
||||
# expect no privileges.db in current directory
|
||||
run ls
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect privileges.db in $datadir/.doltcfg
|
||||
run ls db_dir/.doltcfg
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
}
|
||||
|
||||
@test "sql-privs: specify doltcfg directory" {
|
||||
make_test_repo
|
||||
|
||||
start_sql_server_with_args --host 0.0.0.0 --user=dolt --doltcfg-dir=doltcfgdir
|
||||
|
||||
# show users, expect just root user
|
||||
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt"
|
||||
|
||||
# expect only custom doltcfgdir
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# create new_user
|
||||
server_query test_db 1 "create user new_user" ""
|
||||
|
||||
# show users, expect root user and new_user
|
||||
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
|
||||
|
||||
# expect privileges file in doltcfgdir
|
||||
run ls doltcfgdir
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
}
|
||||
|
||||
@test "sql-privs: specify privilege file" {
|
||||
make_test_repo
|
||||
|
||||
start_sql_server_with_args --host 0.0.0.0 --user=dolt --privilege-file=privs.db
|
||||
|
||||
# show users, expect just root user
|
||||
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt"
|
||||
|
||||
# expect default doltcfg directory
|
||||
run ls -a
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new_user
|
||||
server_query test_db 1 "create user new_user" ""
|
||||
|
||||
# show users, expect root user and new_user
|
||||
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
|
||||
|
||||
# expect custom privilege file current directory
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
}
|
||||
|
||||
@test "sql-privs: specify data-dir and doltcfg-dir" {
|
||||
make_multi_test_repo
|
||||
|
||||
start_sql_server_with_args --host 0.0.0.0 --user=dolt --data-dir=db_dir --doltcfg-dir=doltcfgdir
|
||||
|
||||
# show databases, expect all
|
||||
server_query db1 1 "show databases" "Database\ndb1\ndb2\ndb3\ninformation_schema"
|
||||
|
||||
# show users, expect just root user
|
||||
server_query db1 1 "select user from mysql.user order by user" "User\ndolt"
|
||||
|
||||
# expect custom doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# expect no .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
server_query db1 1 "create user new_user" ""
|
||||
|
||||
# show users, expect root user and new_user
|
||||
server_query db1 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
|
||||
|
||||
# expect no privileges.db in current directory
|
||||
run ls
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect privileges.db in $doltcfg directory
|
||||
run ls doltcfgdir
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
}
|
||||
|
||||
@test "sql-privs: specify data-dir and privilege-file" {
|
||||
make_multi_test_repo
|
||||
|
||||
start_sql_server_with_args --host 0.0.0.0 --user=dolt --data-dir=db_dir --privilege-file=privs.db
|
||||
|
||||
# show databases, expect all
|
||||
server_query db1 1 "show databases" "Database\ndb1\ndb2\ndb3\ninformation_schema"
|
||||
|
||||
# show users, expect just root user
|
||||
server_query db1 1 "select user from mysql.user order by user" "User\ndolt"
|
||||
|
||||
# expect no .doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# expect .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
server_query db1 1 "create user new_user" ""
|
||||
|
||||
# show users, expect root user and new_user
|
||||
server_query db1 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
|
||||
|
||||
# expect privs.db in current directory
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privs.db in $doltcfg directory
|
||||
run ls db_dir/.doltcfg
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
}
|
||||
|
||||
@test "sql-privs: specify doltcfg-dir and privilege-file" {
|
||||
make_test_repo
|
||||
|
||||
start_sql_server_with_args --host 0.0.0.0 --user=dolt --doltcfg-dir=doltcfgdir --privilege-file=privs.db
|
||||
|
||||
# expect only dolt user
|
||||
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt"
|
||||
|
||||
# expect custom doltcfgdir
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# create user
|
||||
run create_user
|
||||
[ "$status" -eq 0 ]
|
||||
server_query test_db 1 "create user new_user" ""
|
||||
|
||||
# expect dolt, new_user, and mysql_user
|
||||
run show_users
|
||||
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
|
||||
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
|
||||
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
|
||||
[ "${lines[3]}" = '+------------+' ]
|
||||
[ "${lines[4]}" = '| User |' ]
|
||||
[ "${lines[5]}" = '+------------+' ]
|
||||
[ "${lines[6]}" = '| dolt |' ]
|
||||
[ "${lines[7]}" = '| mysql_user |' ]
|
||||
[ "${lines[8]}" = '| new_user |' ]
|
||||
[ "${lines[9]}" = '+------------+' ]
|
||||
# expect dolt user and new_user
|
||||
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
|
||||
|
||||
stop_sql_server
|
||||
start_sql_server_with_args --privilege-file=mysql.db repo1
|
||||
# expect privileges file
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect dolt, new_user, and mysql_user
|
||||
run show_users
|
||||
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
|
||||
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
|
||||
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
|
||||
[ "${lines[3]}" = '+------------+' ]
|
||||
[ "${lines[4]}" = '| User |' ]
|
||||
[ "${lines[5]}" = '+------------+' ]
|
||||
[ "${lines[6]}" = '| dolt |' ]
|
||||
[ "${lines[7]}" = '| mysql_user |' ]
|
||||
[ "${lines[8]}" = '| new_user |' ]
|
||||
[ "${lines[9]}" = '+------------+' ]
|
||||
# expect no privileges file in doltcfgdir
|
||||
run ls doltcfgdir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
}
|
||||
|
||||
# remove mysql.db if they exist
|
||||
rm -f mysql.db
|
||||
@test "sql-privs: specify data-dir, doltcfg-dir, and privileges-file" {
|
||||
make_multi_test_repo
|
||||
|
||||
# leave the directory
|
||||
cd ..
|
||||
start_sql_server_with_args --host 0.0.0.0 --user=dolt --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db
|
||||
|
||||
# show databases, expect all
|
||||
server_query db1 1 "show databases" "Database\ndb1\ndb2\ndb3\ninformation_schema"
|
||||
|
||||
# show users, expect just root user
|
||||
server_query db1 1 "select user from mysql.user order by user" "User\ndolt"
|
||||
|
||||
# expect custom doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# expect no .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
server_query db1 1 "create user new_user" ""
|
||||
|
||||
# show users, expect root user and new_user
|
||||
server_query db1 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
|
||||
|
||||
# expect privs.db in current directory
|
||||
run ls
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $doltcfg directory
|
||||
run ls doltcfgdir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
}
|
||||
@@ -1202,12 +1202,12 @@ END""")
|
||||
multi_query "" 1 "use test2; drop database TEST2; select database();" "null"
|
||||
}
|
||||
|
||||
@test "sql-server: create and drop database with --multi-db-dir" {
|
||||
@test "sql-server: create and drop database with --data-dir" {
|
||||
skiponwindows "Missing dependencies"
|
||||
|
||||
mkdir no_dolt && cd no_dolt
|
||||
mkdir db_dir
|
||||
start_sql_server_with_args --host 0.0.0.0 --user dolt --multi-db-dir=db_dir
|
||||
start_sql_server_with_args --host 0.0.0.0 --user dolt --data-dir=db_dir
|
||||
|
||||
server_query "" 1 "create database test1"
|
||||
server_query "" 1 "show databases" "Database\ninformation_schema\ntest1"
|
||||
@@ -1237,7 +1237,7 @@ END""")
|
||||
|
||||
# make sure the databases exist on restart
|
||||
stop_sql_server
|
||||
start_sql_server_with_args --host 0.0.0.0 --user dolt --multi-db-dir=db_dir
|
||||
start_sql_server_with_args --host 0.0.0.0 --user dolt --data-dir=db_dir
|
||||
server_query "" 1 "show databases" "Database\ninformation_schema\ntest3"
|
||||
}
|
||||
|
||||
|
||||
@@ -42,63 +42,668 @@ teardown() {
|
||||
[[ "$output" =~ "+---------------------" ]] || false
|
||||
}
|
||||
|
||||
@test "sql-shell: dolt sql shell has mysql db" {
|
||||
# mysql database exists and has privilege tables
|
||||
run dolt sql <<< "show tables from mysql;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "user" ]] || false
|
||||
[[ "$output" =~ "role_edges" ]] || false
|
||||
@test "sql-shell: default datadir, doltcfg, and privs" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
|
||||
# show users, expect just root user
|
||||
# show users, expect just root user
|
||||
run dolt sql <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# create a new user, fails when no privilege file is specified
|
||||
run dolt sql <<< "create user new_user;"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "no privilege file specified, to persist users/grants run with --privilege-file=<file_path>" ]] || false
|
||||
# check for config directory
|
||||
run ls -a
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# there shouldn't be any mysql.db files
|
||||
run ls .dolt
|
||||
! [[ "$output" =~ "mysql.db" ]] || false
|
||||
# check for no privileges.db file
|
||||
run ls .doltcfg
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# remove mysql.db just in case
|
||||
rm -f .dolt/mysql.db
|
||||
# create new_user
|
||||
run dolt sql <<< "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# check for config directory
|
||||
run ls -a
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# check for no privileges.db file
|
||||
run ls .doltcfg
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# remove existing .doltcfg
|
||||
rm -rf .doltcfg
|
||||
}
|
||||
|
||||
@test "sql-shell: dolt sql shell can create users" {
|
||||
# remove existing privs.db
|
||||
rm -f privs.db
|
||||
@test "sql-shell: specify data-dir" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
|
||||
# mysql database exists and has privilege tables
|
||||
run dolt sql <<< "show tables from mysql;"
|
||||
# create data dir
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
# create databases
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql --data-dir=db_dir <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "user" ]] || false
|
||||
[[ "$output" =~ "role_edges" ]] || false
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect root user
|
||||
run dolt sql <<< "select user from mysql.user;"
|
||||
# show users, expect just root user
|
||||
run dolt sql --data-dir=db_dir <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# create a new user
|
||||
run dolt sql --privilege-file=privs.db <<< "create user new_user;"
|
||||
# expect no .doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# expect .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
run dolt sql --data-dir=db_dir <<< "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# there is now a privs.db file
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --data-dir=db_dir <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect no privileges.db in current directory
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect privileges.db in $datadir/.doltcfg
|
||||
run ls db_dir/.doltcfg
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
|
||||
# test relative to $datadir
|
||||
cd db_dir
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# expect to find same users when in $datadir
|
||||
run dolt sql <<< "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
}
|
||||
|
||||
@test "sql-shell: specify doltcfg directory" {
|
||||
# remove any previous config directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf doltcfgdir
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect only custom doltcfgdir
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# create new_user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir <<< "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect privileges files in doltcfgdir
|
||||
run ls doltcfgdir
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# remove config directory just in case
|
||||
rm -rf .doltcfg
|
||||
rm -rf doltcfgdir
|
||||
}
|
||||
|
||||
@test "sql-shell: specify privilege file" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -f privs.db
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --privilege-file=privs.db <<< "select user from mysql.user;"
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect default doltcfg directory
|
||||
run ls -a
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new_user
|
||||
run dolt sql --privilege-file=privs.db <<< "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --privilege-file=privs.db <<< "select user from mysql.user;"
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# remove mysql.db just in case
|
||||
# expect custom privilege file current directory
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect to not see new_user when privs.db not specified
|
||||
run dolt sql <<< "select user from mysql.user"
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -f privs.db
|
||||
}
|
||||
|
||||
@test "sql-shell: specify data-dir and doltcfg-dir" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf doltcfgdir
|
||||
|
||||
# create data dir
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
# create databases
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect custom doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# expect no .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir <<< "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect no privileges.db in current directory
|
||||
run ls
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect privileges.db in $doltcfg directory
|
||||
run ls doltcfgdir
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# test relative to $datadir
|
||||
cd db_dir
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect root
|
||||
run dolt sql <<< "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --doltcfg-dir=../doltcfgdir <<< "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf doltcfgdir
|
||||
}
|
||||
|
||||
@test "sql-shell: specify data-dir and privilege-file" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf privs.db
|
||||
|
||||
# create data dir
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
# create databases
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql --data-dir=db_dir --privilege-file=privs.db <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --data-dir=db_dir --privilege-file=privs.db <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect no .doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# expect .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
run dolt sql --data-dir=db_dir --privilege-file=privs.db <<< "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --data-dir=db_dir --privilege-file=privs.db <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect privs.db in current directory
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privs.db in $doltcfg directory
|
||||
run ls db_dir/.doltcfg
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# test relative to $datadir
|
||||
cd db_dir
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect root
|
||||
run dolt sql <<< "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --privilege-file=../privs.db <<< "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf privs.db
|
||||
}
|
||||
|
||||
@test "sql-shell: specify doltcfg-dir and privilege-file" {
|
||||
# remove any previous config directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf doltcfgdir
|
||||
rm -rf privs.db
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect custom doltcfgdir
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# create new_user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect privileges file
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges file in doltcfgdir
|
||||
run ls doltcfgdir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# remove config directory just in case
|
||||
rm -rf .doltcfg
|
||||
rm -rf doltcfgdir
|
||||
rm -rf privs.db
|
||||
}
|
||||
|
||||
@test "sql-shell: specify data directory, cfg directory, and privilege file" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf doltcfgdir
|
||||
rm -rf privs.db
|
||||
|
||||
# create data dir
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
# create databases
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect custom doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# expect no .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect privs.db in current directory
|
||||
run ls
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $doltcfg directory
|
||||
run ls doltcfgdir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# test relative to $datadir
|
||||
cd db_dir
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect root
|
||||
run dolt sql <<< "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --doltcfg-dir=../doltcfgdir <<< "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --privilege-file=../privs.db <<< "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf doltcfgdir
|
||||
rm -rf privs.db
|
||||
}
|
||||
|
||||
|
||||
@test "sql-shell: .doltcfg in parent directory errors" {
|
||||
# remove existing directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf inner_db
|
||||
|
||||
mkdir .doltcfg
|
||||
mkdir inner_db
|
||||
cd inner_db
|
||||
mkdir .doltcfg
|
||||
|
||||
run dolt sql <<< "show databases;"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "multiple .doltcfg directories detected" ]] || false
|
||||
|
||||
# specifying datadir, resolves issue
|
||||
run dolt sql --data-dir=. <<< "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# remove existing directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf inner_db
|
||||
}
|
||||
|
||||
@test "sql-shell: specify data directory outside of dolt repo" {
|
||||
# remove files
|
||||
rm -rf datadir
|
||||
rm -rf .doltcfg
|
||||
rm -rf new_repo
|
||||
|
||||
# initialize data directory and inner dbs
|
||||
mkdir datadir
|
||||
cd datadir
|
||||
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
# save data path
|
||||
DATADIR=$(pwd)
|
||||
|
||||
cd ..
|
||||
|
||||
# initialize new repo
|
||||
mkdir new_repo
|
||||
cd new_repo
|
||||
|
||||
run dolt sql --data-dir=$DATADIR <<< "show databases"
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "db1" ]] || false
|
||||
[[ $output =~ "db2" ]] || false
|
||||
[[ $output =~ "db3" ]] || false
|
||||
|
||||
run dolt sql --data-dir=$DATADIR <<< "create user new_user"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt sql --data-dir=$DATADIR <<< "use db1; select user from mysql.user"
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "new_user" ]] || false
|
||||
|
||||
run dolt sql --data-dir=$DATADIR <<< "use db2; select user from mysql.user"
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "new_user" ]] || false
|
||||
|
||||
run dolt sql --data-dir=$DATADIR <<< "use db3; select user from mysql.user"
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "new_user" ]] || false
|
||||
|
||||
# check that correct files exist
|
||||
cd ..
|
||||
|
||||
run ls -a
|
||||
[[ $output =~ "datadir" ]] || false
|
||||
[[ $output =~ "new_repo" ]] || false
|
||||
! [[ $output =~ ".doltcfg" ]] || false
|
||||
|
||||
run ls -a datadir
|
||||
[[ $output =~ ".doltcfg" ]] || false
|
||||
|
||||
run ls -a datadir/.doltcfg
|
||||
[[ $output =~ "privileges.db" ]] || false
|
||||
|
||||
# remove files
|
||||
rm -rf new_repo
|
||||
rm -rf datadir
|
||||
}
|
||||
|
||||
@test "sql-shell: bad sql in sql shell should error" {
|
||||
run dolt sql <<< "This is bad sql"
|
||||
[ $status -eq 1 ]
|
||||
|
||||
+638
-32
@@ -39,71 +39,576 @@ teardown() {
|
||||
teardown_common
|
||||
}
|
||||
|
||||
@test "sql: dolt sql -q without privilege file doesn't persist" {
|
||||
# mysql database exists and has privilege tables
|
||||
run dolt sql -q "show tables from mysql;"
|
||||
@test "sql: check configurations with all default options" {
|
||||
# remove any previous config directories
|
||||
rm -rf .doltcfg
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "user" ]] || false
|
||||
[[ "$output" =~ "role_edges" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql -q "select user from mysql.user;"
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# create a new user, fails
|
||||
run dolt sql -q "create user new_user;"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "no privilege file specified, to persist users/grants run with --privilege-file=<file_path>" ]] || false
|
||||
# check for config directory
|
||||
run ls -a
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# there shouldn't be a mysql.db file
|
||||
run ls
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
# check for no privileges.db file
|
||||
run ls .doltcfg
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
# create new_user
|
||||
run dolt sql -q "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# remove privs.db just in case
|
||||
rm -f privs.db
|
||||
# check for config directory
|
||||
run ls -a
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# check for no privileges.db file
|
||||
run ls .doltcfg
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# remove config directory just in case
|
||||
rm -rf .doltcfg
|
||||
}
|
||||
|
||||
@test "sql: dolt sql -q with privilege file persists" {
|
||||
# mysql database exists and has privilege tables
|
||||
run dolt sql --privilege-file=privs.db -q "show tables from mysql;"
|
||||
@test "sql: check configurations specify data directory" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
|
||||
# create data dir
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
# create databases
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql --data-dir=db_dir -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "user" ]] || false
|
||||
[[ "$output" =~ "role_edges" ]] || false
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --data-dir=db_dir -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect no .doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# expect .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
run dolt sql --data-dir=db_dir -q "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --data-dir=db_dir -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect no privileges.db in current directory
|
||||
run ls
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect privileges.db in $datadir/.doltcfg
|
||||
run ls db_dir/.doltcfg
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
|
||||
# test relative to $datadir
|
||||
cd db_dir
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# expect to find same users when in $datadir
|
||||
run dolt sql -q "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
}
|
||||
|
||||
@test "sql: check configurations specify doltcfg directory" {
|
||||
# remove any previous config directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf doltcfgdir
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect only custom doltcfgdir
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# create new_user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir -q "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect privileges files in doltcfgdir
|
||||
run ls doltcfgdir
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# remove config directory just in case
|
||||
rm -rf .doltcfg
|
||||
rm -rf doltcfgdir
|
||||
}
|
||||
|
||||
@test "sql: check configurations specify privilege file" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -f privs.db
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# create a new user, fails
|
||||
run dolt sql --privilege-file=privs.db -q "create user new_user;"
|
||||
# expect default doltcfg directory
|
||||
run ls -a
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new_user
|
||||
run dolt sql --privilege-file=privs.db -q "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect just root user
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# there should now be a mysql.db file
|
||||
# expect custom privilege file current directory
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
# expect to not see new_user when privs.db not specified
|
||||
run dolt sql -q "select user from mysql.user"
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# remove mysql.db
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -f privs.db
|
||||
}
|
||||
|
||||
@test "sql: check configurations specify data directory and doltcfg directory" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf doltcfgdir
|
||||
|
||||
# create data dir
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
# create databases
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect custom doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# expect no .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir -q "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect no privileges.db in current directory
|
||||
run ls
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# expect privileges.db in $doltcfg directory
|
||||
run ls doltcfgdir
|
||||
[[ "$output" =~ "privileges.db" ]] || false
|
||||
|
||||
# test relative to $datadir
|
||||
cd db_dir
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect root
|
||||
run dolt sql -q "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --doltcfg-dir=../doltcfgdir -q "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf doltcfgdir
|
||||
}
|
||||
|
||||
@test "sql: check configurations specify data directory and privilege file" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf privs.db
|
||||
|
||||
# create data dir
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
# create databases
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql --data-dir=db_dir --privilege-file=privs.db -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --data-dir=db_dir --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect no .doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# expect .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
[[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
run dolt sql --data-dir=db_dir --privilege-file=privs.db -q "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --data-dir=db_dir --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect privs.db in current directory
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privs.db in $doltcfg directory
|
||||
run ls db_dir/.doltcfg
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# test relative to $datadir
|
||||
cd db_dir
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect root
|
||||
run dolt sql -q "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --privilege-file=../privs.db -q "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf privs.db
|
||||
}
|
||||
|
||||
@test "sql: dcheck configurations specify doltcfg directory and privilege file" {
|
||||
# remove any previous config directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf doltcfgdir
|
||||
rm -rf privs.db
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect custom doltcfgdir
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# create new_user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect privileges file
|
||||
run ls
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges file in doltcfgdir
|
||||
run ls doltcfgdir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# remove config directory just in case
|
||||
rm -rf .doltcfg
|
||||
rm -rf doltcfgdir
|
||||
rm -rf privs.db
|
||||
}
|
||||
|
||||
@test "sql: check configurations specify data directory, doltcfg directory, and privilege file" {
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf doltcfgdir
|
||||
rm -rf privs.db
|
||||
|
||||
# create data dir
|
||||
mkdir db_dir
|
||||
cd db_dir
|
||||
|
||||
# create databases
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect just root user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect custom doltcfg in current directory
|
||||
run ls -a
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
[[ "$output" =~ "doltcfgdir" ]] || false
|
||||
|
||||
# expect no .doltcfg in $datadir
|
||||
run ls -a db_dir
|
||||
! [[ "$output" =~ ".doltcfg" ]] || false
|
||||
|
||||
# create new user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "create user new_user"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# show users, expect root user and new_user
|
||||
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "select user from mysql.user;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# expect privs.db in current directory
|
||||
run ls
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
[[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $datadir directory
|
||||
run ls db_dir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# expect no privileges.db in $doltcfg directory
|
||||
run ls doltcfgdir
|
||||
! [[ "$output" =~ "privileges.db" ]] || false
|
||||
! [[ "$output" =~ "privs.db" ]] || false
|
||||
|
||||
# test relative to $datadir
|
||||
cd db_dir
|
||||
|
||||
# show databases, expect all
|
||||
run dolt sql -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "db1" ]] || false
|
||||
[[ "$output" =~ "db2" ]] || false
|
||||
[[ "$output" =~ "db3" ]] || false
|
||||
|
||||
# show users, expect root
|
||||
run dolt sql -q "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --doltcfg-dir=../doltcfgdir -q "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
! [[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
# show users, expect root and new_user
|
||||
run dolt sql --privilege-file=../privs.db -q "select user from mysql.user"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "root" ]] || false
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove config files
|
||||
rm -rf .doltcfg
|
||||
rm -rf db_dir
|
||||
rm -rf doltcfgdir
|
||||
rm -rf privs.db
|
||||
}
|
||||
|
||||
@test "sql: dolt sql -q create database and specify privilege file" {
|
||||
# remove existing directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf inner_db
|
||||
rm -f privs.db
|
||||
|
||||
run dolt sql --privilege-file=privs.db -q "create database inner_db;"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
@@ -123,9 +628,110 @@ teardown() {
|
||||
[[ "$output" =~ "new_user" ]] || false
|
||||
|
||||
cd ..
|
||||
|
||||
# remove existing directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf inner_db
|
||||
rm -f privs.db
|
||||
}
|
||||
|
||||
@test "sql: dolt sql -q .doltcfg in parent directory errors" {
|
||||
# remove existing directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf inner_db
|
||||
|
||||
mkdir .doltcfg
|
||||
mkdir inner_db
|
||||
cd inner_db
|
||||
mkdir .doltcfg
|
||||
|
||||
run dolt sql -q "show databases;"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "multiple .doltcfg directories detected" ]] || false
|
||||
|
||||
# specifying datadir, resolves issue
|
||||
run dolt sql --data-dir=. -q "show databases;"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# remove existing directories
|
||||
rm -rf .doltcfg
|
||||
rm -rf inner_db
|
||||
}
|
||||
|
||||
@test "sql: dolt sql -q specify data directory outside of dolt repo" {
|
||||
# remove files
|
||||
rm -rf datadir
|
||||
rm -rf .doltcfg
|
||||
rm -rf new_repo
|
||||
|
||||
# initialize data directory and inner dbs
|
||||
mkdir datadir
|
||||
cd datadir
|
||||
|
||||
mkdir db1
|
||||
cd db1
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db2
|
||||
cd db2
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
mkdir db3
|
||||
cd db3
|
||||
dolt init
|
||||
cd ..
|
||||
|
||||
# save data path
|
||||
DATADIR=$(pwd)
|
||||
|
||||
cd ..
|
||||
|
||||
# initialize new repo
|
||||
mkdir new_repo
|
||||
cd new_repo
|
||||
|
||||
run dolt sql --data-dir=$DATADIR -q "show databases"
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "db1" ]] || false
|
||||
[[ $output =~ "db2" ]] || false
|
||||
[[ $output =~ "db3" ]] || false
|
||||
|
||||
run dolt sql --data-dir=$DATADIR -q "create user new_user"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt sql --data-dir=$DATADIR -q "use db1; select user from mysql.user"
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "new_user" ]] || false
|
||||
|
||||
run dolt sql --data-dir=$DATADIR -q "use db2; select user from mysql.user"
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "new_user" ]] || false
|
||||
|
||||
run dolt sql --data-dir=$DATADIR -q "use db3; select user from mysql.user"
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "new_user" ]] || false
|
||||
|
||||
# check that correct files exist
|
||||
cd ..
|
||||
|
||||
run ls -a
|
||||
[[ $output =~ "datadir" ]] || false
|
||||
[[ $output =~ "new_repo" ]] || false
|
||||
! [[ $output =~ ".doltcfg" ]] || false
|
||||
|
||||
run ls -a datadir
|
||||
[[ $output =~ ".doltcfg" ]] || false
|
||||
|
||||
run ls -a datadir/.doltcfg
|
||||
[[ $output =~ "privileges.db" ]] || false
|
||||
|
||||
# remove files
|
||||
rm -rf new_repo
|
||||
rm -rf datadir
|
||||
}
|
||||
|
||||
@test "sql: errors do not write incomplete rows" {
|
||||
dolt sql <<"SQL"
|
||||
CREATE TABLE test (
|
||||
|
||||
Reference in New Issue
Block a user