/// <summary> /// To save the call data as a recovery file in case of call data import failure /// </summary> /// <param name="log">Thread specific logger</param> /// <param name="readerSetting">DataReaderSetting to get the recovery folder path</param> /// <param name="callDataInfo">Ivr call data information received from database</param> /// <param name="failureMode">Call data importation failure mode to identify the failure reason</param> private void LoadCallDataIntoFile(ILog log, DataReaderSetting readerSetting, IvrCallDataInfo callDataInfo, ImportationFailureMode failureMode) { try { log.Info("Inside Method"); string folder = string.Empty; string callId = string.Empty; string filePrefix = string.Empty; if (string.IsNullOrEmpty(callDataInfo.CallID)) { callId = "calldata"; } else { callId = callDataInfo.CallID; } switch (failureMode) { case ImportationFailureMode.BadXml: case ImportationFailureMode.InvalidXml: case ImportationFailureMode.InvalidData: if (failureMode == ImportationFailureMode.BadXml) { filePrefix = "BAD_"; } else if (failureMode == ImportationFailureMode.InvalidData) { filePrefix = "INVALID_"; } folder = string.Format("{0}\\{1}\\{2}", readerSetting.InvalidXmlFolder, DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HH")); break; case ImportationFailureMode.DuplicateXml: folder = string.Format("{0}\\{1}\\{2}", readerSetting.InvalidDBRequestFolder, DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HH")); break; default: folder = string.Format("{0}\\{1}\\{2}", readerSetting.RecoveryFolder, DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HH")); break; } if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } int fileCount = Directory.GetFiles(folder).Length + 1; string filePath = string.Format("{0}\\{1}{2}_{3}_{4}.txt", folder, filePrefix, readerSetting.Name, fileCount, (new Random()).Next(1000, 9999)); while (File.Exists(filePath)) { if (log.IsInfoEnabled) { log.InfoFormat("Recovery File already exist with this name : {0}", filePath); } filePath = string.Format("{0}\\{1}{2}_{3}_{4}.txt", folder, filePrefix, readerSetting.Name, fileCount.ToString("######"), (new Random()).Next(10000, 999999)); } File.WriteAllText(filePath, callDataInfo.CallData); log.InfoFormat("Call Data Written to the file, Call ID : {0}, File Path : {1}", callId, filePath); } catch (Exception ex) { log.Error("Loading Call Data to Recovery Folder is Failed", ex); log.ErrorFormat("Call Data :\n {0} ", callDataInfo.CallData); } }
/// <summary> /// To update the ivr call data status in database /// </summary> /// <param name="callData">IVR Call Data</param> /// <param name="appId">IVR Application ID</param> /// <param name="callId">IVR Call ID</param> /// <param name="failureMode">Call Data Imporation Response</param> private void UpdateIvrCallDataStatus(string callData, string reportdata, string appId, string callId, string sessionId, DateTime callDateTime, ImportationFailureMode failureMode) { int errorCode = 0; string errorDesc = string.Empty; Dictionary <string, string> dicParams = null; try { _log.Info("Inside Method"); if (failureMode == ImportationFailureMode.ImportFailed || failureMode == ImportationFailureMode.None) { return; } dicParams = new Dictionary <string, string>(); dicParams.Add("CALL_ID", callId); dicParams.Add("SESSION_ID", sessionId); dicParams.Add("APP_ID", appId); dicParams.Add("CALL_DATA", callData); dicParams.Add("REPORT_DATA", reportdata); dicParams.Add("CALL_DATETIME", callDateTime.ToString("MM/dd/yyyy hh:mm:ss")); dicParams.Add("STATUS", failureMode == ImportationFailureMode.InvalidXml ? "I" : "F"); dicParams.Add("PROCESS_STATUS", failureMode.ToString()); dicParams.Add("PROCESS_FAILUREREASON", failureMode.ToString()); dicParams.Add("PROCNAME", _dataImportSetting.AppImportSettings[appId].DataImportStatusProcedureName.ToString()); _dbHelper.UpdateIvrCallDataStatus(dicParams, out errorCode, out errorDesc); if (_isDebugLogEnabled) { _log.DebugFormat("Error Code : {0}, Error Description : {1}", errorCode, errorDesc); } } catch (Exception ex) { _log.Error("Error occured while updating the status of Ivr Call Data", ex); } finally { if (dicParams != null) { dicParams.Clear(); } dicParams = null; } }
/// <summary> /// To move the recovery file to invalid xml, second cycle or unrecoverable folder in case of call data import failure /// </summary> /// <param name="log">Thread specific logger</param> /// <param name="file">Recovery file path</param> /// <param name="failureMode">Call data imporation failure mode</param> /// <param name="recoverySetting">FileReaderSetting in the configuration</param> private void MoveRecoveryFiles(ILog log, string file, ImportationFailureMode failureMode, FileReaderSetting recoverySetting) { try { log.Info("Inside Method"); string folder = string.Empty; string filePrefix = string.Empty; switch (failureMode) { case ImportationFailureMode.BadXml: case ImportationFailureMode.InvalidXml: case ImportationFailureMode.InvalidData: if (failureMode == ImportationFailureMode.BadXml) { filePrefix = "BAD_"; } else if (failureMode == ImportationFailureMode.InvalidData) { filePrefix = "INVALID_"; } folder = string.Format("{0}\\{1}\\{2}", recoverySetting.InvalidXmlFolder, DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HH")); break; case ImportationFailureMode.DuplicateXml: folder = string.Format("{0}\\{1}\\{2}", recoverySetting.InvalidDBRequestFolder, DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HH")); break; default: FileInfo fileInfo = new FileInfo(file); string dirName = fileInfo.Directory.Parent.Parent.Name; if (DateTime.Now.Subtract(fileInfo.CreationTime).TotalHours < _fileRecoveryMaxTime) { return; } if (dirName.Equals(StaticInfo.SecondCycleFolder, StringComparison.CurrentCultureIgnoreCase)) { folder = string.Format("{0}\\{1}\\{2}\\{3}", recoverySetting.RecoveryFolder, StaticInfo.UnRecoverableFolder, DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HH")); } else { folder = string.Format("{0}\\{1}\\{2}\\{3}", recoverySetting.RecoveryFolder, StaticInfo.SecondCycleFolder, DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HH")); } break; } if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } string fileNameWithExt = System.IO.Path.GetFileName(file); string newFilePath = string.Format("{0}\\{1}{2}", folder, filePrefix, fileNameWithExt); int fileCount = Directory.GetFiles(folder).Length + 1; while (File.Exists(newFilePath)) { newFilePath = string.Format("{0}\\{1}{2}_{3}_{4}", folder, filePrefix, fileCount.ToString("######"), (new Random()).Next(1000, 9999), fileNameWithExt); } File.Move(file, newFilePath); log.InfoFormat("Recovery Failed Data Moved From {0} [TO] {1}", file, newFilePath); } catch (Exception ex) { log.Error("Recovery Failed - Call Data Movement is Failed", ex); } }