protected virtual string GetReportBody()
        {
            var body = new StringBuilder();

            body.AppendLine(ExceptionString);
            body.AppendLine();
            body.AppendLine(new string('-', 80));
            if (!string.IsNullOrWhiteSpace(TxtErrorComment.Text))
            {
                body.AppendLine("<補足>:" + TxtErrorComment.Text);
                body.AppendLine(new string('-', 80));
            }
            body.AppendLine($"バージョン: Inazuma Search {ApplicationEnvironment.GetVersion().ToString()}" + (ApplicationEnvironment.GetPlatform() == "x86" ? " (32ビットバージョン)" : ""));
            body.AppendLine($"発生日時: {RaisedTime.ToString("yyyy-MM-dd HH:mm:ss")}");
            if (UserSetting.LastLoadedUserUuid != null)
            {
                body.AppendLine($"UUID: {UserSetting.LastLoadedUserUuid}");
            }
            body.AppendLine();
            body.AppendLine($"[OS]");
            var bitCaption = (OSIs64Bit == null ? "ビット数不明" : OSIs64Bit.Value ? "64ビット" : "32ビット");

            body.AppendLine($"{OSCaption ?? "不明"} {bitCaption}");
            body.AppendLine($"[メモリ使用量]");
            body.AppendLine($"物理RAM            : {FormatMemorySize(ProcessWorkingSet)}  (ピーク: {FormatMemorySize(ProcessPeakWorkingSet)})");
            body.AppendLine($"ページングファイル : {FormatMemorySize(ProcessPagedMemorySize)}  (ピーク: {FormatMemorySize(ProcessPeakPagedMemorySize)})");


            return(body.ToString());
        }
