2020-08-06 20:58:47 +03:00
|
|
|
package cli
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/neilotoole/sq/drivers/sqlite3"
|
|
|
|
"github.com/neilotoole/sq/libsq/errz"
|
|
|
|
"github.com/neilotoole/sq/libsq/source"
|
|
|
|
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
)
|
|
|
|
|
|
|
|
// TODO: dump all this "internal" stuff: make the options as follows: @HANDLE, file, memory
|
|
|
|
|
|
|
|
func newScratchCmd() (*cobra.Command, runFunc) {
|
|
|
|
cmd := &cobra.Command{
|
|
|
|
Use: "scratch [@HANDLE|internal|internal:file|internal:mem|@scratch]",
|
|
|
|
Example: ` # get scratch data source
|
|
|
|
sq scratch
|
|
|
|
# set @my1 as scratch data source
|
|
|
|
sq scratch @my1
|
|
|
|
# use the default embedded db
|
|
|
|
sq scratch internal
|
|
|
|
# explicitly specify use of embedded file db
|
|
|
|
sq scratch internal:file
|
|
|
|
# explicitly specify use of embedded memory db
|
|
|
|
sq scratch internal:mem
|
|
|
|
# restore default scratch db (equivalent to "internal")
|
|
|
|
sq scratch @scratch`,
|
|
|
|
Short: "Get or set scratch data source",
|
|
|
|
Long: `Get or set scratch data source. The scratch db is used internally by sq for multiple purposes such as
|
|
|
|
importing non-SQL data, or cross-database joins. If no argument provided, get the current scratch data
|
|
|
|
source. Otherwise, set @HANDLE or an internal db as the scratch data source. The reserved handle "@scratch" resets the
|
|
|
|
`,
|
|
|
|
}
|
|
|
|
|
|
|
|
return cmd, execScratch
|
|
|
|
}
|
|
|
|
|
|
|
|
func execScratch(rc *RunContext, cmd *cobra.Command, args []string) error {
|
|
|
|
if len(args) > 1 {
|
|
|
|
return errz.Errorf(msgInvalidArgs)
|
|
|
|
}
|
|
|
|
|
|
|
|
cfg := rc.Config
|
|
|
|
|
|
|
|
var src *source.Source
|
|
|
|
var err error
|
|
|
|
defaultScratch := &source.Source{
|
|
|
|
Handle: source.ScratchHandle,
|
|
|
|
Location: "internal:file",
|
|
|
|
Type: sqlite3.Type,
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(args) == 0 {
|
|
|
|
// Print the scratch src
|
|
|
|
src = cfg.Sources.Scratch()
|
|
|
|
if src == nil {
|
|
|
|
src = defaultScratch
|
|
|
|
}
|
|
|
|
|
2020-08-08 06:06:56 +03:00
|
|
|
return rc.writers.srcw.Source(src)
|
2020-08-06 20:58:47 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Set the scratch src
|
|
|
|
|
|
|
|
switch args[0] {
|
|
|
|
case "internal", "internal:file", "internal:mem":
|
|
|
|
// TODO: currently only supports file sqlite3 db, fairly trivial to do mem as well
|
|
|
|
_, _ = cfg.Sources.SetScratch("")
|
|
|
|
src = defaultScratch
|
|
|
|
default:
|
|
|
|
src, err = cfg.Sources.SetScratch(args[0])
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
err = rc.ConfigStore.Save(rc.Config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2020-08-08 06:06:56 +03:00
|
|
|
return rc.writers.srcw.Source(src)
|
2020-08-06 20:58:47 +03:00
|
|
|
}
|