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 (
188212INSERT INTO @fileListTable
189213EXEC('RESTORE FILELISTONLY FROM DISK = ''%s/%s''')
190214SET @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)) + ''','
192216FROM @fileListTable
193217WHERE IsPresent = 1
194218SET @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+
245300func getDbNameAsIdentifier (dbName string ) string {
246301 escapedDbNAme := strings .ReplaceAll (dbName , "'" , "''" )
247302 return strings .ReplaceAll (escapedDbNAme , "]" , "]]" )
0 commit comments