/// <summary> /// 生きているスレとdat落ちしているスレを分離 /// </summary> /// <param name="oldBoard">ログが存在する板</param> /// <param name="newBoard">生きているスレの移転先</param> /// <param name="leaveItems">dat落ちしているスレが格納される</param> /// <param name="liveItems">生きているスレが格納される</param> private void Separate(BoardInfo oldBoard, BoardInfo newBoard, out List <ThreadHeader> leaveItems, out List <ThreadHeader> liveItems) { leaveItems = new List <ThreadHeader>(); liveItems = new List <ThreadHeader>(); if (cache.Exists(oldBoard)) { List <ThreadHeader> oldItems = GotThreadListIndexer.Read(cache, oldBoard); List <ThreadHeader> newItems = new List <ThreadHeader>(); ThreadListReader listReader = null; if (oldItems.Count > 0) { try { listReader = TypeCreator.CreateThreadListReader(newBoard.Bbs); listReader.Open(newBoard); while (listReader.Read(newItems) != 0) { ; } // 移転先のスレ一覧に存在するログのみ移転 (dat落ちしているスレは移転しない) foreach (ThreadHeader header in oldItems) { Predicate <ThreadHeader> p = new Predicate <ThreadHeader>(delegate(ThreadHeader h) { return(h.Key == header.Key); }); if (newItems.Exists(p)) { // 生きているスレの板情報を移転先板に書き換える if (ThreadIndexer.Read(cache, header) != null) { ThreadIndexer.Delete(cache, header); liveItems.Add(header); header.BoardInfo = newBoard; ThreadIndexer.Write(cache, header); } } else { leaveItems.Add(header); } } } finally { if (listReader != null) { listReader.Close(); } } } } }
/// <summary> /// 指定した板に対応するリーダーを作成し、開きます。 /// </summary> /// <param name="board"></param> /// <returns></returns> private bool OpenReader(BoardInfo board) { if (board.Bbs != bbsType && online) { bbsType = board.Bbs; networkReader = TypeCreator.CreateThreadListReader(bbsType); networkReader.ServerChange += new EventHandler <ServerChangeEventArgs>(OnServerChange); } baseReader = online ? new ThreadListReaderRelay(Cache, networkReader) : offlineReader; baseReader.BufferSize = bufferSize; baseReader.AutoRedirect = true; baseReader.Open(board); if (online) { oldItems = ((ThreadListReaderRelay)baseReader).CacheItems.ToArray(); } return(baseReader.IsOpen); }