From 66be0fdd579050375421ad54dc25cf35bac0845c Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Tue, 15 Dec 2020 16:52:30 +0200 Subject: Implemented several fallbacks to PPC update failure ! --- .../MachineUpdate/IMachineUpdateManager.cs | 6 ++ .../MachineUpdate/MachineUpdateManager.cs | 116 ++++++++++++++++----- 2 files changed, 94 insertions(+), 28 deletions(-) (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate') diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs index 77646da40..7c835165f 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs @@ -95,5 +95,11 @@ namespace Tango.PPC.Common.MachineUpdate /// /// Task RunPostUpdatePackages(); + + /// + /// Restores the last database backup. + /// + /// + Task RestoreLastDatabaseBackup(); } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs index 85fe6b0ad..c115f4f5b 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs @@ -129,6 +129,11 @@ namespace Tango.PPC.Common.MachineUpdate private void _app_manager_ApplicationReady(object sender, EventArgs e) { _checkForUpdateTimer.Start(); + + if (!_app_manager.IsUpdateFailed) + { + ClearLastDatabaseBackup(); + } } private void _packageRunner_PackageProgress(object sender, PackageProgressEventArgs e) @@ -327,14 +332,14 @@ namespace Tango.PPC.Common.MachineUpdate } } - try - { - Directory.Delete(backupsFolder, true); - } - catch (Exception ex) - { - LogManager.Log(ex, $"Error deleting backups folder '{backupsFolder}'."); - } + //try + //{ + // Directory.Delete(backupsFolder, true); + //} + //catch (Exception ex) + //{ + // LogManager.Log(ex, $"Error deleting backups folder '{backupsFolder}'."); + //} if (!result.RequiresBinariesUpdate) { @@ -604,6 +609,26 @@ namespace Tango.PPC.Common.MachineUpdate return logsString; } + private void ClearLastDatabaseBackup() + { + Task.Factory.StartNew(() => + { + try + { + var lastBackupFile = SettingsManager.Default.GetOrCreate().LastDatabaseBackupFile; + + if (File.Exists(lastBackupFile)) + { + File.Delete(lastBackupFile); + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Error removing last database backup file."); + } + }); + } + #endregion #region Public Methods @@ -733,6 +758,27 @@ namespace Tango.PPC.Common.MachineUpdate //Copy new updater utility to app path. File.Copy(Path.Combine(_newPackageTempFolder, "Tango.PPC.Updater.exe"), Path.Combine(PathHelper.GetStartupPath(), "Tango.PPC.Updater.exe"), true); + LogManager.Log("Initializing database manager..."); + DbManager db = DbManager.FromDataSource(localDataSource); + + //Create Database Backup + UpdateProgress("Updating Database", "Creating database backup..."); + try + { + Directory.CreateDirectory(backupsFolder); + dbBackupFile = $"{backupsFolder}\\{Path.GetRandomFileName()}.bak"; + _settings.LastDatabaseBackupFile = dbBackupFile; + _settings.Save(); + LogManager.Log($"Creating database backup to '{dbBackupFile}'..."); + await Task.Factory.StartNew(() => db.Backup(localDataSource.Catalog, dbBackupFile)); + performDatabaseRollback = true; + LogManager.Log("Database backup created successfully."); + } + catch (Exception ex) + { + throw LogManager.Log(ex, "Update manager error while trying to create a database backup."); + } + //Run pre-update packages. try { @@ -763,8 +809,6 @@ namespace Tango.PPC.Common.MachineUpdate LogManager.Log($"Synchronizing database '{update_response.DataSource.ToString()}' => '{localDataSource.ToString()}'..."); UpdateProgress("Updating Database", "Connecting to local database..."); - LogManager.Log("Initializing database manager..."); - DbManager db = DbManager.FromDataSource(localDataSource); LogManager.Log("Checking Tango database exists on the local machine..."); if (!db.Exists(localDataSource.Catalog)) @@ -772,24 +816,6 @@ namespace Tango.PPC.Common.MachineUpdate throw new InvalidProgramException("Database tango does not exists."); } - UpdateProgress("Updating Database", "Creating database backup..."); - - //Create Database Backup - try - { - Directory.CreateDirectory(backupsFolder); - dbBackupFile = $"{backupsFolder}\\{Path.GetRandomFileName()}.bak"; - LogManager.Log($"Creating database backup to '{dbBackupFile}'..."); - await Task.Factory.StartNew(() => db.Backup(localDataSource.Catalog, dbBackupFile)); - performDatabaseRollback = true; - LogManager.Log("Database backup created successfully."); - } - catch (Exception ex) - { - throw LogManager.Log(ex, "Update manager error while trying to create a database backup."); - } - - LogManager.Log("Disposing database manager."); db.Dispose(); @@ -1621,6 +1647,40 @@ namespace Tango.PPC.Common.MachineUpdate } } + public Task RestoreLastDatabaseBackup() + { + return Task.Factory.StartNew(() => + { + LogManager.Log("Rolling back database changes..."); + UpdateProgress("Rollback", "Rolling back database changes..."); + + var localDataSource = SettingsManager.Default.GetOrCreate().DataSource; + var lastBackupFile = SettingsManager.Default.GetOrCreate().LastDatabaseBackupFile; + + using (DbManager db = DbManager.FromDataSource(localDataSource)) + { + try + { + db.Restore(localDataSource.Catalog, lastBackupFile); + LogManager.Log("Database restored successfully."); + } + catch (Exception ex) + { + LogManager.Log(ex, "Could not rollback the database after a failed updater."); + throw ex; + } + finally + { + try + { + File.Delete(lastBackupFile); + } + catch { } + } + } + }); + } + #endregion #region Protected Methods -- cgit v1.3.1