Ejemplo n.º 1
0
 /// <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();
 }