Exemple #1
0
        private void BackUpFilteredDb(string copyDbName)
        {
            string targetNameForRar = string.Format("{0}{1}.bak", DiskOperations.DataTemp_ForBackUpDirectory, copyDbName);

            DiskOperations.AssertFileNotExist(targetNameForRar, Utility._Error_ExistTargetBackUpDb);
            SqlCommandRunner.BackUpDb(copyDbName, targetNameForRar);
        }
        /// <summary>
        /// 分析Rar文件,并将Config解析为Rule与时间参数
        /// </summary>
        /// <param name="theRarFile">rar文件的地址</param>
        /// <param name="fromDay">开始时间</param>
        /// <param name="toDay">结合时间</param>
        /// <param name="directory">解压缩的文件夹</param>
        /// <param name="needClean">分析结束是否需要清理解压缩的文件夹</param>
        /// <param name="remainRarFile">分析结束是否需要保留Rar文件</param>
        /// <returns>迁移规则</returns>
        public static TransferRule AnalyseRarData(string theRarFile, out DateTime?fromDay, out DateTime?toDay, string directory, bool needClean, bool remainRarFile)
        {
            //解压缩
            CommandRunner.AssertIsRarFile(theRarFile);
            CommandRunner.UnRarFileToDirectory(theRarFile, DiskOperations.CorrectDirectory(directory), true);

            //分析config文件
            string ruleString;
            Dictionary <string, string> theRuleStrings = new Dictionary <string, string>();

            theRuleStrings.Add(ReadConfig(DiskOperations.CorrectDirectory(directory), out ruleString, out fromDay, out toDay), ruleString);
            List <TransferRule> allTransferRule = RuleConverter.Convert(theRuleStrings);

            if (allTransferRule.Count != 1)
            {
                throw new ApplicationException(Utility._Error_AnalyseRarData_Error);
            }

            if (needClean)
            {
                CommandRunner.CleanUpDirectory(DiskOperations.CorrectDirectory(directory));
            }
            if (!remainRarFile)
            {
                CommandRunner.DeleteFile(theRarFile);
            }

            return(allTransferRule[0]);
        }
