Skip to content

Commit 6548823

Browse files
committed
Saving changes
1 parent de9b440 commit 6548823

File tree

4 files changed

+173
-41
lines changed

4 files changed

+173
-41
lines changed

cmd/modern/root/install/mssql-base.go

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,6 @@ type MssqlBase struct {
5656
useDatabaseUrl string
5757
useMechanism string
5858

59-
openTool string
60-
openFile string
61-
6259
unitTesting bool
6360

6461
sql sql.Sql
@@ -388,36 +385,34 @@ func (c *MssqlBase) createContainer(imageName string, contextName string) {
388385
useDatabase.BringOnline(c.sql.Query, contextOptions.Username, contextOptions.Password)
389386
}
390387

391-
if c.openTool == "" {
392-
hints := [][]string{}
393-
394-
// TODO: sqlcmd open ads only support on Windows right now, add Mac support
395-
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
396-
hints = append(hints, []string{localizer.Sprintf("Open in Azure Data Studio"), "sqlcmd open ads"})
397-
}
388+
hints := [][]string{}
398389

399-
hints = append(hints, []string{localizer.Sprintf("Run a query"), "sqlcmd query \"SELECT @@version\""})
400-
hints = append(hints, []string{localizer.Sprintf("Start interactive session"), "sqlcmd query"})
401-
402-
if previousContextName != "" {
403-
hints = append(
404-
hints,
405-
[]string{localizer.Sprintf("Change current context"), fmt.Sprintf(
406-
"sqlcmd config use-context %v",
407-
previousContextName,
408-
)},
409-
)
410-
}
390+
// TODO: sqlcmd open ads only support on Windows right now, add Mac support
391+
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
392+
hints = append(hints, []string{localizer.Sprintf("Open in Azure Data Studio"), "sqlcmd open ads"})
393+
}
411394

412-
hints = append(hints, []string{localizer.Sprintf("View sqlcmd configuration"), "sqlcmd config view"})
413-
hints = append(hints, []string{localizer.Sprintf("See connection strings"), "sqlcmd config connection-strings"})
414-
hints = append(hints, []string{localizer.Sprintf("Remove"), "sqlcmd delete"})
395+
hints = append(hints, []string{localizer.Sprintf("Run a query"), "sqlcmd query \"SELECT @@version\""})
396+
hints = append(hints, []string{localizer.Sprintf("Start interactive session"), "sqlcmd query"})
415397

416-
output.InfofWithHintExamples(hints,
417-
localizer.Sprintf("Now ready for client connections on port %d",
418-
c.port),
398+
if previousContextName != "" {
399+
hints = append(
400+
hints,
401+
[]string{localizer.Sprintf("Change current context"), fmt.Sprintf(
402+
"sqlcmd config use-context %v",
403+
previousContextName,
404+
)},
419405
)
420406
}
407+
408+
hints = append(hints, []string{localizer.Sprintf("View sqlcmd configuration"), "sqlcmd config view"})
409+
hints = append(hints, []string{localizer.Sprintf("See connection strings"), "sqlcmd config connection-strings"})
410+
hints = append(hints, []string{localizer.Sprintf("Remove"), "sqlcmd delete"})
411+
412+
output.InfofWithHintExamples(hints,
413+
localizer.Sprintf("Now ready for client connections on port %d",
414+
c.port),
415+
)
421416
}
422417

