예제 #1
0
파일: UserDB.cs 프로젝트: zoujuny/DTXMania2
        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);
            }
        }
예제 #2
0
        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を選択。
        }
예제 #3
0
        // 初期化


        private void _システム設定を初期化する()
        {
            // ファイルを削除する。

            var vpath = システム設定.システム設定ファイルパス;

            try
            {
                File.Delete(vpath.数なしパス);     // ファイルがない場合には例外は出ない
            }
            catch (Exception e)
            {
                Log.ERROR($"システム設定ファイルの削除に失敗しました。[{vpath.変数付きパス}][{VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )}]");
            }


            // 再生成する。

            App進行描画.システム設定 = システム設定.読み込む(); // ファイルがない場合、新規に作られる
        }
예제 #4
0
        private void _曲データベースを初期化する()
        {
            // 利用者を終了。

            App進行描画.曲ツリー?.Dispose();


            // ファイルを削除する。

            var vpath = SongDB.曲DBファイルパス;

            try
            {
                File.Delete(vpath.数なしパス);     // ファイルがない場合には例外は出ない
            }
            catch (Exception e)
            {
                Log.ERROR($"曲データベースファイルの削除に失敗しました。[{vpath.変数付きパス}][{VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )}]");
            }


            // 再構築は各自で。
        }
예제 #5
0
파일: 曲DB.cs 프로젝트: zoujuny/DTXMania2
        /// <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;
            }
        }