Exemple #3
0
        internal void RestoreData(DateTime?fromDay, DateTime?toDay, RestoreStatus theRuningStatusInSession)
        {
            //备份源数据库
            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}{1}", Utility._Process_BackUpDb, _DbName));
            string targetName = string.Format("{0}{1}{2}.bak", DiskOperations.DbBackUp_ForRestoreDirectory, _DbName, Utility.GetTimeStamp());

            SqlCommandRunner.BackUpDb(_DbName, targetName);

            //删减数据库备份
            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}", Utility._Process_DelNonuseDbBackUp));
            theRuningStatusInSession.AddInformationLine(DiskOperations.DelFilesFromDirectory(DiskOperations.DbBackUp_ForRestoreDirectory, _DbName, targetName, _DefaultBackUpDbCount));

            //拷贝下载的数据库用于数据还原
            string copyDbName = _DbName + _ForRestoreCopyDbSuffix;
            string downLoadDbBackUpFullName = string.Format("{0}{1}{2}.bak", DiskOperations.DataTemp_ForRestoreDirectory, _DbName, _OrginCopyDbSuffix);

            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}{1}", Utility._Process_CopyDb, copyDbName));
            SqlCommandRunner.RestoreDbFromFile(copyDbName, DiskOperations.TempDirectory, downLoadDbBackUpFullName);

            //每一个表的数据还原
            foreach (TableTransfer tt in _TablesToTransfer)
            {
                tt.RestoreData(fromDay, toDay, theRuningStatusInSession);
            }

            //删除无用的数据库拷贝
            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}{1}", Utility._Process_DelNonUseDb, copyDbName));
            SqlCommandRunner.DeleteDb(copyDbName);
        }
        public static void BackUpData(string ruleName, DateTime?fromDay, DateTime?toDay, BackUpStatus theRuningStatusInSession)
        {
            StartFlag(theRuningStatusInSession);

            try
            {
                //读入静态配置表
                StartLittleProcess(theRuningStatusInSession, StaticConfigTable.ReadToTableToString());
                StaticConfigTable.ReadToTable();

                //准备所需文件夹
                StartLittleProcess(theRuningStatusInSession, DiskOperations.PrepareForBackUpToString());
                DiskOperations.PrepareForBackUp();

                //检查Rar压缩器
                StartLittleProcess(theRuningStatusInSession, CommandRunner.CheckRarReadyToString());
                CommandRunner.CheckRarReady();

                //配置日志对象
                StartLittleProcess(theRuningStatusInSession, TransferDataLogManager.TryConfigLogObjToString());
                TransferDataLogManager.TryConfigLogObj();

                //根据规则起另外线程开始工作
                StartLittleProcess(theRuningStatusInSession, RulesPool.FindRuleByNameToString());
                //需要克隆的原因在于RulesPool是静态的,上次运行的对象会影响下次的运行
                TransferRule  tr  = RulesPool.FindRuleByName(ruleName);
                BackUpProcess bup = StartBackUp;
                bup.BeginInvoke(tr.Clone() as TransferRule, fromDay, toDay, theRuningStatusInSession, null, null);
            }
            catch (ApplicationException ae)
            {
                FailedFlag(theRuningStatusInSession, ae.Message);
            }
        }
        /// <summary>
        /// 读取Config,获取相应的规则字符串与调用参数
        /// </summary>
        /// <param name="directoryWithConfigFile">默认配置存放的文件夹,里面应该存有默认的配置文件,入config.txt</param>
        /// <param name="ruleString">规则字符串</param>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <returns>规则名字</returns>
        public static string ReadConfig(string directoryWithConfigFile, out string ruleString, out DateTime?startTime, out DateTime?endTime)
        {
            //读取所有配置字符串
            string        fullConfigName     = DiskOperations.CorrectDirectory(directoryWithConfigFile) + _DefaultConfigName;
            List <string> readConfigs        = DiskOperations.ReadLinesFromFile(fullConfigName);
            string        theRuleNameString  = FindLineContainsKey(readConfigs, _TransferRuleNameKey);
            string        theRuleString      = FindLineContainsKey(readConfigs, _TransferRuleKey);
            string        theParameterString = FindLineContainsKey(readConfigs, _TransderParameterKey);

            //配对出参数,迁移名字以及迁移字符串
            GetParameter(theParameterString, out startTime, out endTime);
            ruleString = theRuleString.Replace(_TransferRuleKey, string.Empty);
            return(theRuleNameString.Replace(_TransferRuleNameKey, string.Empty));
        }
        /// <summary>
        /// 拷贝文件至文件夹
        /// </summary>
        public static void CopyToDirectory(string fromFile, string toDirectory)
        {
            if (!File.Exists(fromFile))
            {
                throw new ApplicationException(string.Format("{0}{1}", Utility._Error_File_NotExist, fromFile));
            }
            string fileName   = fromFile.Substring(fromFile.LastIndexOf(@"\") + 1);
            string targetFile = string.Format("{0}{1}", DiskOperations.CorrectDirectory(toDirectory), fileName);

            if (File.Exists(targetFile))
            {
                throw new ApplicationException(string.Format("{0}{1}", Utility._Error_File_Exist, targetFile));
            }
            Copy(fromFile, toDirectory);
        }
        public void BackUpData(DateTime?fromDay, DateTime?toDay, BackUpStatus theRuningStatusInSession)
        {
            try
            {
                //写入迁移配置文件
                TransferService.StartLittleProcess(theRuningStatusInSession, TransferConfig.WriteConfigToString());
                TransferConfig.WriteConfig(this, fromDay, toDay);

                //配置所有过滤器
                TransferService.StartLittleProcess(theRuningStatusInSession, Utility._Process_ConfigFilter);
                ConfigAllRuleFitler();

                //每个数据库执行操作
                foreach (DbTransfer dt in _DbsToTransfer)
                {
                    dt.BackUpData(fromDay, toDay, theRuningStatusInSession);
                }

                //打包下载文件
                TransferService.StartLittleProcess(theRuningStatusInSession, Utility._Process_RarBackUpFile);
                string theBackUpSimpleName = string.Format("{0}{1}.rar", _DefaultBackUpDbName, Utility.GetTimeStamp());
                string theBackUpFullPath   = string.Format("{0}{1}", DiskOperations.DownLoadDirectory, theBackUpSimpleName);
                CommandRunner.RarDirectoryToFile(theBackUpFullPath, DiskOperations.DataTemp_ForBackUpDirectory);
                theRuningStatusInSession.SuccessFileName     = theBackUpSimpleName;
                theRuningStatusInSession.SuccessFullFileName = theBackUpFullPath;

                //清理无用的数据
                TransferService.StartLittleProcess(theRuningStatusInSession, Utility._Process_CleanNonUseData);
                CommandRunner.CleanUpDirectory(DiskOperations.DataTemp_ForBackUpDirectory);
                theRuningStatusInSession.AddInformationLine(DiskOperations.DelFilesFromDirectory(DiskOperations.DownLoadDirectory, _DefaultBackUpDbName, theBackUpFullPath, _DefaultDownloadFiles));

                //成功运行
                TransferService.SuccessFlag(theRuningStatusInSession);
            }
            catch (ApplicationException ae)
            {
                TryBackUpErrorClean();
                TransferService.FailedFlag(theRuningStatusInSession, ae.Message);
            }
            catch (Exception e)
            {
                TryBackUpErrorClean();
                TransferService.ErrorFlag(theRuningStatusInSession, e.Message);
            }
        }
        /// <summary>
        /// 写入Config
        /// </summary>
        /// <param name="theRule">待写入的Rule</param>
        /// <param name="startTime">开始时间(方法参数)</param>
        /// <param name="endTime">结束时间(方法参数)</param>
        public static void WriteConfig(TransferRule theRule, DateTime?startTime, DateTime?endTime)
        {
            TransferRule _TransferRule = theRule;

            Utility.AssertNotNull(theRule, Utility._Error_TransferRule_NotNull);

            List <string> needWrite = new List <string>();

            //写规则的名字
            needWrite.Add(_TransferRuleNameKey + _TransferRule.RuleName);
            //写规则字符
            needWrite.Add(_TransferRuleKey + _TransferRule.MakeString());
            //写参数名字
            needWrite.Add(_TransderParameterKey + MakeParameters(startTime, endTime));
            string fullConfigName = DiskOperations.DataTemp_ForBackUpDirectory + _DefaultConfigName;

            DiskOperations.WriteLinesToFile(fullConfigName, needWrite);
        }
        /// <summary>
        /// 清空文件夹,删除文件夹下所有文件(不递归)
        /// </summary>
        public static void CleanUpDirectory(string directory)
        {
            string theRightDirectory = DiskOperations.CorrectDirectory(directory);
            string command           = string.Format("/c del \"{0}*\" /q", theRightDirectory);

            bool reslut;

            try
            {
                reslut = Run("cmd.exe", command, 20);
            }
            catch (Exception e)
            {
                throw new ApplicationException(string.Format("{0}{1},原因是:{2}", Utility._Error_CleanDirectory_Failed, theRightDirectory, e.Message));
            }
            if (!reslut)
            {
                throw new ApplicationException(string.Format("{0}{1},原因是:超时(20秒内无响应)", Utility._Error_CleanDirectory_Failed, theRightDirectory));
            }
        }
        public static void RestoreData(string theRarFile, RestoreStatus theRuningStatusInSession)
        {
            StartFlag(theRuningStatusInSession);

            try
            {
                //读入静态配置表
                StartLittleProcess(theRuningStatusInSession, StaticConfigTable.ReadToTableToString());
                StaticConfigTable.ReadToTable();

                //准备所需文件夹
                StartLittleProcess(theRuningStatusInSession, DiskOperations.PrepareForRestoreToString());
                DiskOperations.PrepareForRestore();

                //检查Rar压缩器
                StartLittleProcess(theRuningStatusInSession, CommandRunner.CheckRarReadyToString());
                CommandRunner.CheckRarReady();

                //配置日志对象
                StartLittleProcess(theRuningStatusInSession, TransferDataLogManager.TryConfigLogObjToString());
                TransferDataLogManager.TryConfigLogObj();

                //解析Rar数据
                StartLittleProcess(theRuningStatusInSession, TransferConfig.AnalyseRarDataToString());
                DateTime?    fromDay;
                DateTime?    toDay;
                TransferRule theTransferRule = TransferConfig.AnalyseRarData(theRarFile, out fromDay, out toDay, DiskOperations.DataTemp_ForRestoreDirectory, false, false);

                //根据规则起另外线程开始工作
                RestoreProcess rp = StartRestore;
                rp.BeginInvoke(theTransferRule, fromDay, toDay, theRuningStatusInSession, null, null);
            }
            catch (ApplicationException ae)
            {
                FailedFlag(theRuningStatusInSession, ae.Message);
            }
        }
Exemple #11
0
        internal void BackUpData(DateTime?fromDay, DateTime?toDay, RunningStatus theRuningStatusInSession)
        {
            //备份源数据库
            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}{1}", Utility._Process_BackUpDb, _DbName));
            string targetName = string.Format("{0}{1}{2}.bak", DiskOperations.DbBackUp_ForBackUpDirectory, _DbName, Utility.GetTimeStamp());

            SqlCommandRunner.BackUpDb(_DbName, targetName);

            //删减数据库备份
            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}", Utility._Process_DelNonuseDbBackUp));
            theRuningStatusInSession.AddInformationLine(DiskOperations.DelFilesFromDirectory(DiskOperations.DbBackUp_ForBackUpDirectory, _DbName, targetName, _DefaultBackUpDbCount));

            //拷贝数据库用于数据筛选
            string copyDbName = _DbName + _OrginCopyDbSuffix;

            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}{1}", Utility._Process_CopyDb, copyDbName));
            SqlCommandRunner.RestoreDbFromFile(copyDbName, DiskOperations.TempDirectory, targetName);

            //删除无用的表
            TransferService.StartLittleProcess(theRuningStatusInSession, Utility._Process_DelNonUseTable);
            theRuningStatusInSession.AddInformationLine(DropNonUseTable(copyDbName));

            //有用表数据筛选
            foreach (TableTransfer tt in _TablesToTransfer)
            {
                tt.BackUpData(fromDay, toDay, theRuningStatusInSession);
            }

            //将筛选完毕的数据库备份到指定地点用于打包压缩
            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}{1}", Utility._Process_BackUpFiltedTable, copyDbName));
            BackUpFilteredDb(copyDbName);

            //删除无用的数据库拷贝
            TransferService.StartLittleProcess(theRuningStatusInSession, string.Format("{0}{1}", Utility._Process_DelNonUseDb, copyDbName));
            SqlCommandRunner.DeleteDb(copyDbName);
        }
Exemple #12
0
        internal void CheckDbBackUpExist()
        {
            string dbBackUpFullName = string.Format("{0}{1}{2}.bak", DiskOperations.DataTemp_ForRestoreDirectory, _DbName, _OrginCopyDbSuffix);

            DiskOperations.AssertFileExist(dbBackUpFullName, Utility._Error_ExistTargetBackUpDb);
        }
 internal void Construct()
 {
     _TableFilter = string.IsNullOrEmpty(_TableFilterName) ? new NullTableFilter() : DiskOperations.CreateTableFilterObj(_TableFilterName);
 }
 public static TransferRule AnalyseRarData(string theRarFile, out DateTime?fromDay, out DateTime?toDay)
 {
     StaticConfigTable.ReadToTable();
     DiskOperations.PrepareForBackUp();
     return(TransferConfig.AnalyseRarData(theRarFile, out fromDay, out toDay, DiskOperations.TempDirectory, true, true));
 }