@@ -178,11 +178,11 @@ public Database Database(string dbName)
178178 /// wait
179179 /// </param>
180180 /// <param name="fileRelocation">Option for renaming files during the restore.</param>
181- public void Restore ( IEnumerable < BackupMetadata > backupOrder , string databaseName ,
181+ public void Restore ( IEnumerable < StripedBackupSet > stripedBackupSetChain , string databaseName ,
182182 Func < int , TimeSpan > retryDurationProvider ,
183183 Func < string , string > fileRelocation = null )
184184 {
185- var policy = Policy
185+ var retryPolicy = Policy
186186 . Handle < ExecutionFailureException > ( e => e . InnerException != null
187187 && e . InnerException is SqlException
188188 && e . InnerException . Message
@@ -191,39 +191,65 @@ public void Restore(IEnumerable<BackupMetadata> backupOrder, string databaseName
191191
192192
193193 var restore = new Restore { Database = databaseName , NoRecovery = true } ;
194+
195+ var defaultFileLocations = DefaultFileLocations ( ) ;
194196
195- foreach ( var backup in backupOrder ) {
196- var device = BackupFileTools . IsValidFileUrl ( backup . PhysicalDeviceName ) ? DeviceType . Url : DeviceType . File ;
197- var backupDeviceItem = new BackupDeviceItem ( backup . PhysicalDeviceName , device ) ;
198- if ( _credentialName != null && device == DeviceType . Url )
199- backupDeviceItem . CredentialName = _credentialName ;
197+ foreach ( var stripedBackupSet in stripedBackupSetChain ) {
200198
201- restore . Devices . Add ( backupDeviceItem ) ;
199+ AddBackupDeviceItemsToRestore ( restore , stripedBackupSet ) ;
202200
203- var defaultFileLocations = DefaultFileLocations ( ) ;
204- if ( defaultFileLocations != null ) {
205- restore . RelocateFiles . Clear ( ) ;
206- var fileList = policy . Execute ( ( ) => restore . ReadFileList ( _server ) . AsEnumerable ( ) ) ;
207- foreach ( var file in fileList ) {
208- var physicalName = ( string ) file [ "PhysicalName" ] ;
209- var fileName = GetFileName ( physicalName ) ;
201+ if ( defaultFileLocations != null )
202+ {
203+ AddRelocateFilesToRestore ( restore , defaultFileLocations , retryPolicy , fileRelocation ) ;
204+ }
210205
211- if ( fileRelocation != null )
212- fileName = fileRelocation ( fileName ) ;
206+ _server . ConnectionContext . StatementTimeout = 86400 ; // 60 * 60 * 24 = 24 hours
207+ retryPolicy . Execute ( ( ) => restore . SqlRestore ( _server ) ) ;
213208
214- var path = ( string ) file [ "Type" ] == "L" ? defaultFileLocations ? . Log : defaultFileLocations ? . Data ;
215- path ??= Path . GetFullPath ( physicalName ) ;
209+ restore . Devices . Clear ( ) ;
210+ restore . RelocateFiles . Clear ( ) ;
211+ }
212+ }
216213
217- var newFilePath = Path . Combine ( path , fileName ) ;
214+ /// <summary>
215+ /// This is like adding the `FROM URL='<backup file url>'` to the RESTORE T-SQL command
216+ /// </summary>
217+ private void AddBackupDeviceItemsToRestore ( Restore restore , StripedBackupSet stripedBackupSet )
218+ {
219+ foreach ( var stripedBackup in stripedBackupSet . StripedBackups )
220+ {
221+ var physicalDeviceName = stripedBackup . PhysicalDeviceName ;
222+ var device = BackupFileTools . IsValidFileUrl ( physicalDeviceName ) ? DeviceType . Url : DeviceType . File ;
218223
219- restore . RelocateFiles . Add ( new RelocateFile ( ( string ) file [ "LogicalName" ] , newFilePath ) ) ;
220- }
221- }
224+ var backupDeviceItem = new BackupDeviceItem ( physicalDeviceName , device ) ;
225+ if ( _credentialName != null && device == DeviceType . Url )
226+ backupDeviceItem . CredentialName = _credentialName ;
222227
223- _server . ConnectionContext . StatementTimeout = 86400 ; // 60 * 60 * 24 = 24 hours
228+ restore . Devices . Add ( backupDeviceItem ) ;
229+ }
230+ }
231+
232+ /// <summary>
233+ /// This is like adding the `WITH MOVE=<label> to <path>` to the RESTORE T-SQL command
234+ /// </summary>
235+ private void AddRelocateFilesToRestore ( Restore restore , DefaultFileLocations defaultFileLocations ,
236+ Policy retryPolicy ,
237+ Func < string , string > fileRelocation = null )
238+ {
239+ var fileList = retryPolicy . Execute ( ( ) => restore . ReadFileList ( _server ) . AsEnumerable ( ) ) ;
240+ foreach ( var file in fileList ) {
241+ var physicalName = ( string ) file [ "PhysicalName" ] ;
242+ var fileName = GetFileName ( physicalName ) ;
243+
244+ if ( fileRelocation != null )
245+ fileName = fileRelocation ( fileName ) ;
246+
247+ var path = ( string ) file [ "Type" ] == "L" ? defaultFileLocations ? . Log : defaultFileLocations ? . Data ;
248+ path ??= Path . GetFullPath ( physicalName ) ;
249+
250+ var newFilePath = Path . Combine ( path , fileName ) ;
224251
225- policy . Execute ( ( ) => restore . SqlRestore ( _server ) ) ;
226- restore . Devices . Remove ( backupDeviceItem ) ;
252+ restore . RelocateFiles . Add ( new RelocateFile ( ( string ) file [ "LogicalName" ] , newFilePath ) ) ;
227253 }
228254 }
229255
0 commit comments