// 重新用不同详细级别获取事项内容 // parameters: // item 要被重新获取内容的对象 // nLevel 内容详细级别。0/1/2。0 为最详细级 public OperLogItem LoadOperLogItem(OperLogItem item, int nLevel) { OperLogItemLoader loader = new OperLogItemLoader(); loader.Stop = this.Stop; loader.Channel = this.Channel; loader.Estimate = null;// loader.Date = item.Date + ".log"; loader.Level = nLevel; loader.lServerFileSize = -1; loader.Range = item.Index.ToString() + "-" + item.Index.ToString(); loader.AutoCache = this.AutoCache; loader.lProgressValue = 0; loader.lSize = 0; loader.Filter = this.Filter; loader.LogType = this.LogType; foreach (OperLogItem new_item in loader) { return(new_item); } return(null); }
public IEnumerator GetEnumerator() { string strError = ""; int nRet = 0; if ((this.LogType & LogType.AccessLog) != 0 && (this.LogType & LogType.OperLog) != 0) { throw new ArgumentException("OperLogLoader 的 LogType 只能使用一种类型"); } if (string.IsNullOrEmpty(this.CacheDir) == false) { TryCreateDir(this.CacheDir); } // ProgressEstimate estimate = new ProgressEstimate(); bool bAutoCache = this.AutoCache; if (bAutoCache == true) { // 象征性获得一个日志文件的尺寸,主要目的是为了触发一次通道登录 // return: // -2 此类型的日志尚未启用 // -1 error // 0 file not found // 1 found nRet = GetFileSize( this.Stop, this.Channel, this.CacheDir, "20121001.log", this.LogType, out long lServerFileSize, out long lCacheFileSize, out strError); if (nRet == -1) { throw new ChannelException(this.Channel.ErrorCode, strError); } // 2015/11/25 if (nRet == -2) { yield break; // 此类型的日志尚未启用 } // 检查日志文件缓存目录的版本是否和当前用户的信息一致 // return: // -1 出错 // 0 一致 // 1 不一致 nRet = DetectCacheVersionFile( this.CacheDir, "version.xml", this.Channel.LibraryCodeList, this.Channel.Url, out strError); if (nRet == -1) { throw new Exception(strError); } if (nRet == 1) { REDO: // 清空当前缓存目录 nRet = DeleteDataDir( this.CacheDir, out strError); if (nRet == -1) { if (this.Prompt != null) { MessagePromptEventArgs e = new MessagePromptEventArgs(); e.MessageText = "清空当前缓存目录时发生错误: " + strError; e.Actions = "yes,no,cancel"; this.Prompt(this, e); if (e.ResultAction == "cancel") { throw new InterruptException(strError); } else if (e.ResultAction == "yes") { goto REDO; } else { } } else { throw new Exception(strError); } } #if NO if (nRet == -1) { throw new Exception(strError); } #endif TryCreateDir(this.CacheDir); // 重新创建目录 // 创建版本文件 nRet = CreateCacheVersionFile( this.CacheDir, "version.xml", this.Channel.LibraryCodeList, this.Channel.Url, out strError); if (nRet == -1) { throw new Exception(strError); } } } long lTotalSize = 0; List <string> lines = new List <string>(); // 经过处理后排除了不存在的文件名 List <string> ranges = new List <string>(); // 日期后面的偏移部分 List <long> sizes = new List <long>(); // 服务器日志文件的尺寸 #if NO this.Stop.SetMessage("正在准备获得日志文件尺寸 ..."); foreach (string strLine in this.FileNames) { // Application.DoEvents(); if (this.Stop != null && this.Stop.State != 0) { strError = "用户中断"; throw new InterruptException(strError); // yield break; ? } if (String.IsNullOrEmpty(strLine) == true) { continue; } string strFilename = strLine.Trim(); // 去掉注释 nRet = strFilename.IndexOf("#"); if (nRet != -1) { strFilename = strFilename.Substring(0, nRet).Trim(); } if (String.IsNullOrEmpty(strFilename) == true) { continue; } string strLogFilename = ""; string strRange = ""; nRet = strFilename.IndexOf(":"); if (nRet != -1) { strLogFilename = strFilename.Substring(0, nRet).Trim(); strRange = strFilename.Substring(nRet + 1).Trim(); } else { strLogFilename = strFilename.Trim(); strRange = ""; } if (strLogFilename.Length == 8) { strLogFilename += ".log"; } REDO_GETSIZE: long lServerFileSize = 0; long lCacheFileSize = 0; // 获得一个日志文件的尺寸 // -2 此类型的日志尚未启用 // -1 error // 0 file not found // 1 found nRet = GetFileSize( this.Stop, this.Channel, this.CacheDir, strLogFilename, this.LogType, out lServerFileSize, out lCacheFileSize, out strError); if (nRet == -1) { // throw new Exception(strError); if (this.Prompt != null) { MessagePromptEventArgs e = new MessagePromptEventArgs(); e.MessageText = "获取日志文件 " + strLogFilename + " 尺寸的操作发生错误: " + strError; e.Actions = "yes,no,cancel"; this.Prompt(this, e); if (e.ResultAction == "cancel") { throw new InterruptException(strError); } else if (e.ResultAction == "yes") { if (this.Stop != null) { this.Stop.Continue(); } goto REDO_GETSIZE; } else { // ?? continue; } } else { throw new ChannelException(this.Channel.ErrorCode, strError); } } if (nRet == 0) { continue; } if (lServerFileSize == 0) { continue; // 0字节的文件当作不存在处理 } // 2015/11/25 if (lServerFileSize == -1) { yield break; // 此类型的日志尚未启用 } Debug.Assert(lServerFileSize >= 0, ""); if (bAutoCache == true) { if (lCacheFileSize > 0) { lTotalSize += lCacheFileSize; } else { lTotalSize += lServerFileSize; } } else { lTotalSize += lServerFileSize; } // lines.Add(strFilename); lines.Add(strLogFilename); ranges.Add(strRange); // 记忆每个文件的尺寸,后面就不用获取了? sizes.Add(lServerFileSize); } #endif // 预先处理一下文件名 List <string> filenames = new List <string>(); foreach (string strLine in this.Dates) { if (this.Stop != null && this.Stop.State != 0) { strError = "用户中断"; throw new InterruptException(strError); } if (String.IsNullOrEmpty(strLine) == true) { continue; } string strFilename = strLine.Trim(); // 去掉注释 nRet = strFilename.IndexOf("#"); if (nRet != -1) { strFilename = strFilename.Substring(0, nRet).Trim(); } if (String.IsNullOrEmpty(strFilename) == true) { continue; } #if NO List <string> parts = StringUtil.ParseTwoPart(strFilename, ":"); string strRange = parts[1]; strFilename = parts[0].Substring(0, 8); if (string.IsNullOrEmpty(strRange) == false) { range_table[strFilename] = strRange; // TODO: 如何防范文件名重复? } #endif filenames.Add(strFilename); Debug.Assert(strFilename.Length >= 8, ""); } // 准备查找表 Hashtable length_table = new Hashtable(); { List <FileSize> size_pairs = GetFilesLength( // filenames ); foreach (FileSize size_pair in size_pairs) { length_table[size_pair.Date] = size_pair; } } foreach (string filename in filenames) { FileSize size_pair = length_table[filename.Substring(0, 8)] as FileSize; if (size_pair == null) { continue; } Debug.Assert(size_pair != null, ""); lines.Add(filename); sizes.Add(size_pair.ServerFileSize); if (size_pair.ServerFileSize == -1) { yield break; // 此类型的日志尚未启用 } Debug.Assert(size_pair.ServerFileSize >= 0, ""); if (bAutoCache == true) { if (size_pair.CacheFileSize > 0) { lTotalSize += size_pair.CacheFileSize; } else { lTotalSize += size_pair.ServerFileSize; } } else { lTotalSize += size_pair.ServerFileSize; } } long lDoneSize = 0; if (this.ProgressStart == -1) { lDoneSize = lTotalSize; } else { lDoneSize = this.ProgressStart; } lTotalSize += lDoneSize; if (this.Stop != null) { this.Stop.SetProgressRange(0, lTotalSize); } if (Estimate != null) { Estimate.SetRange(lDoneSize, lTotalSize); Estimate.StartEstimate(); } for (int i = 0; i < lines.Count; i++) { // Application.DoEvents(); if (this.Stop != null && this.Stop.State != 0) { strError = "用户中断"; throw new InterruptException(strError); // yield break; ? } string strLine = lines[i]; Debug.Assert(strLine.Length >= 8, ""); // string strRange = ranges[i]; // 2017/10/9 List <string> parts = StringUtil.ParseTwoPart(strLine, ":"); string strRange = parts[1]; strLine = parts[0]; string strLogFilename = strLine; #if NO string strLogFilename = ""; string strRange = ""; nRet = strLine.IndexOf(":"); if (nRet != -1) { strLogFilename = strLine.Substring(0, nRet).Trim(); strRange = strLine.Substring(nRet + 1).Trim(); } else { strLogFilename = strLine.Trim(); strRange = ""; } #endif { OperLogItemLoader loader = new OperLogItemLoader { Stop = this.Stop, Channel = this.Channel, // loader.owner = this.owner; Estimate = this.Estimate, Date = strLogFilename, Level = this.Level, ReplicationLevel = this.ReplicationLevel, lServerFileSize = sizes[i], Range = strRange, AutoCache = this.AutoCache, lProgressValue = lDoneSize, lSize = lTotalSize, Filter = this.Filter, LogType = this.LogType, ServerVersion = this.ServerVersion }; if (this.Prompt != null) { loader.Prompt += new MessagePromptEventHandler(loader_Prompt); } try { foreach (OperLogItem item in loader) { yield return(item); } } finally { if (this.Prompt != null) { loader.Prompt -= new MessagePromptEventHandler(loader_Prompt); } } lDoneSize = loader.lProgressValue; lTotalSize = loader.lSize; } } }