Skip to content

Commit abff8b6

Browse files
committed
Saving changes
1 parent a6b0d83 commit abff8b6

File tree

6 files changed

+70
-20
lines changed

6 files changed

+70
-20
lines changed

cmd/modern/root/use.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,22 @@ func (c *Use) run() {
8383
useDatabase.CopyToContainer(id)
8484

8585
if useDatabase.IsExtractionNeeded() {
86-
output.output.Infof("Extracting files from %q", useDatabase.UrlFilename())
86+
output.Infof("Extracting files from %q", useDatabase.UrlFilename())
8787
useDatabase.Extract()
8888
}
8989

90+
output.output.Infof("Bringing %q online using %q method",
91+
useDatabase.DatabaseName(),
92+
useDatabase.OnlineMethod(),
93+
)
94+
9095
useDatabase.BringOnline(
9196
c.sql.Query,
9297
user.BasicAuth.Username,
9398
secret.Decode(user.BasicAuth.Password, user.BasicAuth.PasswordEncryption),
9499
)
100+
101+
output.InfoDatabaseOnline(useDatabase.DatabaseName())
95102
}
96103

97104
func (c *Use) query(commandText string) {

cmd/modern/root/use_output.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ package root
33
import (
44
"fmt"
55
"github.com/microsoft/go-sqlcmd/internal/output"
6+
"runtime"
67
)
78

89
type useOutput struct {
9-
*output.Output
10+
output.Output
1011
output *output.Output
1112
}
1213

@@ -27,3 +28,17 @@ func (u *useOutput) FatalDatabaseSourceFileNotExist(url string) {
2728
[]string{fmt.Sprintf("File does not exist at URL %q", url)},
2829
"Unable to download file to container")
2930
}
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+
}

pkg/mssqlcontainer/ingest/ingest.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ func (i *ingest) UrlFilename() string {
3939
return i.url.Filename
4040
}
4141

42+
func (i *ingest) OnlineMethod() string {
43+
return i.mechanism.Name()
44+
}
45+
4246
func (i *ingest) DatabaseName() string {
4347
return i.url.DatabaseName
4448
}