Пример #2
0
        /// <summary>
        /// 登録メイン処理
        /// </summary>
        protected virtual bool UpdateMain(
            Result crawlResult,
            IProgress <ProgressState> progress = null
            )
        {
            // 進捗を報告
            ReportProgressLimitedFrequency(
                progress,
                new ProgressState()
            {
                CurrentStep = ProgressState.Step.RecordUpdateCheckBegin, CurrentValue = crawlResult.Updated + crawlResult.Skipped, TotalValue = crawlResult.TotalTargetCount, Path = FilePath
            },
                crawlResult
                );

            // 展開対象の拡張子一覧を取得
            var textExtNames   = _app.GetTextExtNames();
            var pluginExtNames = _app.GetPluginExtNames();

            // 実行時、指定ファイルがすでに削除(もしくは移動)されている場合は、処理をスキップ
            if (!File.Exists(FilePath))
            {
                Logger.Debug($"Target file not found - {FilePath}");
                return(false);
            }

            // ファイルが削除されていない場合、見つかった対象ファイルとして登録(DBからの文書削除時に使用)
            crawlResult.FoundTargetFilePathSet.Add(FilePath);

            // ファイル情報取得
            var fileInfo    = new FileInfo(FilePath);
            var fileUpdated = fileInfo.LastWriteTime;
            var fileSize    = fileInfo.Length;
            var key         = Util.MakeDocumentFileKey(FilePath);

            // ファイルがすでに登録されていて、日付もサイズも変わっていなければスキップ
            if (AlreadyDBRecordMap.ContainsKey(key))
            {
                var rec                  = AlreadyDBRecordMap[key];
                var recSize              = rec.GetIntValue(Column.Documents.SIZE).Value;
                var recUpdated           = (double)rec[Column.Documents.FILE_UPDATED_AT];
                var recMajorVerOnUpdated = rec.GetIntValue(Column.Documents.APPLICATION_MAJOR_VERSION_ON_UPDATED).Value;
                var recMinorVerOnUpdated = rec.GetIntValue(Column.Documents.APPLICATION_MINOR_VERSION_ON_UPDATED).Value;

                // 日付はGroonga側とFileInfo側で精度の違いがある場合があるため、秒部分のみ比較
                var recUpdatedSec  = Math.Floor(recUpdated);
                var fileUpdatedSec = Math.Floor(Groonga.Util.ToUnixTime(fileUpdated));
                if (recSize == fileSize && recUpdatedSec == fileUpdatedSec)
                {
                    // ver 0.25.0より前かつeml形式のファイルであればスキップしない(ver 0.25.0でパース方法に変更が入ったため)
                    var ext = Path.GetExtension(FilePath).TrimStart('.').ToLower();
                    if (recMajorVerOnUpdated == 0 && recMinorVerOnUpdated < 25 && ext == "eml")
                    {
                    }
                    else
                    {
                        Logger.Debug("Skip - {0}", FilePath);

                        return(false);
                    }
                }
            }

            // 進捗を報告
            progress?.Report(new ProgressState()
            {
                CurrentStep = ProgressState.Step.RecordUpdateBegin, CurrentValue = crawlResult.Updated + crawlResult.Skipped, TotalValue = crawlResult.TotalTargetCount, Path = FilePath
            });

            // データの登録
            Application.ExtractFileResult extRes;

            // 拡張子に応じてテキストを抽出する
            try
            {
                extRes = _app.ExtractFile(FilePath, textExtNames, pluginExtNames);
                Logger.Debug($"Extract OK - {FilePath} (title: {extRes.Title}, body length: {extRes.Body.Length})");
            }
            catch (OperationCanceledException ex)
            {
                // キャンセル操作の場合は外に投げる
                throw (ex);
            }
            catch (Exception ex)
            {
                // 例外発生時はスキップ
                Logger.Warn("Crawl Extract Error - {0}", FilePath);
                Logger.Warn(ex.ToString());
                return(false);
            }

            Thread.Sleep(0); // 他のスレッドに処理を渡す

            // 付与するべきフォルダラベル一覧を取得
            var folderLabels = _app.UserSettings.FindTargetFoldersFromDocumentKey(key).Select((f) => f.Label)
                               .Where((lbl) => !string.IsNullOrWhiteSpace(lbl))
                               .ToArray();

            // Groongaへデータを登録
            var appVer = ApplicationEnvironment.GetVersion();
            var obj    = new Dictionary <string, object>
            {
                { Column.Documents.KEY, key },
                { Column.Documents.TITLE, extRes.Title },
                { Column.Documents.BODY, extRes.Body },
                { Column.Documents.FILE_NAME, Path.GetFileName(FilePath) },
                { Column.Documents.FILE_PATH, FilePath },
                { Column.Documents.FILE_UPDATED_AT, Groonga.Util.ToUnixTime(fileUpdated) },
                { Column.Documents.FILE_UPDATED_YEAR, fileUpdated.Year },
                { Column.Documents.SIZE, fileSize },
                { Column.Documents.EXT, Path.GetExtension(FilePath).TrimStart('.').ToLower() },
                { Column.Documents.UPDATED_AT, Groonga.Util.ToUnixTime(DateTime.Now) },
                { Column.Documents.FOLDER_LABELS, folderLabels },
                { Column.Documents.APPLICATION_MAJOR_VERSION_ON_UPDATED, appVer.Major },
                { Column.Documents.APPLICATION_MINOR_VERSION_ON_UPDATED, appVer.Minor },
                { Column.Documents.APPLICATION_PATCH_VERSION_ON_UPDATED, appVer.Patch },
            };

            Logger.Trace($"Store to groonga DB");
            _app.GM.Load(new[] { obj }, Table.Documents);

            Thread.Sleep(0); // 他のスレッドに処理を渡す

            // 同時に、可能であればサムネイルも保存
            Logger.Trace("Get thumbnail - {0}", FilePath);
            try
            {
                var sh = ShellObject.FromParsingName(FilePath);
                sh.Thumbnail.FormatOption = ShellThumbnailFormatOption.ThumbnailOnly;

                var bmp           = sh.Thumbnail.Bitmap;
                var thumbnailName = Util.HexDigest(_app.HashProvider, key) + ".png";
                bmp.Save(Path.Combine(_app.ThumbnailDirPath, thumbnailName));
            }
            catch (OperationCanceledException ex)
            {
                // キャンセル操作の場合は外に投げる
                throw (ex);
            }
            catch (Exception ex)
            {
                Logger.Warn("Thumbnail Error - {0}", FilePath);
                Logger.Debug(ex.ToString());
            }

            Logger.Debug("Update OK - {0}", FilePath);

            // 登録成功
            return(true);
        }