Skip to content

Commit 9b5a054

Browse files
committed
Add .7z support
1 parent bd1ea9f commit 9b5a054

File tree

5 files changed

+109
-20
lines changed

5 files changed

+109
-20
lines changed

cmd/modern/main.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ func main() {
5252
if strings.HasPrefix(os.Args[1], "sqlcmd://") {
5353
sqlcmdUrl := strings.TrimRight(os.Args[1][9:], "/")
5454

55-
//fmt.Printf("%q", sqlcmdUrl)
56-
57-
//_, _ = fmt.Scanln(&input)
58-
5955
data2, err := base64.StdEncoding.DecodeString(sqlcmdUrl)
6056
if err == nil {
6157
var genre2 []string

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ func (c *MssqlBase) AddFlags(
227227

228228
addFlag(cmdparser.FlagOptions{
229229
String: &c.openTool,
230-
DefaultString: "ads",
230+
DefaultString: "",
231231
Name: "open",
232232
Usage: "Open tool e.g. ads",
233233
})

cmd/modern/root/use.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
88
"github.com/microsoft/go-sqlcmd/internal/config"
99
"github.com/microsoft/go-sqlcmd/internal/container"
10+
"github.com/microsoft/go-sqlcmd/internal/secret"
1011
"github.com/microsoft/go-sqlcmd/internal/sql"
1112
"github.com/microsoft/go-sqlcmd/pkg/mssqlcontainer"
1213
)
@@ -61,14 +62,14 @@ func (c *Use) run() {
6162
endpoint, user := config.CurrentContext()
6263

6364
c.sql = sql.New(sql.SqlOptions{UnitTesting: false})
64-
c.sql.Connect(endpoint, user, sql.ConnectOptions{Interactive: false})
65+
c.sql.Connect(endpoint, user, sql.ConnectOptions{Database: "master", Interactive: false})
6566

6667
mssqlcontainer.DownloadAndRestoreDb(
6768
controller,
6869
id,
6970
c.url,
7071
user.BasicAuth.Username,
71-
user.BasicAuth.Password,
72+
secret.Decode(user.BasicAuth.Password, user.BasicAuth.PasswordEncryption),
7273
c.query,
7374
c.Cmd.Output(),
7475
)

pkg/mssqlcontainer/ingest-db.go

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/url"
99
"path"
1010
"path/filepath"
11+
"regexp"
1112
"strings"
1213
)
1314

@@ -28,7 +29,6 @@ func ValidateUsingUrlExists(
2829
}
2930

3031
if len(u.Scheme) > 3 {
31-
3232
if u.Path == "" {
3333
output.FatalfWithHints(
3434
[]string{
@@ -77,15 +77,17 @@ func DownloadAndRestoreDb(
7777

7878
databaseUrl := extractUrl(usingDatabaseUrl)
7979

80+
var log_f string
81+
var log_file string
82+
8083
_, file := filepath.Split(databaseUrl)
8184

8285
// Download file from URL into container
8386
output.Infof("Downloading %s", file)
8487

8588
var f string
8689
if len(parsed.Scheme) > 3 {
87-
u, _ := url.Parse(usingDatabaseUrl)
88-
_, f = filepath.Split(u.Path)
90+
_, f = filepath.Split(databaseUrl)
8991
} else {
9092
_, f = filepath.Split(usingDatabaseUrl)
9193
}
@@ -117,14 +119,23 @@ func DownloadAndRestoreDb(
117119
}
118120

119121
if filepath.Ext(f) == ".7z" {
122+
controller.RunCmdInContainer(containerId, []string{
123+
"mkdir",
124+
"/opt/7-zip"})
125+
120126
controller.RunCmdInContainer(containerId, []string{
121127
"wget",
122128
"-O",
123129
"/opt/7-zip/7-zip.tar",
124130
"https://7-zip.org/a/7z2201-linux-x64.tar.xz"})
125131

126-
controller.RunCmdInContainer(containerId, []string{"tar", "xvf", "/tmp/7-zip.tar"})
127-
controller.RunCmdInContainer(containerId, []string{"mkdir", "/opt/7-zip"})
132+
controller.RunCmdInContainer(containerId, []string{
133+
"tar",
134+
"xvf",
135+
"/opt/7-zip/7-zip.tar",
136+
"-C",
137+
"/opt/7-zip",
138+
})
128139
controller.RunCmdInContainer(containerId, []string{"chmod", "u+x", "/opt/7-zip/7zz"})
129140
controller.RunCmdInContainer(containerId, []string{
130141
"/opt/7-zip/7zz",
@@ -133,17 +144,30 @@ func DownloadAndRestoreDb(
133144
temporaryFolder + "/" + file,
134145
})
135146

136-
controller.RunCmdInContainer(containerId, []string{
147+
stdout, _ := controller.RunCmdInContainer(containerId, []string{
137148
"./opt/7-zip/7zz",
138149
"l",
139150
"-ba",
140151
"-slt",
141152
temporaryFolder + "/" + file,
142153
})
143154

144-
databaseName = "StackOverflow2010"
145-
f = "StackOverflow2010.mdf"
155+
databaseName = parseDbName(usingDatabaseUrl)
156+
146157
temporaryFolder = "/var/opt/mssql/data"
158+
159+
paths := extractPaths(string(stdout))
160+
for _, p := range paths {
161+
if filepath.Ext(p) == ".mdf" {
162+
f = p
163+
file = p
164+
}
165+
166+
if filepath.Ext(p) == ".ldf" {
167+
log_f = p
168+
log_file = p
169+
}
170+
}
147171
}
148172

149173
dbNameAsIdentifier := getDbNameAsIdentifier(databaseName)
@@ -188,7 +212,7 @@ DECLARE @fileListTable TABLE (
188212
INSERT INTO @fileListTable
189213
EXEC('RESTORE FILELISTONLY FROM DISK = ''%s/%s''')
190214
SET @sql = 'RESTORE DATABASE [%s] FROM DISK = ''%s/%s'' WITH '
191-
SELECT @sql = @sql + char(13) + ' MOVE ''' + LogicalName + ''' TO ''/var/opt/mssql/' + LogicalName + '.' + RIGHT(PhysicalName,CHARINDEX('\',PhysicalName)) + ''','
215+
SELECT @sql = @sql + char(13) + ' MOVE ''' + LogicalName + ''' TO ''/var/opt/mssql/data/' + LogicalName + '.' + RIGHT(PhysicalName,CHARINDEX('\',PhysicalName)) + ''','
192216
FROM @fileListTable
193217
WHERE IsPresent = 1
194218
SET @sql = SUBSTRING(@sql, 1, LEN(@sql)-1)
@@ -204,13 +228,26 @@ EXEC(@sql)`
204228
controller.RunCmdInContainer(containerId, []string{"chmod", "-u+rw", temporaryFolder + "/" + file})
205229
controller.RunCmdInContainer(containerId, []string{"chmod", "-g+r", temporaryFolder + "/" + file})
206230

207-
text := `SET NOCOUNT ON;
231+
text := `SET NOCOUNT ON;`
232+
if log_f == "" {
233+
text += `CREATE DATABASE [%s]
234+
ON (FILENAME = '%s/%s')
235+
FOR ATTACH;`
236+
query(fmt.Sprintf(text, dbNameAsIdentifier, temporaryFolder, file))
208237

209-
CREATE DATABASE [%s]
210-
ON (FILENAME = '%s/%s'), (FILENAME = '/var/opt/mssql/data/StackOverflow2010_log.ldf')
238+
} else {
239+
controller.RunCmdInContainer(containerId, []string{"chown", "mssql:root", temporaryFolder + "/" + log_file})
240+
controller.RunCmdInContainer(containerId, []string{"chmod", "-o-r", temporaryFolder + "/" + log_file})
241+
controller.RunCmdInContainer(containerId, []string{"chmod", "-u+rw", temporaryFolder + "/" + log_file})
242+
controller.RunCmdInContainer(containerId, []string{"chmod", "-g+r", temporaryFolder + "/" + log_file})
243+
244+
text += `CREATE DATABASE [%s]
245+
ON (FILENAME = '%s/%s'), (FILENAME = '%s/%s')
211246
FOR ATTACH;`
212247

213-
query(fmt.Sprintf(text, dbNameAsIdentifier, temporaryFolder, file))
248+
query(fmt.Sprintf(text, dbNameAsIdentifier, temporaryFolder, file, temporaryFolder, log_file))
249+
}
250+
214251
} else if filepath.Ext(f) == ".bacpac" {
215252
controller.DownloadFile(
216253
containerId,
@@ -223,8 +260,16 @@ CREATE DATABASE [%s]
223260
controller.RunCmdInContainer(containerId, []string{"unzip", "/tmp/sqlpackage-linux", "-d", "/opt/sqlpackage"})
224261
controller.RunCmdInContainer(containerId, []string{"rm", "/tmp/sqlpackage-linux"})
225262
controller.RunCmdInContainer(containerId, []string{"chmod", "+x", "/opt/sqlpackage/sqlpackage"})
263+
264+
alterDefaultDb := fmt.Sprintf(
265+
"ALTER LOGIN [%s] WITH DEFAULT_DATABASE = [%s]",
266+
userName,
267+
"master")
268+
query(alterDefaultDb)
269+
226270
controller.RunCmdInContainer(containerId, []string{
227271
"/opt/sqlpackage/sqlpackage",
272+
"/Diagnostics:true",
228273
"/Action:import",
229274
"/SourceFile:" + temporaryFolder + "/" + file,
230275
"/TargetServerName:localhost",
@@ -242,6 +287,16 @@ CREATE DATABASE [%s]
242287
query(alterDefaultDb)
243288
}
244289

290+
func extractPaths(input string) []string {
291+
re := regexp.MustCompile(`Path\s*=\s*(\S+)`)
292+
matches := re.FindAllStringSubmatch(input, -1)
293+
var paths []string
294+
for _, match := range matches {
295+
paths = append(paths, match[1])
296+
}
297+
return paths
298+
}
299+
245300
func getDbNameAsIdentifier(dbName string) string {
246301
escapedDbNAme := strings.ReplaceAll(dbName, "'", "''")
247302
return strings.ReplaceAll(escapedDbNAme, "]", "]]")

pkg/mssqlcontainer/ingest-db_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mssqlcontainer
22

33
import (
4+
"fmt"
45
"github.com/stretchr/testify/assert"
56
"testing"
67
)
@@ -60,3 +61,39 @@ func TestGetDbNameIfExists(t *testing.T) {
6061
assert.Equal(t, testcase.expectedNonIdentifierOp, dbnameAsNonIdentifier, "Unexpected database name as non-identifier")
6162
}
6263
}
64+
65+
func TestTzOutput(t *testing.T) {
66+
stdout := `Path = Readme_2010.txt
67+
Size = 1157
68+
Packed Size = 680
69+
Modified = 2018-09-11 11:45:55.2543593
70+
Attributes = A
71+
CRC = B243D895
72+
Encrypted = -
73+
Method = LZMA2:27
74+
Block = 0
75+
76+
Path = StackOverflow2010.mdf
77+
Size = 8980398080
78+
Packed Size = 1130813973
79+
Modified = 2018-09-11 11:30:55.3142494
80+
Attributes = A
81+
CRC = 8D688B2A
82+
Encrypted = -
83+
Method = LZMA2:27
84+
Block = 1
85+
86+
Path = StackOverflow2010_log.ldf
87+
Size = 268312576
88+
Packed Size = 37193161
89+
Modified = 2018-09-11 11:30:55.3152489
90+
Attributes = A
91+
CRC = BCA9F91F
92+
Encrypted = -
93+
Method = LZMA2:27
94+
Block = 2`
95+
96+
paths := extractPaths(stdout)
97+
98+
fmt.Println(paths)
99+
}

0 commit comments

Comments
 (0)