// TODO: 中途要显示进度信息 int CreateRecPathFile(RmsChannel channel, string strDbNameList, string strOutputFileName, out string strError) { strError = ""; int nRecordCount = 0; List <string> dbnames = StringUtil.SplitList(strDbNameList); StringUtil.RemoveBlank(ref dbnames); StringUtil.RemoveDupNoSort(ref dbnames); if (dbnames.Count == 0) { dbnames.Add("*"); } { List <string> results = new List <string>(); foreach (string dbname in dbnames) { if (string.IsNullOrEmpty(dbname) == true || dbname == "*") { // 如果数据库名为 *,表示希望获取所有的数据库 List <string> temp = null; // 获得所有数据库名 int nRet = GetAllDbNames(out temp, out strError); if (nRet == -1) { return(-1); } results.AddRange(temp); } else { results.Add(dbname); } } StringUtil.RemoveDupNoSort(ref results); dbnames = results; } this.AppendResultText("正在准备路径\r\n"); try { using (StreamWriter sw = new StreamWriter(strOutputFileName, false, Encoding.UTF8)) { foreach (string dbname in dbnames) { string strQueryXml = "<target list='" + dbname + ":" + "__id'><item><word>1-9999999999</word><match>exact</match><relation>range</relation><dataType>number</dataType><maxCount>-1</maxCount></item><lang>chi</lang></target>"; long lRet = channel.DoSearch(strQueryXml, "default", out strError); if (lRet == -1) { return(-1); } if (lRet == 0) { continue; } SearchResultLoader loader = new SearchResultLoader(channel, null, "default", "id"); loader.ElementType = "Record"; foreach (Record record in loader) { if (record.RecordBody != null && record.RecordBody.Result != null && record.RecordBody.Result.ErrorCode == ErrorCodeValue.NotFound) { continue; } sw.WriteLine(record.Path); SetProgressText(nRecordCount.ToString()); #if NO // 每 1000 条显示一行 if ((nRecordCount % 1000) == 0) { this.AppendResultText("已准备路径 " + record.Path + " " + (nRecordCount + 1).ToString() + "\r\n"); } #endif nRecordCount++; } } } return(0); } catch (Exception ex) { strError = ex.Message; return(-1); } finally { this.AppendResultText("结束准备路径。共 " + nRecordCount + "\r\n"); } }
const int _removeDup_batchSize = 10000; // 利用 hashtable 进行局部去重的每批个数 // 从 dp2Kernel 端获取结果集 // parameters: // strStyle tobibliorecpath 将实体\期\订购\评注 记录路径转换为书目记录路径,并去重 int GetResultset(RmsChannel channel, string strResultsetName, DpResultSet resultset, out string strError) { strError = ""; m_biblioDbNameTable.Clear(); Hashtable temp_table = new Hashtable(); string strFormat = "id,cols,format:@coldef://parent"; // "id,xml"; SearchResultLoader loader = new SearchResultLoader(channel, null, strResultsetName, strFormat); loader.ElementType = "Record"; #if DETAIL_LOG this.WriteErrorLog("开始从 dp2kernel 获取结果集"); #endif int hashtable_removedup_loops = 0; // 利用 hashtable 去重的轮次。如果只有一轮,则可以免去最后的结果集文件去重 try { foreach (Record rec in loader) { this._app_down.Token.ThrowIfCancellationRequested(); { if (rec.RecordBody != null && rec.RecordBody.Result != null && rec.RecordBody.Result.ErrorCode != ErrorCodeValue.NoError) { #if NO strError = "获得结果集位置偏移 " + (lStart + j).ToString() + " 时出错,该记录已被忽略: " + rec.RecordBody.Result.ErrorString; this.AppendResultText(strError + "\r\n"); #endif continue; } #if NO // 从册记录XML中获得书目记录路径 // return: // -1 出错 // 1 成功 int nRet = GetBiblioRecPath( rec.Path, rec.RecordBody.Xml, out strBiblioRecPath, out strError); if (nRet == -1) { return(-1); } #endif if (rec.Cols == null || rec.Cols.Length == 0) { #if NO strError = "获得结果集位置偏移 " + (lStart + j).ToString() + " 时出错: rec.Cols 为空"; this.AppendResultText(strError + "\r\n"); #endif continue; } // return: // -1 出错 // 1 成功 int nRet = GetBiblioRecPathByParentID( rec.Path, rec.Cols[0], out string strBiblioRecPath, out strError); if (nRet == -1) { return(-1); } // 缓冲并局部去重。局部去重可以减轻后面全局去重的压力 if (temp_table.Contains(strBiblioRecPath) == false) { temp_table.Add(strBiblioRecPath, null); if (temp_table.Count > _removeDup_batchSize) { FlushTable(temp_table, resultset); temp_table.Clear(); hashtable_removedup_loops++; } } //DpRecord record = new DpRecord(rec.Path); //item_paths.Add(record); } } } catch (Exception ex) { strError = "GetResultset() 出现异常: " + ex.Message; return(-1); } // if (bToBiblioRecPath == true) { // 最后一批 if (temp_table.Count > 0) { FlushTable(temp_table, resultset); temp_table.Clear(); hashtable_removedup_loops++; } resultset.Idle += new IdleEventHandler(biblio_paths_Idle); // 2016/1/23 原来这里是 -=,令人费解 try { #if DETAIL_LOG this.WriteErrorLog("开始排序结果集, count=" + resultset.Count); #endif // 归并后写入结果集文件 resultset.QuickSort(); resultset.Sorted = true; if (hashtable_removedup_loops > 1) { // 全局去重 #if DETAIL_LOG this.WriteErrorLog("开始对结果集去重, count=" + resultset.Count); #endif resultset.RemoveDup(); #if DETAIL_LOG this.WriteErrorLog("结束对结果集去重, count=" + resultset.Count); #endif } } finally { resultset.Idle -= new IdleEventHandler(biblio_paths_Idle); } } return(0); }