protected void WaitForCompletion(IBackupDatabase backupDatabaseTask) { if (backupDatabaseTask.SkippingBackup) { StatusMessage = "backup creation was skipped"; } else { if (PollStatus(backupDatabaseTask.ConnectionString, backupDatabaseTask.BackupName)) { StatusMessage = string.Format("created backup '{0}'", backupDatabaseTask.BackupName); } else { throw new Exception("creating backup failed"); } } }
private static void BackupOrRestore(bool isBackup, ConfigPair storageConfig, ConfigPair databaseConfig, List <ConfigPair> pipelineConfig, IUpdateNotification updateNotifier) { string deviceSetName = Guid.NewGuid().ToString(); IBackupStorage storage = storageConfig.TransformationType.GetConstructor(new Type[0]).Invoke(new object[0]) as IBackupStorage; IBackupDatabase databaseComp = databaseConfig.TransformationType.GetConstructor(new Type[0]).Invoke(new object[0]) as IBackupDatabase; try { int numDevices = storage.GetNumberOfDevices(storageConfig.Parameters); string instanceName = databaseComp.GetInstanceName(databaseConfig.Parameters); string clusterNetworkName = databaseComp.GetClusterNetworkName(databaseConfig.Parameters); SqlPlatform sqlPlatform = VirtualBackupDeviceFactory.DiscoverSqlPlatform(instanceName, clusterNetworkName); //NotifyWhenReady notifyWhenReady = new NotifyWhenReady(deviceName, isBackup);)) using (IVirtualDeviceSet deviceSet = VirtualBackupDeviceFactory.NewVirtualDeviceSet(sqlPlatform)) { using (SqlThread sql = new SqlThread()) { bool sqlStarted = false; bool sqlFinished = false; ParallelExecutionException exceptions = new ParallelExecutionException(); try { IStreamNotification streamNotification = new InternalStreamNotification(updateNotifier); long estimatedTotalBytes; List <string> deviceNames = sql.PreConnect(clusterNetworkName, instanceName, deviceSetName, numDevices, databaseComp, databaseConfig.Parameters, isBackup, updateNotifier, out estimatedTotalBytes); using (DisposableList <Stream> fileStreams = new DisposableList <Stream>(isBackup ? storage.GetBackupWriter(storageConfig.Parameters) : storage.GetRestoreReader(storageConfig.Parameters, out estimatedTotalBytes))) using (DisposableList <Stream> topOfPilelines = new DisposableList <Stream>(CreatePipeline(pipelineConfig, fileStreams, isBackup, streamNotification, estimatedTotalBytes))) { VirtualDeviceSetConfig config = new VirtualDeviceSetConfig(); config.Features = FeatureSet.PipeLike; config.DeviceCount = (uint)topOfPilelines.Count; deviceSet.CreateEx(instanceName, deviceSetName, config); sql.BeginExecute(); sqlStarted = true; deviceSet.GetConfiguration(TimeSpan.FromMinutes(1)); List <IVirtualDevice> devices = new List <IVirtualDevice>(); foreach (string devName in deviceNames) { devices.Add(deviceSet.OpenDevice(devName)); } using (DisposableList <DeviceThread> threads = new DisposableList <DeviceThread>(devices.Count)) { for (int i = 0; i < devices.Count; i++) { DeviceThread dThread = new DeviceThread(); threads.Add(dThread); dThread.Initialize(isBackup, topOfPilelines[i], devices[i], deviceSet); } foreach (DeviceThread dThread in threads) { dThread.BeginCopy(); } updateNotifier.OnStart(); //Console.WriteLine(string.Format("{0} started", isBackup ? "Backup" : "Restore")); Exception sqlE = sql.EndExecute(); sqlFinished = true; if (sqlE != null) { exceptions.Exceptions.Add(sqlE); } foreach (DeviceThread dThread in threads) { Exception devE = dThread.EndCopy(); if (devE != null) { exceptions.Exceptions.Add(devE); } } } } } catch (Exception e) { exceptions.Exceptions.Add(e); } finally { if (sqlStarted && !sqlFinished) { Exception sqlE = sql.EndExecute(); sqlFinished = true; if (sqlE != null) { exceptions.Exceptions.Add(sqlE); } } } if (exceptions.HasExceptions) { throw exceptions; } } } } catch { storage.CleanupOnAbort(); throw; } }
/// <summary> /// Returns the auto-generated device names /// </summary> public List <string> PreConnect(string clusterNetworkName, string instanceName, string deviceSetName, int numDevices, IBackupDatabase dbComponent, Dictionary <string, List <string> > dbConfig, bool isBackup, IUpdateNotification notifier, out long estimatedTotalBytes) { string serverConnectionName = clusterNetworkName == null ? "." : clusterNetworkName; string dataSource = string.IsNullOrEmpty(instanceName) ? serverConnectionName : string.Format(@"{0}\{1}", serverConnectionName, instanceName); string connectionString = string.Format("Data Source={0};Initial Catalog=master;Integrated Security=SSPI;Asynchronous Processing=true;", dataSource); notifier.OnConnecting(string.Format("Connecting: {0}", connectionString)); mCnn = new SqlConnection(connectionString); mCnn.Open(); List <string> deviceNames = new List <string>(numDevices); deviceNames.Add(deviceSetName); for (int i = 1; i < numDevices; i++) { deviceNames.Add(string.Format("dev{0}", i)); } mCmd = new SqlCommand(); mCmd.Connection = mCnn; mCmd.CommandTimeout = 0; if (isBackup) { dbComponent.ConfigureBackupCommand(dbConfig, deviceNames, mCmd); estimatedTotalBytes = CalculateEstimatedDatabaseSize(mCnn, dbConfig); } else { dbComponent.ConfigureRestoreCommand(dbConfig, deviceNames, mCmd); estimatedTotalBytes = 0; } return(deviceNames); }
/// <summary> /// Returns the auto-generated device names /// </summary> public List <string> PreConnect(string clusterNetworkName, string instanceName, string deviceSetName, int numDevices, IBackupDatabase dbComponent, Dictionary <string, List <string> > dbConfig, int isBackup, IUpdateNotification notifier, out long estimatedTotalBytes) { var serverConnectionName = clusterNetworkName ?? "."; var dataSource = string.IsNullOrEmpty(instanceName) ? serverConnectionName : string.Format(@"{0}\{1}", serverConnectionName, instanceName); var connectionString = dbConfig.ContainsKey("user") ? string.Format("Data Source={0};Initial Catalog=master;Integrated Security=False;User ID={1};Password={2};Asynchronous Processing=true;;Connect Timeout=2147483647", dataSource, dbConfig["user"][0], dbConfig.ContainsKey("password") ? dbConfig["password"][0] : null) : string.Format("Data Source={0};Initial Catalog=master;Integrated Security=True;Asynchronous Processing=true;Connect Timeout=2147483647", dataSource); notifier.OnConnecting(string.Format("Connecting: {0}", connectionString)); _mCnn = new SqlConnection(connectionString); _mCnn.Open(); var deviceNames = new List <string>(numDevices) { deviceSetName }; for (var i = 1; i < numDevices; i++) { deviceNames.Add(Guid.NewGuid().ToString()); } _mCmd = new SqlCommand { Connection = _mCnn, CommandTimeout = 0 }; estimatedTotalBytes = 0; //Console.WriteLine(mCmd); switch (isBackup) { case 1: dbComponent.ConfigureBackupCommand(dbConfig, deviceNames, _mCmd); estimatedTotalBytes = CalculateEstimatedDatabaseSize(_mCnn, dbConfig); break; case 2: dbComponent.ConfigureRestoreCommand(dbConfig, deviceNames, _mCmd); estimatedTotalBytes = 0; break; case 3: dbComponent.ConfigureVerifyCommand(dbConfig, deviceNames, _mCmd); estimatedTotalBytes = 0; break; default: Console.WriteLine("Default case"); break; } return(deviceNames); }