/// <summary> /// Database Backup /// </summary> /// <param name="backupPath">Path to where backups are sent</param> /// <param name="upload"></param> /// <param name="useSiteID"></param> /// <param name="siteID"></param> /// <param name="name"></param> /// <param name="threadName"></param> /// <param name="connectionString"></param> /// <param name="ftpHost"></param> /// <param name="ftpUsername"></param> /// <param name="ftpPassword"></param> /// <param name="ftpPort"></param> public static void BackupDatabase(string backupPath, bool upload, bool useSiteID, int siteID, string name, string threadName, string connectionString, string ftpHost, string ftpUsername, string ftpPassword, int ftpPort) { DatabaseBackupOptions options = new DatabaseBackupOptions(backupPath, useSiteID, siteID, name, upload, connectionString, ftpHost, ftpUsername, ftpPassword, ftpPort); DoOnStageChanged(DatabaseBackupStage.BackupStarted); if (!Directory.Exists(backupPath)) { Directory.CreateDirectory(backupPath); } // check if we are already backing up the database or not using (TimedLock.Lock(lockObject)) { if (_backups.ContainsKey(name)) { throw new Exception("Backup is already in progress!"); } _backups.Add(name, options); } DatabaseBackupThread backupThread = new DatabaseBackupThread(options); backupThread.HangTimeout = 30; Shared.Classes.ThreadManager.ThreadStart(backupThread, threadName, ThreadPriority.Normal); }
/// <summary> /// Constructor /// </summary> /// <param name="options"></param> public DatabaseBackupThread(DatabaseBackupOptions options) : base(options, new TimeSpan()) { }
/// <summary> /// Performs a backup /// </summary> /// <param name="parameters"></param> /// <returns></returns> protected override bool Run(object parameters) { DatabaseBackupOptions options = (DatabaseBackupOptions)parameters; try { string backupFile = String.Format(@"{0}Backup-{4}-{1}{2}{3}.fbk", Shared.Utilities.AddTrailingBackSlash(options.Path), DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, options.UseSiteID ? options.SiteID.ToString() : options.Name); //backup database DoOnStageChanged(DatabaseBackupStage.BackingUpDatabase); try { FirebirdSql.Data.Services.FbBackup backupSvc = new FirebirdSql.Data.Services.FbBackup(); backupSvc.ConnectionString = options.ConnectionString; backupSvc.BackupFiles.Add(new FirebirdSql.Data.Services.FbBackupFile(backupFile, 2048)); backupSvc.Verbose = true; backupSvc.Options = FirebirdSql.Data.Services.FbBackupFlags.IgnoreLimbo | FirebirdSql.Data.Services.FbBackupFlags.NoGarbageCollect; backupSvc.Execute(); } catch (Exception err) { Shared.EventLog.Add(err); if (!System.IO.File.Exists(backupFile)) { return(false); } } DoOnStageChanged(DatabaseBackupStage.DatabaseBackupComplete); // compress it DoOnStageChanged(DatabaseBackupStage.CompressingBackup); Shared.Classes.ZipFiles.CompressFile(backupFile.Replace(".fbk", ".zip"), backupFile, true); DoOnStageChanged(DatabaseBackupStage.BackupCompressed); if (!System.IO.File.Exists(backupFile.Replace(".fbk", ".zip"))) { Shared.EventLog.Add("Zip File Not Found"); return(false); } if (options.Upload) { //upload the file DoOnStageChanged(DatabaseBackupStage.SendingFileToServer); ftp uploader = new ftp(options.FTPHost, options.FTPUsername, options.FTPPassword, 2048, true, true, true, options.FTPPort); uploader.Upload(Path.GetFileName(backupFile.Replace(".fbk", ".zip")), backupFile.Replace(".fbk", ".zip")); DoOnStageChanged(DatabaseBackupStage.FileSentToServer); } } catch (Exception err) { Shared.EventLog.Add(err); } finally { using (TimedLock.Lock(lockObject)) { _backups.Remove(options.Name); } DoOnStageChanged(DatabaseBackupStage.BackupComplete); } return(false); }