423418
func (c *MssqlBase) verifyUseSourceFileExists(
@@ -442,10 +437,8 @@ func (c *MssqlBase) verifyUseSourceFileExists(
442437
if useDatabase.IsRemoteUrl() && !useDatabase.IsValidScheme() {
443438
output.FatalfWithHints(
444439
[]string{
445-
fmt.Sprintf(
446-
localizer.Sprintf("--use URL must one of %q"),
447-
strings.Join(useDatabase.ValidSchemes(), ", "),
448-
),
440+
localizer.Sprintf("--use URL must one of %q"),
441+
strings.Join(useDatabase.ValidSchemes(), ", "),
449442
},
450443
localizer.Sprintf("%q is not a valid URL for --use flag", c.useDatabaseUrl))
451444
}

cmd/modern/root/install/mssql.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,6 @@ func (c *Mssql) DefineCommand(...cmdparser.CommandOptions) {
4343
{
4444
Description: localizer.Sprintf("Create SQL Server with an empty user database"),
4545
Steps: []string{"sqlcmd create mssql --database db1"}},
46-
{
47-
Description: localizer.Sprintf("Create SQL Server, download and attach AdventureWorks sample database"),
48-
Steps: []string{"sqlcmd create mssql --using https://aka.ms/AdventureWorksLT.bak"}},
49-
{
50-
Description: localizer.Sprintf("Create SQL Server, download and attach AdventureWorks sample database with different database name"),
51-
Steps: []string{"sqlcmd create mssql --using https://aka.ms/AdventureWorksLT.bak,adventureworks"}},
52-
{
53-
Description: localizer.Sprintf("Create SQL Server with an empty user database"),
54-
Steps: []string{"sqlcmd create mssql --user-database db1"}},
5546
{
5647
Description: localizer.Sprintf("Install/Create SQL Server with full logging"),
5748
Steps: []string{"sqlcmd create mssql --verbosity 4"}},

cmd/modern/root/use.go

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
4+
package root
5+
6+
import (
7+
"fmt"
8+
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
9+
"github.com/microsoft/go-sqlcmd/internal/config"
10+
"github.com/microsoft/go-sqlcmd/internal/container"
11+
"github.com/microsoft/go-sqlcmd/internal/localizer"
12+
"github.com/microsoft/go-sqlcmd/internal/secret"
13+
"github.com/microsoft/go-sqlcmd/internal/sql"
14+
"github.com/microsoft/go-sqlcmd/pkg/mssqlcontainer/ingest"
15+
"github.com/microsoft/go-sqlcmd/pkg/mssqlcontainer/ingest/mechanism"
16+
"strings"
17+
)
18+
19+
type Use struct {
20+
cmdparser.Cmd
21+
22+
url string
23+
useMechanism string
24+
25+
sql sql.Sql
26+
}
27+
28+
func (c *Use) DefineCommand(...cmdparser.CommandOptions) {
29+
examples := []cmdparser.ExampleOptions{
30+
{
31+
Description: "Download AdventureWorksLT into container for current context, set as default database",
32+
Steps: []string{`sqlcmd use https://aka.ms/AdventureWorksLT.bak`}},
33+
}
34+
35+
options := cmdparser.CommandOptions{
36+
Use: "use",
37+
Short: fmt.Sprintf("Download database (into container) (%s)", ingest.ValidFileExtensions()),
38+
Examples: examples,
39+
Run: c.run,
40+
FirstArgAlternativeForFlag: &cmdparser.AlternativeForFlagOptions{Flag: "url", Value: &c.url},
41+
}
42+
43+
c.Cmd.DefineCommand(options)
44+
45+
c.AddFlag(cmdparser.FlagOptions{
46+
String: &c.url,
47+
Name: "url",
48+
Usage: "Name of context to set as current context"})
49+
50+
c.AddFlag(cmdparser.FlagOptions{
51+
String: &c.useMechanism,
52+
DefaultString: "",
53+
Name: "use-mechanism",
54+
Usage: localizer.Sprintf("Mechanism to use to bring database online (%s)", strings.Join(mechanism.Mechanisms(), ",")),
55+
})
56+
}
57+
58+
func (c *Use) run() {
59+
output := useOutput{output: c.Output()}
60+
61+
controller := container.NewController()
62+
id := config.ContainerId()
63+
64+
if !config.CurrentContextEndpointHasContainer() {
65+
output.FatalNoContainerInCurrentContext()
66+
}
67+
68+
if !controller.ContainerRunning(id) {
69+
output.FatalContainerNotRunning()
70+
}
71+
72+
endpoint, user := config.CurrentContext()
73+
74+
c.sql = sql.NewSql(sql.SqlOptions{})
75+
c.sql.Connect(endpoint, user, sql.ConnectOptions{Database: "master"})
76+
77+
useDatabase := ingest.NewIngest(c.url, controller, ingest.IngestOptions{
78+
Mechanism: c.useMechanism,
79+
})
80+
81+
if !useDatabase.SourceFileExists() {
82+
output.FatalDatabaseSourceFileNotExist(c.url)
83+
}
84+
85+
// Copy source file (e.g. .bak/.bacpac etc.) for database to be made available to container
86+
useDatabase.CopyToContainer(id)
87+
88+
output.output.Infof("Bringing %q online using %q method",
89+
useDatabase.DatabaseName(),
90+
useDatabase.OnlineMethod(),
91+
)
92+
93+
useDatabase.BringOnline(
94+
c.sql.Query,
95+
user.BasicAuth.Username,
96+
secret.Decode(user.BasicAuth.Password, user.BasicAuth.PasswordEncryption),
97+
)
98+
99+
output.InfoDatabaseOnline(useDatabase.DatabaseName())
100+
}
101+
102+
func (c *Use) query(commandText string) {
103+
c.sql.Query(commandText)
104+
}

cmd/modern/root/use_output.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package root
2+
3+
import (
4+
"fmt"
5+
"github.com/microsoft/go-sqlcmd/internal/output"
6+
"runtime"
7+
)
8+
9+
type useOutput struct {
10+
output.Output
11+
output *output.Output
12+
}
13+
14+
func (u *useOutput) FatalNoContainerInCurrentContext() {
15+
u.output.FatalfWithHintExamples([][]string{
16+
{"Create a context with a container", "sqlcmd create mssql"},
17+
}, "Current context does not have a container")
18+
}
19+
20+
func (u *useOutput) FatalContainerNotRunning() {
21+
u.output.FatalfWithHintExamples([][]string{
22+
{"Start container for current context", "sqlcmd start"},
23+
}, "Container for current context is not running")
24+
}
25+
26+
func (u *useOutput) FatalDatabaseSourceFileNotExist(url string) {
27+
u.output.FatalfWithHints(
28+
[]string{fmt.Sprintf("File does not exist at URL %q", url)},
29+
"Unable to download file to container")
30+
}
31+
32+
func (u *useOutput) InfoDatabaseOnline(databaseName string) {
33+
hints := [][]string{}
34+
35+
// TODO: sqlcmd open ads only support on Windows/Mac right now, add Linux support
36+
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
37+
hints = append(hints, []string{"Open in Azure Data Studio", "sqlcmd open ads"})
38+
}
39+
40+
hints = append(hints, []string{"Run a query", "sqlcmd query \"SELECT DB_NAME()\""})
41+
hints = append(hints, []string{"See connection strings", "sqlcmd config connection-strings"})
42+
43+
u.output.InfofWithHintExamples(hints, "Database %q is now online", databaseName)
44+
}

0 commit comments

Comments
 (0)