public static async Task <ReturnedSaveFuncInfoWithValue <string> > BackupDbAsync(string connectionString, ENSource source, EnBackUpType type, string path = "")
        {
            var    line         = 0;
            var    res          = new ReturnedSaveFuncInfoWithValue <string>();
            bool   IsAutomatic  = string.IsNullOrEmpty(path);
            string DatabaseName = "";
            var    guid         = Guid.NewGuid();

            try
            {
                OnCreateBackup?.Invoke(null, new CreateBackupArgs()
                {
                    Message = "", State = CreateBackupState.Start
                });

                if (IsAutomatic)
                {
                    path = CreateFileName(connectionString);
                }
                if (!string.IsNullOrEmpty(path) && Directory.Exists(path))
                {
                    //در نرم افزار حسابداری آدرس پوشه پشتیبان گیری اتوماتیک داده شده است
                    //باید فایل پشتیبان در این پوشه ایجاد گردد
                    path        = CreateFileName(connectionString, path);
                    IsAutomatic = true;
                }

                await BackUpLogAsync(guid, type, EnBackUpStatus.Pending, path,
                                     "آغاز فرآیند تهیه فایل پشتیبان");

                //تهیه اولین نسخه بکاپ توسط سرویس اس کیو ال
                var CreateSqlBackuResult = await CreateSqlServerBackupFileAsync(path, connectionString, guid, type);

                DatabaseName = CreateSqlBackuResult.value;
                res.AddReturnedValue(CreateSqlBackuResult);

                var PathForZipDirectory = await Zip.Move2Temp(path, guid, type);

                res.AddReturnedValue(PathForZipDirectory);

                try
                {
                    //please dont remove this try
                    //اگر به خطا خورد باید تابع ادامه پیدا کند و پشتیبان با پسوند .بک تهیه شود
                    res.AddReturnedValue(
                        await CompressFile.CompressFileInstance.CompressFileAsync(PathForZipDirectory.value, path, guid,
                                                                                  type));
                }
                catch (Exception ex)
                {
                    WebErrorLog.ErrorInstence.StartErrorLog(ex);
                    res.AddReturnedValue(ex);
                }
                res.value = path.ToLower().Replace(".npz2", ".np").Replace(".npz", ".np").Replace(".np", ".npz2");

                //بنا به هر دلیلی امکان فشرده کردن فایل وجود نداشته است
                //باید همان بکاپ فشرده نشده به آدرس مقصد درخواستی مشتری متقل گردد
                if (res.HasError)
                {
                    var file = Directory.GetFiles(PathForZipDirectory.value).FirstOrDefault();
                    File.Move(file, path.ToLower().Replace(".npz2", ".np").Replace(".npz", ".np"));
                }

                OnCreateBackup?.Invoke(null,
                                       new CreateBackupArgs()
                {
                    Message = "", State = CreateBackupState.End
                });

                await BackUpLogAsync(guid, type, EnBackUpStatus.Success, path.ToLower(),
                                     "عملیات پشتیبان گیری با موفقیت انجام شد");
            }
            catch (OperationCanceledException ex)
            {
                res.AddReturnedValue(ex);
            }
            catch (Exception ex)
            {
                await BackUpLogAsync(guid, type, EnBackUpStatus.Error, path.ToLower().Replace(".npz2", ".np").Replace(".npz", ".np"),
                                     ex.Message);

                WebErrorLog.ErrorInstence.StartErrorLog(ex, $"Error in Line {line}");
                res.AddReturnedValue(ex);
            }
            finally
            {
                Task.Run(DeleteTempsAsync);
            }
            return(res);
        }
Exemplo n.º 2
0
        public static async Task <ReturnedSaveFuncInfo> BackupDbAsync(string connectionString, ENSource Source, string path = "", Guid?Guid = null, CancellationToken token = default)
        {
            var    line         = 0;
            var    res          = new ReturnedSaveFuncInfo();
            bool   IsAutomatic  = string.IsNullOrEmpty(path);
            string DatabaseName = "";

            try
            {
                OnCreateBackup?.Invoke(null, new CreateBackupArgs()
                {
                    Message = "", State = CreateBackupState.Start
                });
                token.ThrowIfCancellationRequested();
                DeleteTempFilesToken?.Cancel();

                if (IsAutomatic)
                {
                    path = CreateFileName(connectionString);
                }
                if (!string.IsNullOrEmpty(path) && Directory.Exists(path))
                {
                    //در نرم افزار حسابداری آدرس پوشه پشتیبان گیری اتوماتیک داده شده است
                    //باید فایل پشتیبان در این پوشه ایجاد گردد
                    path        = CreateFileName(connectionString, path);
                    IsAutomatic = true;
                }

                DeleteTempFilesToken?.Cancel();
                token.ThrowIfCancellationRequested();

                //تهیه اولین نسخه بکاپ توسط سرویس اس کیو ال
                var CreateSqlBackuResult = await CreateSqlServerBackupFileAsync(path, connectionString);

                DatabaseName = CreateSqlBackuResult.value;
                res.AddReturnedValue(CreateSqlBackuResult);
                DeleteTempFilesToken?.Cancel();
                token.ThrowIfCancellationRequested();

                var PathForZipDirectory = Zip.Move2Temp(path);
                res.AddReturnedValue(PathForZipDirectory);
                DeleteTempFilesToken?.Cancel();
                token.ThrowIfCancellationRequested();

                try
                {
                    //please dont remove this try
                    //اگر به خطا خورد باید تابع ادامه پیدا کند و پشتیبان با پسوند .بک تهیه شود
                    res.AddReturnedValue(await CompressFile.CompressFileInstance.CompressFileAsync(PathForZipDirectory.value, path, token));
                }
                catch (Exception ex)
                {
                    WebErrorLog.ErrorInstence.StartErrorLog(ex);
                    res.AddReturnedValue(ex);
                }
                res.value = path.ToLower().Replace(".npz2", ".np").Replace(".npz", ".np").Replace(".np", ".npz2");

                //بنا به هر دلیلی امکان فشرده کردن فایل وجود نداشته است
                //باید همان بکاپ فشرده نشده به آدرس مقصد درخواستی مشتری متقل گردد
                if (res.HasError)
                {
                    var file = Directory.GetFiles(PathForZipDirectory.value).FirstOrDefault();
                    File.Move(file, path.ToLower().Replace(".npz2", ".np").Replace(".npz", ".np"));
                }

                OnCreateBackup?.Invoke(null,
                                       new CreateBackupArgs()
                {
                    Message = "", State = CreateBackupState.End
                });
            }
            catch (OperationCanceledException ex)
            {
                res.AddReturnedValue(ex);
            }
            catch (Exception ex)
            {
                WebErrorLog.ErrorInstence.StartErrorLog(ex, $"Error in Line {line}");
                res.AddReturnedValue(ex);
            }
            finally
            {
                DeleteTempFilesToken?.Cancel();
                DeleteTempFilesToken = new CancellationTokenSource();
                Task.Run(() => deleteTempsAsync(DeleteTempFilesToken.Token));
                Task.Run(() => BackupHistory.DeleteOldBackupsAsync());
                Task.Run(() => BackupHistory.SaveAsync(new BackupHistory()
                {
                    Date         = DateTime.Now,
                    Guid         = Guid ?? System.Guid.NewGuid(),
                    IsAutomatic  = IsAutomatic,
                    DatabaseName = DatabaseName,
                    Path         = path,
                    IsSuccess    = !res.HasError,
                    Source       = Source
                }));
            }
            return(res);
        }