public void RefreshMyTreeView(MyBackup backup) { //foreach (var backup in MyBackup.MyBackups.OrderBy(x => x.MyIndex)) { TreeNode node; if (MyTreeView.Nodes.ContainsKey(backup.MyIndex.ToString())) { node = MyTreeView.Nodes[backup.MyIndex.ToString()]; } else { node = new TreeNode() { //BackColor = Color.LightSkyBlue, Tag = backup, Name = backup.MyIndex.ToString(), ImageIndex = 0, } }; var rem = ToReadableString(GetRemainingTime(backup, out long At)); var RebeatAt = new DateTime(At); node.Text = backup.BackupName + Environment.NewLine + RebeatAt.ToString("dd MMM yy hh:mm tt") + Environment.NewLine + rem; if (!MyTreeView.Nodes.Contains(node)) { MyTreeView.Nodes.Add(node); } } }
private async Task RestoreBackup(MyBackup backup) { var rnd = new Random(); var restoreDbName = $"Restored_{new string(Enumerable.Repeat(_chars, rnd.Next(5, 10)).Select(x => x[rnd.Next(x.Length)]).ToArray())}"; var restoreConfig = new RestoreBackupConfiguration { DatabaseName = restoreDbName, BackupLocation = backup.BackupPath }; var restoreBackupTask = new RestoreBackupOperation(restoreConfig); using (var session = DocumentStore.OpenAsyncSession()) { var succeeded = true; try { ReportInfo($"Starting to restore DB: {restoreDbName}"); var re = DocumentStore.GetRequestExecutor(DocumentStore.Database); var restoreBackupTaskCommand = restoreBackupTask.GetCommand(DocumentStore.Conventions, session.Advanced.Context); await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag == backup.BackupStatus.NodeTag), null, session.Advanced.Context, restoreBackupTaskCommand, shouldRetry : false); var getOperationStateTask = new GetOperationStateOperation(restoreBackupTaskCommand.Result.OperationId); var getOperationStateTaskCommand = getOperationStateTask.GetCommand(DocumentStore.Conventions, session.Advanced.Context); await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag == backup.BackupStatus.NodeTag), null, session.Advanced.Context, getOperationStateTaskCommand, shouldRetry : false); while (getOperationStateTaskCommand.Result.Status == OperationStatus.InProgress) { await Task.Delay(2000); await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag == backup.BackupStatus.NodeTag), null, session.Advanced.Context, getOperationStateTaskCommand, shouldRetry : false); } } catch (Exception e) { ReportFailure($"Restoring DB: {restoreDbName} Failed", e); succeeded = false; } for (var i = 0; i < MyBackupsList.Count; i++) { if (MyBackupsList[i].BackupTaskId == backup.BackupTaskId) { MyBackupsList[i].RestoreResult = succeeded ? RestoreResult.Succeeded : RestoreResult.Failed; break; } } } }
private void DeleteBackup_Click(object sender, EventArgs e) { var backup = (MyBackup)MyParentPanel.Tag; if (backup.MyIndex > 0) { if (MessageBox.Show("Are you sure? You want to delete the backup permanently?", "Delete Backup", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) { return; } MyTreeView.Nodes.RemoveByKey(backup.MyIndex.ToString()); //MyBackup.MyBackups.Remove(backup); MyBackup.DeleteBackup(backup); } CloseBackup.PerformClick(); }
public static TimeSpan GetRemainingTime(MyBackup backup, out long RebeatAt) { if (backup == null) { RebeatAt = 0; return(new TimeSpan()); } var LastBackup = new DateTime(backup.LastBackup); if (backup.Repeat) { int Days = 0; var RepeatTime = backup.RepeatTime; //if (!backup.RepeatDay(DateTime.Now.DayOfWeek) || (backup.RepeatDay(DateTime.Now.DayOfWeek) && new TimeSpan(LastBackup.Hour, LastBackup.Minute, 0) > RepeatTime)) if (!backup.RepeatDay(LastBackup.DayOfWeek) || (backup.RepeatDay(LastBackup.DayOfWeek) && LastBackup >= DateTime.Today.Add(RepeatTime))) { for (int i = 1; i < 7; i++) { var backdate = LastBackup.AddDays(i); if (backup.RepeatDay(backdate.DayOfWeek)) { Days = i; break; } } } var RepeatAfter = DateTime.Now.Date.Add(RepeatTime).AddDays(Days); //TimeSpan(Days, RepeatTime.Hours, );//NextBackup RebeatAt = RepeatAfter.Ticks; //RepeatAfter.Ticks + LastBackup.Ticks; } else //backup.Specific { RebeatAt = backup.SpecificAfter.Ticks + LastBackup.Ticks; } return(TimeSpan.FromTicks(RebeatAt - DateTime.Now.Ticks)); }
private async Task RestoreBackup(MyBackup backup) { var rnd = new Random(); var restoreDbName = $"Restored_{new string(Enumerable.Repeat(_chars, rnd.Next(5, 10)).Select(x => x[rnd.Next(x.Length)]).ToArray())}"; var restoreConfig = new RestoreBackupConfiguration { DatabaseName = restoreDbName, BackupLocation = backup.BackupPath }; var restoreBackupTask = new RestoreBackupOperation(restoreConfig); using (var session = DocumentStore.OpenAsyncSession()) { var reasonableTimeForBackup = Stopwatch.StartNew(); var succeeded = true; try { ReportInfo($"Starting to restore DB: {restoreDbName}"); var re = DocumentStore.GetRequestExecutor(DocumentStore.Database); var restoreBackupTaskCommand = restoreBackupTask.GetCommand(DocumentStore.Conventions, session.Advanced.Context); await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag.Equals(backup.BackupStatus.NodeTag)), null, session.Advanced.Context, restoreBackupTaskCommand, shouldRetry : false) .ConfigureAwait(false); var getOperationStateTask = new GetOperationStateOperation(restoreBackupTaskCommand.Result.OperationId); var getOperationStateTaskCommand = getOperationStateTask.GetCommand(DocumentStore.Conventions, session.Advanced.Context); await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag.Equals(backup.BackupStatus.NodeTag)), null, session.Advanced.Context, getOperationStateTaskCommand, shouldRetry : false) .ConfigureAwait(false); while (getOperationStateTaskCommand.Result == null || getOperationStateTaskCommand.Result.Status == OperationStatus.InProgress) { await Task.Delay(2000).ConfigureAwait(false); await re.ExecuteAsync(re.TopologyNodes.First(q => q.ClusterTag.Equals(backup.BackupStatus.NodeTag)), null, session.Advanced.Context, getOperationStateTaskCommand, shouldRetry : false) .ConfigureAwait(false); if (reasonableTimeForBackup.Elapsed > TimeSpan.FromMinutes(5)) { ReportFailure($"Restoring DB: {restoreDbName} Failed, taskID {backup.BackupTaskId} - Waited {reasonableTimeForBackup.Elapsed} and task didn't finished", null); succeeded = true; // marking as success in order to delete // TODO : RavenDB-13684 break; } } } catch (RavenException re) { if (re.InnerException is ArgumentException ae) { ReportInfo($"Probably somebody deleted the backup files, taskID {backup.BackupTaskId}, exception: {ae}"); } else { ReportFailure($"Restoring DB: {restoreDbName} Failed, taskID {backup.BackupTaskId}", re); } } catch (Exception e) { ReportFailure($"Restoring DB: {restoreDbName} Failed, taskID {backup.BackupTaskId}", e); succeeded = false; } if (succeeded) { MyRestoreDbsList.Add(restoreDbName); } for (var i = 0; i < MyBackupsList.Count; i++) { if (MyBackupsList[i].BackupTaskId == backup.BackupTaskId) { MyBackupsList[i].RestoreResult = succeeded ? RestoreResult.Succeeded : RestoreResult.Failed; break; } } } }
static void Worker_DoWork(object sender, DoWorkEventArgs e) { MyBackup.LoadBackups(mainMenu); }
public BackupStatus(MyBackup myBackup) { this.myBackup = myBackup; InitializeComponent(); }
private void MyBackupTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (this.TimerInUse) { return; } this.TimerInUse = true; for (int i = 0; i < MyBackup.MyBackups.Count; i++) { var backup = MyBackup.MyBackups[i]; if (backup.IsEnabled) { var Remaining = GetRemainingTime(backup, out long At); if (Remaining.TotalSeconds <= 0) { string FileName = backup.BackupName + "_" + backup.Database + "_" + DateTime.Now.ToString() + ".bak"; Vars.GiveEveryoneAccessControl(backup.BackupPath); FileName = Vars.RemoveInvalidFileNameChars(FileName); var path = Path.Combine(backup.BackupPath, FileName); var ConnectionString = SQLFunctions.GetConnectionString(backup.Host, backup.Database, backup.Authentication, backup.Username, backup.Password); var backupResult = SQLFunctions.BackupNow(path, ConnectionString); var backupState = new BackupState() { backup = backup, BackupDateTime = DateTime.Now.Ticks, DefaultBackupDateTime = At, FullPath = path, Warning = backupResult != null, }; if (backupResult != null) { backupState.WarningMessage = backupResult.Message; backupState.FullWarning = backupResult.ToString(); } MyBackup.SaveBackupState(backupState); backup.LastBackup = DateTime.Now.Ticks; MyBackup.SaveBackup(backup); } } if (this.MyTreeView.InvokeRequired) { this.MyTreeView.BeginInvoke((MethodInvoker) delegate() { this.RefreshMyTreeView(backup); }); } else { this.RefreshMyTreeView(backup); } } this.TimerInUse = false; }
public void ShowBackup(MyBackup backup, bool Clone = false) { if (MyParentPanel.Visible) { //MessageBox.Show(""); } MyParentPanel.Visible = false; if (backup == null) { MyTreeView.SelectedNode = null; CloneBackup.Visible = BackupStatusBtn.Visible = false; backup = new MyBackup(); } else { CloneBackup.Visible = BackupStatusBtn.Visible = true; } if (!Clone) { //Backup Options IsEnabledBox.Checked = backup.IsEnabled; BackupNameTxt.Text = backup.BackupName; //SQL Connection if (backup.Host.Length > 0 && !HostCoBox.Items.Contains(backup.Host)) { HostCoBox.Items.Add(backup.Host); } if (backup.Host.Length > 0) { HostCoBox.SelectedItem = backup.Host; } else { HostCoBox.SelectedIndex = -1; } if (backup.Database.Length > 0 && !DBCoBox.Items.Contains(backup.Database)) { DBCoBox.Items.Add(backup.Database); } if (backup.Database.Length > 0) { DBCoBox.SelectedItem = backup.Database; } else { DBCoBox.SelectedIndex = -1; } if (backup.Authentication) { AuthCoBox.SelectedIndex = 1; } else { AuthCoBox.SelectedIndex = 0; } UsernameTxt.Text = backup.Username; PassTxt.Text = backup.Password; SaveCkBox.Checked = backup.SavePassword; //Backup Path BackupPathTxt.Text = backup.BackupPath; //Backup Repeat Datetime RepeatRadio.Checked = backup.Repeat; var time = new DateTime(backup.Time); TimePicker.Value = new DateTime(1753, 1, 1, time.Hour, time.Minute, 0); SatBox.Checked = backup.Sat; SunBox.Checked = backup.Sun; MonBox.Checked = backup.Mon; TueBox.Checked = backup.Tue; WedBox.Checked = backup.Wed; ThuBox.Checked = backup.Thu; FriBox.Checked = backup.Fri; //Backup Specific Datetime SpecificRadio.Checked = backup.Specific; SpecificNum.Value = backup.Every; MinutesRadio.Checked = backup.SpecificType == MyBackup.SpecificTypes.Minutes; HoursRadio.Checked = backup.SpecificType == MyBackup.SpecificTypes.Hours; DaysRadio.Checked = backup.SpecificType == MyBackup.SpecificTypes.Days; WeeksRadio.Checked = backup.SpecificType == MyBackup.SpecificTypes.Weeks; MonthsRadio.Checked = backup.SpecificType == MyBackup.SpecificTypes.Months; //YearsRadio.Checked = backup.SpecificType == MyBackup.SpecificTypes.Years; } MyParentPanel.Tag = backup; MyParentPanel.Visible = true; }
private void SaveBackup_Click(object sender, EventArgs e) { var BackupName = BackupNameTxt.Text.Trim(); #region Save Validation int index = ((MyBackup)MyParentPanel.Tag).MyIndex; if (BackupName.Length == 0) { MessageBox.Show("Please write a valid Backup Name!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); BackupNameTxt.Focus(); return; } else if (MyBackup.MyBackups.Exists(x => x.BackupName.ToLower() == BackupName.ToLower() && x.MyIndex != index)) { MessageBox.Show("Backup Name is already exists!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); BackupNameTxt.Focus(); return; } else if (!SQLFunctions.TestConnection(false, HostCoBox.Text, DBCoBox.Text, AuthCoBox.SelectedIndex == 1, AuthCoBox.SelectedIndex == 0 ? UsernameTxt.Text : string.Empty, AuthCoBox.SelectedIndex == 0 ? PassTxt.Text : string.Empty, out _, out string ExcMessage)) { MessageBox.Show(ExcMessage, "SQL ConnectionString Error", MessageBoxButtons.OK, MessageBoxIcon.Error); HostCoBox.Focus(); return; } else if (BackupPathTxt.Text.Length == 0 || !Directory.Exists(BackupPathTxt.Text)) { MessageBox.Show("Please select a valid Backup Path!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); BackupPathTxt.Focus(); return; } else if (!RepeatRadio.Checked && !SpecificRadio.Checked) { MessageBox.Show("Please select a valid Backup Schedule!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); RepeatRadio.Focus(); return; } else if (RepeatRadio.Checked) { if (!SatBox.Checked && !SunBox.Checked && !MonBox.Checked && !TueBox.Checked && !WedBox.Checked && !ThuBox.Checked && !FriBox.Checked) { MessageBox.Show("Please select one day schedule at least!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); SatBox.Focus(); return; } } else if (SpecificRadio.Checked) { if (!MinutesRadio.Checked && !HoursRadio.Checked && !DaysRadio.Checked && !WeeksRadio.Checked && !MonthsRadio.Checked)//YearsRadio { MessageBox.Show("Please select a schedule type!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); MinutesRadio.Focus(); return; } } #endregion var backup = (MyBackup)MyParentPanel.Tag; //Backup Options backup.IsEnabled = IsEnabledBox.Checked; backup.BackupName = BackupName; //SQL Connection string host; if (HostCoBox.SelectedItem != null) { host = HostCoBox.SelectedItem.ToString(); } else { host = HostCoBox.SelectedText; } backup.Host = host; string db; if (DBCoBox.SelectedItem != null) { db = DBCoBox.SelectedItem.ToString(); } else { db = DBCoBox.SelectedText; } backup.Database = db; backup.Authentication = AuthCoBox.SelectedIndex == 1; backup.Username = UsernameTxt.Text; backup.Password = PassTxt.Text; backup.SavePassword = SaveCkBox.Checked; //Backup Path backup.BackupPath = BackupPathTxt.Text; //Backup Repeat Datetime backup.Repeat = RepeatRadio.Checked; backup.Time = new TimeSpan(TimePicker.Value.Hour, TimePicker.Value.Minute, 0).Ticks;//new TimeSpan(TimePicker.Value.Hour == 0 ? 1 : 0, TimePicker.Value.Hour, TimePicker.Value.Minute, 0).Ticks; backup.Sat = SatBox.Checked; backup.Sun = SunBox.Checked; backup.Mon = MonBox.Checked; backup.Tue = TueBox.Checked; backup.Wed = WedBox.Checked; backup.Thu = ThuBox.Checked; backup.Fri = FriBox.Checked; //Backup Specific Datetime backup.Specific = SpecificRadio.Checked; backup.Every = SpecificNum.Value; if (MinutesRadio.Checked) { backup.SpecificType = SpecificTypes.Minutes; } else if (HoursRadio.Checked) { backup.SpecificType = SpecificTypes.Hours; } else if (DaysRadio.Checked) { backup.SpecificType = SpecificTypes.Days; } else if (WeeksRadio.Checked) { backup.SpecificType = SpecificTypes.Weeks; } else if (MonthsRadio.Checked) { backup.SpecificType = SpecificTypes.Months; } //Years if (index == 0 || backup.LastBackup < 1) { backup.LastBackup = DateTime.Now.Ticks; } MyBackup.SaveBackup(backup); RefreshMyTreeView(backup); MessageBox.Show("Backup settings have been saved successfully.", "Backup settings", MessageBoxButtons.OK, MessageBoxIcon.Information); }