pkg/mssqlcontainer/ingest/interface.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ type Ingest interface {
99
SourceFileExists() bool
1010
DatabaseName() string
1111
UrlFilename() string
12+
OnlineMethod() string
1213
UserProvidedFileExt() string
1314

1415
CopyToContainer(containerId string)

pkg/mssqlcontainer/ingest/mechanism/bacpac.go renamed to pkg/mssqlcontainer/ingest/mechanism/dacfx.go

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,28 @@ import (
55
"github.com/microsoft/go-sqlcmd/internal/container"
66
)
77

8-
type bacpac struct {
8+
type dacfx struct {
99
controller *container.Controller
1010
containerId string
1111
}
1212

13-
func (m *bacpac) Initialize(controller *container.Controller) {
13+
func (m *dacfx) Initialize(controller *container.Controller) {
1414
m.controller = controller
1515
}
1616

17-
func (m *bacpac) CopyToLocation() string {
17+
func (m *dacfx) CopyToLocation() string {
1818
return "/var/opt/mssql/backup"
1919
}
2020

21-
func (m *bacpac) Name() string {
21+
func (m *dacfx) Name() string {
2222
return "dacfx"
2323
}
2424

25-
func (m *bacpac) FileTypes() []string {
25+
func (m *dacfx) FileTypes() []string {
2626
return []string{"bacpac", "dacpac"}
2727
}
2828

29-
func (m *bacpac) BringOnline(
29+
func (m *dacfx) BringOnline(
3030
databaseName string,
3131
containerId string,
3232
query func(string),
@@ -36,7 +36,7 @@ func (m *bacpac) BringOnline(
3636
m.installSqlPackage()
3737
m.setDefaultDatabaseToMaster(options.Username, query)
3838

39-
m.RunCommand([]string{
39+
_, stderr := m.RunCommand([]string{
4040
"/home/mssql/.dotnet/tools/sqlpackage",
4141
"/Diagnostics:true",
4242
"/Action:import",
@@ -47,23 +47,40 @@ func (m *bacpac) BringOnline(
4747
"/TargetUser:" + options.Username,
4848
"/TargetPassword:" + options.Password,
4949
})
50+
51+
if len(stderr) == 0 {
52+
// Remove the source bacpac file
53+
m.RunCommandAsRoot([]string{"rm", m.CopyToLocation() + "/" + options.Filename})
54+
}
5055
}
5156

52-
func (m *bacpac) setDefaultDatabaseToMaster(username string, query func(string)) {
57+
func (m *dacfx) setDefaultDatabaseToMaster(username string, query func(string)) {
5358
alterDefaultDb := fmt.Sprintf(
5459
"ALTER LOGIN [%s] WITH DEFAULT_DATABASE = [%s]",
5560
username,
5661
"master")
5762
query(alterDefaultDb)
5863
}
5964

60-
func (m *bacpac) installSqlPackage() {
65+
func (m *dacfx) installSqlPackage() {
6166
if m.controller == nil {
6267
panic("controller is nil")
6368
}
6469

70+
m.installDotNet()
71+
72+
// Check if sqlpackage is installed, if not, install it
73+
_, stderr := m.RunCommand([]string{"/home/mssql/.dotnet/tools/sqlpackage", "/version"})
74+
if len(stderr) > 0 {
75+
m.RunCommand([]string{"/opt/dotnet/dotnet", "tool", "install", "-g", "microsoft.sqlpackage"})
76+
}
77+
}
78+
79+
func (m *dacfx) installDotNet() {
80+
// Check if dotnet is installed, if not, install it
6581
_, stderr := m.RunCommand([]string{"/opt/dotnet/dotnet", "--version"})
6682
if len(stderr) > 0 {
83+
// Download dotnet-install.sh and run it
6784
m.RunCommand([]string{"wget", "https://dot.net/v1/dotnet-install.sh", "-O", "/tmp/dotnet-install.sh"})
6885
m.RunCommand([]string{"chmod", "+x", "/tmp/dotnet-install.sh"})
6986
m.RunCommand([]string{"/tmp/dotnet-install.sh", "--install-dir", "/opt/dotnet"})
@@ -73,23 +90,29 @@ func (m *bacpac) installSqlPackage() {
7390
m.RunCommandAsRoot([]string{"mkdir", "-p", "/home/mssql"})
7491
m.RunCommandAsRoot([]string{"chown", "mssql:root", "/home/mssql"})
7592

76-
m.RunCommand([]string{"/bin/bash", "-c", "echo 'export DOTNET_ROOT=/opt/dotnet' > /home/mssql/.bashrc"})
77-
m.RunCommand([]string{"/bin/bash", "-c", "echo 'export PATH=$PATH:$DOTNET_ROOT:/home/mssql/.dotnet/tools' >> /home/mssql/.bashrc"})
93+
// Add dotnet to the path
94+
m.AddTextLineToFile(
95+
"export DOTNET_ROOT=/opt/dotnet",
96+
"/home/mssql/.bashrc",
97+
)
98+
m.AddTextLineToFile(
99+
"export PATH=$PATH:$DOTNET_ROOT:/home/mssql/.dotnet/tools",
100+
"/home/mssql/.bashrc",
101+
)
78102
}
103+
}
79104

80-
_, stderr = m.RunCommand([]string{"/home/mssql/.dotnet/tools/sqlpackage", "/version"})
81-
if len(stderr) > 0 {
82-
m.RunCommand([]string{"/opt/dotnet/dotnet", "tool", "install", "-g", "microsoft.sqlpackage"})
83-
}
105+
func (m *dacfx) AddTextLineToFile(text string, file string) ([]byte, []byte) {
106+
return m.RunCommand([]string{"/bin/bash", "-c", fmt.Sprintf("echo '%v' >> %v", text, file)})
84107
}
85108

86-
func (m *bacpac) RunCommand(s []string) ([]byte, []byte) {
109+
func (m *dacfx) RunCommand(s []string) ([]byte, []byte) {
87110
return m.controller.RunCmdInContainer(m.containerId, s, container.ExecOptions{
88111
Env: []string{"DOTNET_ROOT=/opt/dotnet"},
89112
})
90113
}
91114

92-
func (m *bacpac) RunCommandAsRoot(s []string) ([]byte, []byte) {
115+
func (m *dacfx) RunCommandAsRoot(s []string) ([]byte, []byte) {
93116
return m.controller.RunCmdInContainer(m.containerId, s, container.ExecOptions{
94117
User: "root",
95118
})

pkg/mssqlcontainer/ingest/mechanism/mechanism.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package mechanism
22

33
var mechanisms = []Mechanism{
44
&attach{},
5-
&bacpac{},
5+
&dacfx{},
66
&restore{},
77
}
88

0 commit comments

Comments
 (0)