Skip to content

Commit 3ac1554

Browse files
committed
Saving changes
1 parent bc02ce7 commit 3ac1554

File tree

15 files changed

+150
-65
lines changed

15 files changed

+150
-65
lines changed

cmd/modern/root/use.go

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ func (c *Use) run() {
8787
useDatabase.CopyToContainer(id)
8888

8989
if useDatabase.IsExtractionNeeded() {
90+
fmt.Println("Extracting database from file")
9091
useDatabase.Extract()
9192
}
9293

internal/uri/uri.go

+15-3
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ func (u Uri) FileExtension() string {
5050
}
5151

5252
func (u Uri) Filename() string {
53-
return filepath.Base(u.ActualUrl())
53+
filename := filepath.Base(u.ActualUrl())
54+
if filename == "" {
55+
panic("filename is empty")
56+
}
57+
return filename
5458
}
5559

5660
// parseDbName returns the databaseName from --using arg
@@ -110,9 +114,17 @@ func (u Uri) ParseDbName() string {
110114

111115
func (u Uri) GetDbNameAsIdentifier() string {
112116
escapedDbName := strings.ReplaceAll(u.ParseDbName(), "'", "''")
113-
return strings.ReplaceAll(escapedDbName, "]", "]]")
117+
dbName := strings.ReplaceAll(escapedDbName, "]", "]]")
118+
if dbName == "" {
119+
panic("database name is empty")
120+
}
121+
return dbName
114122
}
115123

116124
func (u Uri) GetDbNameAsNonIdentifier() string {
117-
return strings.ReplaceAll(u.ParseDbName(), "]", "]]")
125+
dbName := strings.ReplaceAll(u.ParseDbName(), "]", "]]")
126+
if dbName == "" {
127+
panic("database name is empty")
128+
}
129+
return dbName
118130
}

pkg/mssqlcontainer/ingest/extract/7zip.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,50 @@
11
package extract
22

33
import (
4+
"fmt"
45
"github.com/microsoft/go-sqlcmd/internal/container"
56
"path/filepath"
67
"regexp"
8+
"strings"
79
)
810

911
type sevenZip struct {
10-
controller container.Controller
12+
controller *container.Controller
1113
containerId string
1214
}
1315

14-
func (e sevenZip) FileTypes() []string {
16+
func (e *sevenZip) Initialize(controller *container.Controller) {
17+
e.controller = controller
18+
}
19+
20+
func (e *sevenZip) FileTypes() []string {
1521
return []string{"7z"}
1622
}
1723

18-
func (e sevenZip) IsInstalled(containerId string) bool {
24+
func (e *sevenZip) IsInstalled(containerId string) bool {
1925
e.containerId = containerId
2026

2127
return false
2228
}
2329

24-
func (e sevenZip) Extract(srcFile string, destFolder string) (string, string) {
30+
func (e *sevenZip) Extract(srcFile string, destFolder string) (string, string) {
2531
e.controller.RunCmdInContainer(e.containerId, []string{
2632
"/opt/7-zip/7zz",
2733
"x",
2834
"-o" + destFolder,
29-
srcFile,
35+
"/var/opt/mssql/backup/" + srcFile,
3036
})
3137

3238
stdout, _ := e.controller.RunCmdInContainer(e.containerId, []string{
3339
"./opt/7-zip/7zz",
3440
"l",
3541
"-ba",
3642
"-slt",
37-
srcFile,
43+
"/var/opt/mssql/backup/" + srcFile,
3844
})
3945

46+
fmt.Println(stdout)
47+
4048
var mdfFile string
4149
var ldfFile string
4250

@@ -54,7 +62,7 @@ func (e sevenZip) Extract(srcFile string, destFolder string) (string, string) {
5462
return mdfFile, ldfFile
5563
}
5664

57-
func (e sevenZip) Install() {
65+
func (e *sevenZip) Install() {
5866
e.controller.RunCmdInContainer(e.containerId, []string{
5967
"mkdir",
6068
"/opt/7-zip"})
@@ -87,5 +95,6 @@ func extractPaths(input string) []string {
8795
for _, match := range matches {
8896
paths = append(paths, match[1])
8997
}
98+
fmt.Println("Path: " + strings.Join(paths, ", "))
9099
return paths
91100
}

pkg/mssqlcontainer/ingest/extract/factory.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
package extract
22

3-
func NewExtractor(fileExtension string) Extractor {
3+
import (
4+
"fmt"
5+
"github.com/microsoft/go-sqlcmd/internal/container"
6+
)
7+
8+
func NewExtractor(fileExtension string, controller *container.Controller) Extractor {
9+
fmt.Println("NewExtractor: " + fileExtension)
410
for _, extractor := range extractors {
511
for _, ext := range extractor.FileTypes() {
612
if ext == fileExtension {
13+
extractor.Initialize(controller)
714
return extractor
815
}
916
}

pkg/mssqlcontainer/ingest/extract/interface.go

+3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package extract
22

3+
import "github.com/microsoft/go-sqlcmd/internal/container"
4+
35
type Extractor interface {
46
FileTypes() []string
7+
Initialize(controller *container.Controller)
58
IsInstalled(containerId string) bool
69
Install()
710
Extract(srcFile string, destFolder string) (filename string, ldfFilename string)
+11-4
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
package extract
22

3+
import "github.com/microsoft/go-sqlcmd/internal/container"
4+
35
type tar struct {
6+
controller *container.Controller
47
}
58

6-
func (e tar) FileTypes() []string {
9+
func (e *tar) FileTypes() []string {
710
return []string{"tar"}
811
}
912

10-
func (e tar) IsInstalled(containerId string) bool {
13+
func (e *tar) Initialize(controller *container.Controller) {
14+
e.controller = controller
15+
}
16+
17+
func (e *tar) IsInstalled(containerId string) bool {
1118
return true
1219
}
1320

14-
func (e tar) Extract(srcFile string, destFolder string) (string, string) {
21+
func (e *tar) Extract(srcFile string, destFolder string) (string, string) {
1522
return "", ""
1623
}
1724

18-
func (e tar) Install() {
25+
func (e *tar) Install() {
1926
}

pkg/mssqlcontainer/ingest/factory.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import (
1010
func NewIngest(databaseUri string, controller *container.Controller, options IngestOptions) Ingest {
1111
uri := uri.NewUri(databaseUri)
1212

13-
return ingest{
14-
uri: uri,
15-
location: location.NewLocation(uri.IsLocal(), uri.ActualUrl(), controller),
16-
mechanism: mechanism.NewMechanism(uri.FileExtension(), options.Mechanism),
13+
return &ingest{
14+
uri: uri,
15+
controller: controller,
16+
location: location.NewLocation(uri.IsLocal(), uri.ActualUrl(), controller),
17+
mechanism: mechanism.NewMechanism(uri.FileExtension(), options.Mechanism, controller),
1718
}
1819
}

pkg/mssqlcontainer/ingest/ingest.go

+44-21
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,40 @@ package ingest
22

33
import (
44
"fmt"
5+
"github.com/microsoft/go-sqlcmd/internal/container"
56
"github.com/microsoft/go-sqlcmd/internal/uri"
67
"github.com/microsoft/go-sqlcmd/pkg/mssqlcontainer/ingest/extract"
78
"github.com/microsoft/go-sqlcmd/pkg/mssqlcontainer/ingest/location"
89
"github.com/microsoft/go-sqlcmd/pkg/mssqlcontainer/ingest/mechanism"
910
"path/filepath"
11+
"strings"
1012
)
1113

1214
type ingest struct {
1315
uri uri.Uri
1416
location location.Location
17+
controller *container.Controller
1518
mechanism mechanism.Mechanism
1619
options mechanism.BringOnlineOptions
1720
extractor extract.Extractor
1821
containerId string
1922
query func(text string)
2023
}
2124

22-
func (i ingest) IsExtractionNeeded() bool {
23-
i.extractor = extract.NewExtractor(i.uri.FileExtension())
25+
func (i *ingest) IsExtractionNeeded() bool {
26+
i.extractor = extract.NewExtractor(i.uri.FileExtension(), i.controller)
2427
if i.extractor == nil {
2528
return false
2629
} else {
2730
return true
2831
}
2932
}
3033

31-
func (i ingest) IsRemoteUrl() bool {
34+
func (i *ingest) IsRemoteUrl() bool {
3235
return !i.location.IsLocal()
3336
}
3437

35-
func (i ingest) IsValidScheme() bool {
38+
func (i *ingest) IsValidScheme() bool {
3639
for _, s := range i.location.ValidSchemes() {
3740
if s == i.uri.Scheme() {
3841
return true
@@ -41,17 +44,25 @@ func (i ingest) IsValidScheme() bool {
4144
return false
4245
}
4346

44-
func (i ingest) CopyToLocation() string {
45-
return i.mechanism.CopyToLocation()
46-
}
47+
func (i *ingest) CopyToContainer(containerId string) {
48+
destFolder := "/var/opt/mssql/backup"
49+
if i.mechanism != nil {
50+
destFolder = i.mechanism.CopyToLocation()
51+
}
52+
if i.location == nil {
53+
panic("location is nil, did you call NewIngest()?")
54+
}
4755

48-
func (i ingest) CopyToContainer(containerId string) {
4956
i.containerId = containerId
50-
i.location.CopyToContainer(containerId, i.CopyToLocation())
57+
i.location.CopyToContainer(containerId, destFolder)
5158
i.options.Filename = i.uri.Filename()
59+
60+
if i.options.Filename == "" {
61+
panic("filename is empty")
62+
}
5263
}
5364

54-
func (i ingest) Extract() {
65+
func (i *ingest) Extract() {
5566
if i.extractor == nil {
5667
panic("extractor is nil")
5768
}
@@ -61,30 +72,42 @@ func (i ingest) Extract() {
6172
}
6273

6374
i.options.Filename, i.options.LdfFilename =
64-
i.extractor.Extract(i.uri.ActualUrl(), i.CopyToLocation())
75+
i.extractor.Extract(i.uri.Filename(), "/var/opt/mssql/data")
6576

6677
if i.mechanism == nil {
67-
ext := filepath.Ext(i.options.Filename)
68-
i.mechanism = mechanism.NewMechanismByFileExt(ext)
78+
fmt.Println("FOO: " + i.options.Filename)
79+
ext := strings.TrimLeft(filepath.Ext(i.options.Filename), ".")
80+
i.mechanism = mechanism.NewMechanismByFileExt(ext, i.controller)
6981
}
82+
fmt.Println("FOO: " + i.mechanism.Name())
83+
7084
}
7185

72-
func (i ingest) BringOnline(query func(string), username string, password string) {
86+
func (i *ingest) BringOnline(query func(string), username string, password string) {
87+
if i.options.Filename == "" {
88+
panic("filename is empty, did you call CopyToContainer()?")
89+
}
90+
91+
i.query = query
7392
i.options.Username = username
7493
i.options.Password = password
75-
i.mechanism.BringOnline(i.uri.GetDbNameAsIdentifier(), i.containerId, query, i.options)
94+
i.mechanism.BringOnline(i.uri.GetDbNameAsIdentifier(), i.containerId, i.query, i.options)
7695
i.setDefaultDatabase(username)
7796
}
7897

79-
func (i ingest) setDefaultDatabase(username string) {
98+
func (i *ingest) setDefaultDatabase(username string) {
99+
if i.query == nil {
100+
panic("query is nil, did you call BringOnline()?")
101+
}
102+
80103
alterDefaultDb := fmt.Sprintf(
81104
"ALTER LOGIN [%s] WITH DEFAULT_DATABASE = [%s]",
82105
username,
83106
i.uri.GetDbNameAsNonIdentifier())
84107
i.query(alterDefaultDb)
85108
}
86109

87-
func (i ingest) IsValidFileExtension() bool {
110+
func (i *ingest) IsValidFileExtension() bool {
88111
for _, m := range mechanism.FileTypes() {
89112
if m == i.uri.FileExtension() {
90113
return true
@@ -98,19 +121,19 @@ func (i ingest) IsValidFileExtension() bool {
98121
return false
99122
}
100123

101-
func (i ingest) SourceFileExists() bool {
124+
func (i *ingest) SourceFileExists() bool {
102125
return i.location.Exists()
103126
}
104127

105-
func (i ingest) UserProvidedFileExt() string {
128+
func (i *ingest) UserProvidedFileExt() string {
106129
return i.uri.FileExtension()
107130
}
108131

109-
func (i ingest) ValidSchemes() []string {
132+
func (i *ingest) ValidSchemes() []string {
110133
return i.location.ValidSchemes()
111134
}
112135

113-
func (i ingest) ValidFileExtensions() []string {
136+
func (i *ingest) ValidFileExtensions() []string {
114137
extensions := []string{}
115138

116139
for _, m := range mechanism.FileTypes() {

pkg/mssqlcontainer/ingest/interface.go

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ type Ingest interface {
66
IsValidFileExtension() bool
77
IsExtractionNeeded() bool
88

9-
CopyToLocation() string
109
SourceFileExists() bool
1110
UserProvidedFileExt() string
1211

pkg/mssqlcontainer/ingest/mechanism/attach.go

+10-6
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,23 @@ type attach struct {
1010
containerId string
1111
}
1212

13-
func (m attach) CopyToLocation() string {
13+
func (m *attach) Initialize(controller *container.Controller) {
14+
m.controller = controller
15+
}
16+
17+
func (m *attach) CopyToLocation() string {
1418
return "/var/opt/mssql/data"
1519
}
1620

17-
func (m attach) Name() string {
21+
func (m *attach) Name() string {
1822
return "attach"
1923
}
2024

21-
func (m attach) FileTypes() []string {
25+
func (m *attach) FileTypes() []string {
2226
return []string{"mdf"}
2327
}
2428

25-
func (m attach) BringOnline(databaseName string, containerId string, query func(string), options BringOnlineOptions) {
29+
func (m *attach) BringOnline(databaseName string, containerId string, query func(string), options BringOnlineOptions) {
2630
text := `SET NOCOUNT ON; `
2731

2832
m.containerId = containerId
@@ -49,13 +53,13 @@ func (m attach) BringOnline(databaseName string, containerId string, query func(
4953
}
5054
}
5155

52-
func (m attach) setFilePermissions(filename string) {
56+
func (m *attach) setFilePermissions(filename string) {
5357
m.RunCommand([]string{"chown", "mssql:root", filename})
5458
m.RunCommand([]string{"chmod", "-o-r", filename})
5559
m.RunCommand([]string{"chmod", "-u+rw", filename})
5660
m.RunCommand([]string{"chmod", "-g+r", filename})
5761
}
5862

59-
func (m attach) RunCommand(s []string) ([]byte, []byte) {
63+
func (m *attach) RunCommand(s []string) ([]byte, []byte) {
6064
return m.controller.RunCmdInContainer(m.containerId, s)
6165
}

0 commit comments

Comments
 (0)