/// <summary> /// Performs the regular backup /// </summary> public void PerformBackup(dynamic backupOptions = null) { if (DateTime.Now.Subtract(_LastBackupCheck).TotalMinutes > 30) { _LastBackupCheck = DateTime.Now; } else { // No Need to do the backup now return; } #if DEBUG Debugger.Break(); #endif Action cleanUp = null; var compression = 1; var mode = "hourly"; var databaseFile = this.DatabaseFileName; string backupPath = Path.Combine(this.DatabaseDirectory, "Backups"); if (backupOptions != null) { if (backupOptions.compression != null) { compression = (int)backupOptions.compression; } if (backupOptions.uncpath != null) { var existed = DriveInfo.GetDrives().ToDictionary(d => d.Name); var chosen = '\0'; for (char i = 'A'; i < 'Z'; i++) { if (existed.ContainsKey(i + @":\") == false) { chosen = i; break; } } if (chosen != '\0') { string command = string.Empty; if (backupOptions.username != null && backupOptions.password != null) { command = string.Format("use {0}: {1} /u:{2} {3}", chosen, backupOptions.uncpath, backupOptions.username, backupOptions.password); } else { command = string.Format("use {0}: {1}", chosen, backupOptions.uncpath); } var process = Process.Start("net.exe", command); process.WaitForExit(); if (process.ExitCode == 0) { cleanUp = () => { string cmd = string.Format("use {0}: /delete", chosen); var p2 = Process.Start("net.exe", cmd); p2.WaitForExit(); }; backupPath = chosen + ":\\"; } } } if (backupOptions.sitename != null) { backupPath = Path.Combine(backupPath, (string)backupOptions.sitename); } } try { if (mode == "hourly") { backupPath = Path.Combine(backupPath, "DatabaseBackup-Hourly"); Directory.CreateDirectory(backupPath); // create hourly backup var backupFile = Path.Combine(backupPath, string.Format("hourlybackup-{0:HH}.sqlite.bz2", DateTime.Now)); if (File.Exists(backupFile) == false) { NancyBlackDatabase.BZip(databaseFile, backupFile); } else { // check modified date if (File.GetLastWriteTime(backupFile).Date < DateTime.Now.Date) { // it was the yesterday's file, replace it NancyBlackDatabase.BZip(databaseFile, backupFile); } } } if (mode == "daily") { backupPath = Path.Combine(backupPath, "DatabaseBackup-Hourly"); Directory.CreateDirectory(backupPath); var dailybackupFile = Path.Combine(backupPath, string.Format("dailybackup-{0:dd-MM-yyyy}.sqlite.bz2", DateTime.Now)); if (File.Exists(dailybackupFile) == false) { NancyBlackDatabase.BZip(databaseFile, dailybackupFile, 9); // max compression for daily backup } var backupFiles = Directory.GetFiles(backupPath, "dailybackup-*.sqlite.bz2"); var now = DateTime.Now; var maxDay = 30; if (backupOptions.dailyretention != null) { maxDay = (int)backupOptions.dailyretention; } foreach (var file in backupFiles) { if (now.Subtract(File.GetCreationTime(file)).TotalDays > maxDay) { try { File.Delete(file); // delete backup older than 30 days } catch (Exception) { } } } } } catch (Exception) { // retry backup again _LastBackupCheck = DateTime.MinValue; } finally { if (cleanUp != null) { cleanUp(); } } }
/// <summary> /// Performs the regular backup /// </summary> public void PerformBackup() { if (DateTime.Now.Subtract(_LastBackupCheck).TotalMinutes > 30) { _LastBackupCheck = DateTime.Now; } else { // No Need to do the backup now return; } #if !DEBUG try { var path = this.DatabaseDirectory; var fileName = this.DatabaseFileName; var backupPath = Path.Combine(path, "Backups"); Directory.CreateDirectory(path); Directory.CreateDirectory(backupPath); // create hourly backup var backupFile = Path.Combine(backupPath, string.Format("hourlybackup-{0:HH}.sqlite.bz2", DateTime.Now)); if (File.Exists(backupFile) == false) { NancyBlackDatabase.BZip(fileName, backupFile); } else { // check modified date if (File.GetLastWriteTime(backupFile).Date < DateTime.Now.Date) { // it was the yesterday's file, replace it NancyBlackDatabase.BZip(fileName, backupFile); } } // create daily backup var dailybackupFile = Path.Combine(backupPath, string.Format("dailybackup-{0:dd-MM-yyyy}.sqlite.bz2", DateTime.Now)); if (File.Exists(dailybackupFile) == false) { NancyBlackDatabase.BZip(fileName, dailybackupFile, 9); // max compression for daily backup } var backupFiles = Directory.GetFiles(backupPath, "dailybackup-*.sqlite.bz2"); var now = DateTime.Now; foreach (var file in backupFiles) { if (now.Subtract(File.GetCreationTime(file)).TotalDays > 30) { try { File.Delete(file); // delete backup older than 30 days } catch (Exception) { } } } } catch (Exception) { // retry backup again _LastBackupCheck = DateTime.MinValue; } #endif }