예제 #1
0
파일: BackupTask.cs 프로젝트: hoku850/dp2
        // 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");
            }
        }
예제 #2
0
        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);
        }