// [外部调用] // 修改评注记录后,更新栏目存储结构 // parameters: // strAction 动作。change/delete/new // return: // -2 栏目缓存尚未创建,因此无从更新 // -1 error // 0 not found line object // 1 succeed public int UpdateLine( System.Web.UI.Page page, string strAction, string strRecPath, string strXml, out string strError) { strError = ""; if (this.CommentColumn == null || this.CommentColumn.Opened == false) { strError = "尚未创建栏目缓存..."; return(-2); } this.m_lockCommentColumn.AcquireWriterLock(m_nCommentColumnLockTimeout); try { int nIndex = -1; int i = 0; Line line = null; if (strAction == "change" || strAction == "delete") { // 在Storage中找 // 需要写锁定 for (i = 0; i < this.CommentColumn.Count; i++) { string strCurrentRecPath = this.CommentColumn.GetItemRecPath(i); if (strCurrentRecPath == strRecPath) { nIndex = i; line = ((TopArticleItem)this.CommentColumn[nIndex]).Line; Debug.Assert(line.m_strRecPath == strRecPath, ""); this.CommentColumn.RemoveAt(nIndex); if (strAction == "delete") { return(1); } break; // goto FOUND; } } if (strAction == "delete") { return(0); } } else if (strAction == "new") { line = new Line(); line.m_strRecPath = strRecPath; } else { strError = "未知的strAction值 '" + strAction + "'"; return(-1); } // FOUND: if (strAction == "delete") { return(1); } int nRet = line.ProcessXml( null, // page, 这里至关重要,不能允许灵敏中断 strXml, out strError); if (nRet == -1) { // 将此情况写入错误日志 this.WriteErrorLog("在UpdateLine()函数中,调用line.ProcessXml()发生错误, 记录路径=" + line.m_strRecPath + ")。这将导致栏目主页面中,该记录从显示中丢失。详细原因:" + strError); return(-1); } { // 如果插入位置在Storage范围内 TopArticleItem item = new TopArticleItem(); item.Line = line; this.CommentColumn.Insert(0, item); } return(1); } finally { this.m_lockCommentColumn.ReleaseWriterLock(); } }
// 检索顶层文章 // return: // -1 error // 其他 命中数 private int SearchTopLevelArticles( SessionInfo sessioninfo, System.Web.UI.Page page, out string strError) { strError = ""; if (page != null && page.Response.IsClientConnected == false) // 灵敏中断 { strError = "中断"; return(-1); } // 检索全部评注文章 一定时间范围内的? List <string> dbnames = new List <string>(); for (int i = 0; i < this.ItemDbs.Count; i++) { ItemDbCfg cfg = this.ItemDbs[i]; string strDbName = cfg.CommentDbName; if (String.IsNullOrEmpty(strDbName) == true) { continue; } dbnames.Add(strDbName); } DateTime now = DateTime.Now; DateTime oneyearbefore = now - new TimeSpan(365, 0, 0, 0); string strTime = DateTimeUtil.Rfc1123DateTimeString(oneyearbefore.ToUniversalTime()); string strQueryXml = ""; for (int i = 0; i < dbnames.Count; i++) { string strDbName = dbnames[i]; string strOneQueryXml = "<target list='" + strDbName + ":" + "最后修改时间'><item><word>" // <order>DESC</order> + strTime + "</word><match>exact</match><relation>" + StringUtil.GetXmlStringSimple(">=") + "</relation><dataType>number</dataType><maxCount>" + "-1" // Convert.ToString(m_nMaxLineCount) + "</maxCount></item><lang>zh</lang></target>"; if (i > 0) { strQueryXml += "<operator value='OR' />"; } strQueryXml += strOneQueryXml; } if (dbnames.Count > 0) { strQueryXml = "<group>" + strQueryXml + "</group>"; } RmsChannel channel = sessioninfo.Channels.GetChannel(this.WsUrl); Debug.Assert(channel != null, "Channels.GetChannel 异常"); if (page != null) { page.Response.Write("--- begin search ...<br/>"); page.Response.Flush(); } DateTime time = DateTime.Now; long nRet = channel.DoSearch(strQueryXml, "default", out strError); if (nRet == -1) { strError = "检索时出错: " + strError; return(-1); } TimeSpan delta = DateTime.Now - time; if (page != null) { page.Response.Write("search end. hitcount=" + nRet.ToString() + ", time=" + delta.ToString() + "<br/>"); page.Response.Flush(); } if (nRet == 0) { return(0); // not found } if (page != null && page.Response.IsClientConnected == false) // 灵敏中断 { strError = "中断"; return(-1); } if (page != null) { page.Response.Write("--- begin get search result ...<br/>"); page.Response.Flush(); } time = DateTime.Now; List <string> aPath = null; nRet = channel.DoGetSearchResult( "default", -1, "zh", null, // stop, out aPath, out strError); if (nRet == -1) { strError = "获得检索结果时出错: " + strError; return(-1); } if (page != null) { delta = DateTime.Now - time; page.Response.Write("get search result end. lines=" + aPath.Count.ToString() + ", time=" + delta.ToString() + "<br/>"); page.Response.Flush(); } if (aPath.Count == 0) { strError = "获取的检索结果为空"; return(-1); } if (page != null && page.Response.IsClientConnected == false) // 灵敏中断 { strError = "中断"; return(-1); } if (page != null) { page.Response.Write("--- begin build storage ...<br/>"); page.Response.Flush(); } time = DateTime.Now; this.CommentColumn.Clear(); // 清空集合 // 加入新行对象。新行对象中,只初始化了m_strRecPath参数 for (int i = 0; i < Math.Min(aPath.Count, 1000000); i++) // <Math.Min(aPath.Count, 10) { Line line = new Line(); // line.Container = this; line.m_strRecPath = aPath[i]; nRet = line.InitialInfo( page, channel, out strError); if (nRet == -1) { return(-1); } if (nRet == 1) { return(-1); // 灵敏中断 } TopArticleItem item = new TopArticleItem(); item.Line = line; this.CommentColumn.Add(item); if (page != null && (i % 100) == 0) { page.Response.Write("process " + Convert.ToString(i) + "<br/>"); page.Response.Flush(); } } if (page != null) { delta = DateTime.Now - time; page.Response.Write("build storage end. time=" + delta.ToString() + "<br/>"); page.Response.Flush(); } return(1); }