public UserDB() { try { this.Open(ユーザDBファイルパス, VERSION); } catch (Exception e) { Log.WARNING($"エラーが発生しました。新しく作り直します。[{e.Message}]"); #region " DBファイルを削除 " //---------------- try { File.Delete(ユーザDBファイルパス.数なしパス); // ファイルがない場合には例外は出ない } catch (Exception e2) { var msg = $"ユーザデータベースファイルの削除に失敗しました。[{ユーザDBファイルパス.変数付きパス}][{VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )}]"; Log.ERROR(msg); throw new Exception(msg, e2); // どうしようもないので例外発出 } //---------------- #endregion this.Open(ユーザDBファイルパス, VERSION); } }
private void _ユーザデータベースを初期化する() { // 利用者を終了する。 App進行描画.ユーザ管理?.Dispose(); // ファイルを削除する。 var vpath = UserDB.ユーザDBファイルパス; try { File.Delete(vpath.数なしパス); // ファイルがない場合には例外は出ない } catch (Exception e) { Log.ERROR($"ユーザデータベースファイルの削除に失敗しました。[{vpath.変数付きパス}][{VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )}]"); } // 再生成する。 App進行描画.ユーザ管理を再構築する(); App進行描画.ユーザ管理.ユーザリスト.SelectItem((user) => (user.ユーザID == "AutoPlayer")); // ひとまずAutoPlayerを選択。 }
// 初期化 private void _システム設定を初期化する() { // ファイルを削除する。 var vpath = システム設定.システム設定ファイルパス; try { File.Delete(vpath.数なしパス); // ファイルがない場合には例外は出ない } catch (Exception e) { Log.ERROR($"システム設定ファイルの削除に失敗しました。[{vpath.変数付きパス}][{VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )}]"); } // 再生成する。 App進行描画.システム設定 = システム設定.読み込む(); // ファイルがない場合、新規に作られる }
private void _曲データベースを初期化する() { // 利用者を終了。 App進行描画.曲ツリー?.Dispose(); // ファイルを削除する。 var vpath = SongDB.曲DBファイルパス; try { File.Delete(vpath.数なしパス); // ファイルがない場合には例外は出ない } catch (Exception e) { Log.ERROR($"曲データベースファイルの削除に失敗しました。[{vpath.変数付きパス}][{VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )}]"); } // 再構築は各自で。 }
/// <summary> /// 指定した曲ファイルに対応するレコードがデータベースになければレコードを追加し、 /// あればそのレコードを更新する。 /// </summary> public static void 曲を追加または更新する(VariablePath 曲ファイルパス, ユーザ設定 ユーザ設定) { try { using (var songdb = new SongDB()) { var 一パス検索クエリ = songdb.Songs.Where((song) => (song.Path == 曲ファイルパス.数なしパス)); if (0 == 一パス検索クエリ.Count()) { // (A) 同一パスを持つレコードがDBになかった var 調べる曲のハッシュ = _ファイルのハッシュを算出して返す(曲ファイルパス); var 一ハッシュレコード = songdb.Songs.Where((song) => (song.HashId == 調べる曲のハッシュ)).SingleOrDefault(); if (null == 一ハッシュレコード) { #region " (A-a) 同一ハッシュを持つレコードがDBになかった → 新規追加 " //---------------- var score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); // Songs レコード新規追加。 var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); songdb.Songs.InsertOnSubmit( new Song() { HashId = _ファイルのハッシュを算出して返す(曲ファイルパス), Title = score.曲名, Path = 曲ファイルパス.数なしパス, LastWriteTime = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"), Level = score.難易度, MinBPM = BPMs.最小BPM, MaxBPM = BPMs.最大BPM, TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCymbal], TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat], TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot], TotalNotes_Snare = ノーツ数[表示レーン種別.Snare], TotalNotes_Bass = ノーツ数[表示レーン種別.Bass], TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1], TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2], TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3], TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCymbal], PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : "", Artist = score.アーティスト名, PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : "", BGMAdjust = 0, }); songdb.DataContext.SubmitChanges(); Log.Info($"DBに曲を追加しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } else { #region " (A-b) 同一ハッシュを持つレコードがDBにあった → 更新 " //---------------- var 拡張子名 = Path.GetExtension(曲ファイルパス.数なしパス); var score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); // Songs レコード更新。 var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); var song = 一ハッシュレコード; song.Title = score.曲名; song.Path = 曲ファイルパス.数なしパス; song.LastWriteTime = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"); song.Level = score.難易度; song.MinBPM = BPMs.最小BPM; song.MaxBPM = BPMs.最大BPM; song.TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCymbal]; song.TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat]; song.TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot]; song.TotalNotes_Snare = ノーツ数[表示レーン種別.Snare]; song.TotalNotes_Bass = ノーツ数[表示レーン種別.Bass]; song.TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1]; song.TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2]; song.TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3]; song.TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCymbal]; song.PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : ""; song.Artist = score.アーティスト名; song.PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : ""; song.BGMAdjust = song.BGMAdjust; songdb.DataContext.SubmitChanges(); Log.Info($"パスが異なりハッシュが同一であるレコードが検出されたため、曲の情報を更新しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } } else { // (B) 同一パスを持つレコードがDBにあった var record = 一パス検索クエリ.Single(); string レコードの最終更新日時 = record.LastWriteTime; string 調べる曲の最終更新日時 = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"); if (レコードの最終更新日時 != 調べる曲の最終更新日時) { #region " (B-a) 最終更新日時が変更されている → 更新 " //---------------- var score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); var hash = _ファイルのハッシュを算出して返す(曲ファイルパス); var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); // HashId 以外のカラムを更新する。 record.Title = score.曲名; record.LastWriteTime = 調べる曲の最終更新日時; record.Level = score.難易度; record.MinBPM = BPMs.最小BPM; record.MaxBPM = BPMs.最大BPM; record.TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCymbal]; record.TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat]; record.TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot]; record.TotalNotes_Snare = ノーツ数[表示レーン種別.Snare]; record.TotalNotes_Bass = ノーツ数[表示レーン種別.Bass]; record.TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1]; record.TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2]; record.TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3]; record.TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCymbal]; record.PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : ""; record.Artist = score.アーティスト名; record.PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : ""; record.BGMAdjust = record.BGMAdjust; if (hash != record.HashId) { // ハッシュはキーなので、これが変わったら、古いレコードを削除して、新しいレコードを追加する。 var newRecord = record.Clone(); songdb.Songs.DeleteOnSubmit(record); songdb.DataContext.SubmitChanges(); // 一度Submitして先にレコード削除を確定しないと、次のInsertがエラーになる。(PathカラムはUnique属性なので) newRecord.HashId = hash; songdb.Songs.InsertOnSubmit(newRecord); } songdb.DataContext.SubmitChanges(); Log.Info($"最終更新日時が変更されているため、曲の情報を更新しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } else { #region " (B-b) それ以外 " //---------------- //---------------- #endregion } } } } catch (Exception e) { Log.ERROR($"曲DBへの曲の追加に失敗しました。({VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )})[{曲ファイルパス.変数付きパス}]"); //throw; } }