/// <summary> /// SQLQueのLibraryDBへのインポート処理を行う /// </summary> /// <param name="OptimizeDB">完了後にデータベースの最適化を実施するかどうか</param> private void RunInsertUpdateQuery(bool OptimizeDB) { using (var libraryDB = AppCore.Library.Connect()) using (var stmt_insert = GetInsertPreparedStatement(libraryDB)) using (var stmt_update = GetUpdatePreparedStatement(libraryDB)) using (var stmt_test = libraryDB.Prepare("SELECT rowid FROM list WHERE file_name = ?;")) { try { libraryDB.Exec("BEGIN;"); Logger.Log("library.dbへのインポートを開始しました"); } catch (SQLite3DB.SQLite3Exception) { Logger.Error("library.dbへのインポートを開始できませんでした"); return; } var colsToImport = GetToBeImportColumn().ToArray(); lock (ToBeImportTracks) { ToBeImportTracks .Where(_ => _.duration != 0) .OrderBy(_ => "" + _.getTagValue("ALBUM") + (Util.Util.GetTrackNumberInt(_.getTagValue("TRACK").ToString(), 1).ToString().PadLeft(5, '0'))) .ToList() .ForEach(track => { // Titleが無かったらfile_titleを付与 if (!track.tag.Exists(_ => _.Key == "TITLE")) { track.tag.Add(new KeyValuePair <string, object>("TITLE", track.file_title)); } try { // データベースに既に存在しているトラックかテスト stmt_test.Reset(); stmt_test.Bind(1, track.file_name); var stmtToUse = stmt_test.EvaluateAll().Length > 0 ? stmt_update : stmt_insert; stmtToUse.Reset(); BindTrackInfo(stmtToUse, track, colsToImport); stmtToUse.Evaluate(null); } catch (SQLite3DB.SQLite3Exception e) { Logger.Error(e); } }); ToBeImportTracks.Clear(); } try { if (OptimizeDB) { Message("ライブラリを最適化しています"); } libraryDB.Exec("COMMIT;"); if (OptimizeDB) { libraryDB.Exec("VACUUM;"); libraryDB.Exec("REINDEX;"); } } catch (SQLite3DB.SQLite3Exception) { Logger.Error("library.dbへのインポートを完了できませんでした"); } } Logger.Log("library.dbへのインポートが完了しました"); AppCore.DatabaseUpdated(); }