public static void 最新版にバージョンアップする()
        {
            using var _ = new LogBlock(Log.現在のメソッド名);

            // Records レコードは、UserDB(v12)からRecordDBに分離された。
            // ・UserDB v011 までは、UserDB の Records テーブルに格納されている。RecordDB.Records テーブルのレコードのバージョンは v001~v006(全部同一)。
            // ・UserDB v012 以降は、UserDB から独立して、RecordDB.Records テーブルに格納される。Recordsのレコードのバージョンは v007。

            if (File.Exists(RecordDBPath.数なしパス))
            {
                #region " (A) RecordDB.sqlite3 が存在している → 最新版にバージョンアップ。"
                //----------------
                using var recorddb = new RecordDB();
                int version = (int)recorddb.UserVersion;
                while (version < RecordDBRecord.VERSION)
                {
                    // RecordDB は v007 から。
                    switch (version)
                    {
                    case 0:     // 念のため(あったら無限ループになるため)
                    {
                        #region " 0 → 最新版 "
                        //----------------
                        // テーブルを新規に作る。
                        foreach (var query in new[] {
                                "PRAGMA foreign_keys = OFF",
                                RecordDBRecord.GetCreateTableSQL(),
                                "PRAGMA foreign_keys = ON"
                            })
                        {
                            using var cmd = new SqliteCommand(query, recorddb.Connection);
                            cmd.ExecuteNonQuery();
                        }
                        version = RecordDBRecord.VERSION;
                        recorddb.UserVersion = version;
                        Log.Info($"RecordDB をバージョン {version} を作成しました。");
                        break;
                        //----------------
                        #endregion
                    }

                    case 7:
                    {
                        #region " 7 → 8 "
                        //----------------
                        // テーブルを作り直す。REAL値が既にずれてるので、データ移行はしない。
                        foreach (var query in new[] {
                                "PRAGMA foreign_keys = OFF",
                                "DROP TABLE Records",
                                $"CREATE TABLE Records {old.RecordDBRecord.v008_RecordDBRecord.ColumnList}",
                                "PRAGMA foreign_keys = ON"
                            })
                        {
                            using var cmd = new SqliteCommand(query, recorddb.Connection);
                            cmd.ExecuteNonQuery();
                        }
                        version = old.RecordDBRecord.v008_RecordDBRecord.VERSION;
                        recorddb.UserVersion = version;
                        Log.Info($"RecordDB をバージョン {version} に更新しました。データ移行はしません。");
                        break;
                        //----------------
                        #endregion
                    }

                    case 8:
                    {
                        #region " 8 → 最新版 "
                        //----------------
                        // テーブルを作り直す。今までの成績は消失する。
                        foreach (var query in new[] {
                                "PRAGMA foreign_keys = OFF",
                                "DROP TABLE Records",
                                RecordDBRecord.GetCreateTableSQL(),
                                "PRAGMA foreign_keys = ON"
                            })
                        {
                            using var cmd = new SqliteCommand(query, recorddb.Connection);
                            cmd.ExecuteNonQuery();
                        }
                        version = RecordDBRecord.VERSION;
                        recorddb.UserVersion = version;
                        Log.Info($"RecordDB をバージョン {version} に更新しました。データ移行はしません。");
                        break;
                        //----------------
                        #endregion
                    }
                    }
                }
                //----------------
                #endregion
            }
            else
            {
                #region " (B) RecordDB.sqlite3 が存在しない → 何もしない "
                //----------------
                // UserDB 側の Update で RecordDB.sqlite3 が生成されるのを待つ。
                //----------------
                #endregion
            }
        }
Exemple #2
0
        /// <summary>
        ///     ユーザDBファイルを最新版に更新する。
        /// </summary>
        /// <remarks>
        ///     v012 移行にバージョンアップする場合は、RecordDB.sqlite3 の生成も行う。
        /// </remarks>
        public static void 最新版にバージョンアップする()
        {
            using var _ = new LogBlock(Log.現在のメソッド名);

            var userdbPath = new VariablePath(@"$(AppData)\UserDB.sqlite3");
            var userYamls  = Directory.EnumerateFiles(
                path: Folder.フォルダ変数の内容を返す("AppData"),
                searchPattern: @"User_*.yaml",
                searchOption: SearchOption.TopDirectoryOnly);

            if (0 < userYamls.Count())
            {
                #region " (A) User_*.yaml が存在している "
                //----------------
                // それらを最新版にバージョンアップする。
                foreach (var userYaml in userYamls)
                {
                    _Yamlを最新版にバージョンアップする(userYaml);
                }
                //----------------
                #endregion
            }
            else if (File.Exists(userdbPath.数なしパス))
            {
                #region " (B) User_*.yaml が存在せず UserDB.sqlite3 が存在している "
                //----------------
                // Records レコードは、UserDB(v12)からRecordDBに分離された。
                // ・UserDB v011 までは、UserDB の Records テーブルに格納されている。RecordDB.Records テーブルのレコードのバージョンは v001~v006(全部同一)。
                // ・UserDB v012 以降は、UserDB から独立して、RecordDB.Records テーブルに格納される。Recordsのレコードのバージョンは v007。

                var Users = new List <UserConfig>();
                int userdb_version;

                #region " Users テーブルを最新版にして読み込む。"
                //----------------
                using (var userdb = new SQLiteDB(userdbPath.数なしパス))
                {
                    userdb_version     = (int)userdb.UserVersion;
                    using var idsQuery = new SqliteCommand("SELECT * FROM Users", userdb.Connection);
                    var ids = idsQuery.ExecuteReader();
                    while (ids.Read())
                    {
                        Users.Add(new UserConfig(ids));
                    }
                }
                //----------------
                #endregion

                #region " Users テーブルを User_*.yaml に出力する。"
                //----------------
                foreach (var user in Users)
                {
                    user.保存する();
                }
                //----------------
                #endregion

                #region " RecordDB.sqlite3 がなければ新規作成する。"
                //----------------
                if (!File.Exists(RecordDB.RecordDBPath.数なしパス))
                {
                    using var recorddb = new RecordDB();   // ファイルがなければ新規作成される
                    using var cmd      = new SqliteCommand($"CREATE TABLE Records { old.RecordDBRecord.v007_RecordDBRecord.ColumnList}", recorddb.Connection);
                    cmd.ExecuteNonQuery();
                    recorddb.UserVersion = old.RecordDBRecord.v007_RecordDBRecord.VERSION;
                    Log.Info($"RecordDB(v007) を生成しました。");
                }
                //----------------
                #endregion

                if (12 > userdb_version)
                {
                    #region " UserDB.Rcords テーブルを読み込み、RecordDB.Records テーブルへ出力する。"
                    //----------------
                    using var userdb   = new SQLiteDB(userdbPath.数なしパス);
                    using var recorddb = new RecordDB();
                    foreach (var user in Users)
                    {
                        using var recordsQuery = new SqliteCommand($"SELECT * FROM Records WHERE Id = @UserId", userdb.Connection);
                        recordsQuery.Parameters.Add(new SqliteParameter("@UserId", user.Id));
                        var records = recordsQuery.ExecuteReader();
                        while (records.Read())
                        {
                            var record = new old.RecordDBRecord.v007_RecordDBRecord(records);      // 読み込んで
                            record.InsertTo(recorddb);                                             // 書き込む
                        }
                    }
                    //----------------
                    #endregion
                }
                //----------------
                #endregion
            }
            else
            {
                #region " (C) User_*.yamlも UserDB.sqlite3 も存在しない "
                //----------------

                #region " 新規に User_*.yaml を生成する。"
                //----------------
                var autoPlayer = new UserConfig()
                {
                    Id   = "AutoPlayer",
                    Name = "AutoPlayer",
                    AutoPlay_LeftCymbal  = 1,
                    AutoPlay_HiHat       = 1,
                    AutoPlay_LeftPedal   = 1,
                    AutoPlay_Snare       = 1,
                    AutoPlay_Bass        = 1,
                    AutoPlay_HighTom     = 1,
                    AutoPlay_LowTom      = 1,
                    AutoPlay_FloorTom    = 1,
                    AutoPlay_RightCymbal = 1,
                    // 他は既定値
                };
                autoPlayer.保存する();

                var guest = new UserConfig()
                {
                    Id   = "Guest",
                    Name = "Guest",
                    // 他は既定値
                };
                guest.保存する();
                //----------------
                #endregion

                #region " 新規に RecordDB.sqlite3 を生成する。"
                //----------------
                var recorddbPath = new VariablePath(@"$(AppData)\RecordDB.sqlite3");

                // 念のため
                if (File.Exists(recorddbPath.数なしパス))
                {
                    File.Delete(recorddbPath.数なしパス);
                }

                using var recorddb = new SQLiteDB(recorddbPath.数なしパス);    // ファイルがなければ新規生成される。
                using var cmd      = new SqliteCommand(RecordDBRecord.GetCreateTableSQL(), recorddb.Connection);
                cmd.ExecuteNonQuery();
                recorddb.UserVersion = RecordDBRecord.VERSION;

                Log.Info($"RecordDB を生成しました。");
                //----------------
                #endregion

                //----------------
                #endregion
            }
        }
Exemple #3
0
        private void _進行描画のメインループを実行する(App app, IntPtr hWindow)
        {
            try
            {
                #region " 初期化 "
                //----------------
                this._パイプラインサーバを起動する();

                UserConfig.最新版にバージョンアップする();
                ScoreDB.最新版にバージョンアップする();
                RecordDB.最新版にバージョンアップする();
                ScorePropertiesDB.最新版にバージョンアップする();

                Global.生成する(
                    app,
                    hWindow,
                    設計画面サイズ: new SharpDX.Size2F(1920f, 1080f),
                    物理画面サイズ: new SharpDX.Size2F(this.ClientSize.Width, this.ClientSize.Height));

                画像.全インスタンスで共有するリソースを作成する(Global.GraphicResources.D3D11Device1, @"$(Images)\TextureVS.cso", @"$(Images)\TexturePS.cso");

                this.システムサウンド = new システムサウンド(this.サウンドデバイス);    // 個々のサウンドの生成は後工程で。

                this.ドラムサウンド = new ドラムサウンド(this.サウンドデバイス);      //       〃

                this.WAVキャッシュ = new CacheStore <CSCore.ISampleSource>()
                {
                    ファイルからデータを生成する = (path) => SampleSourceFactory.Create(this.サウンドデバイス, path, this.ログオン中のユーザ.再生速度),
                };

                this._ユーザリストにユーザを登録する();

                this.アイキャッチ管理 = new アイキャッチ管理();

                this.ドラム入力 = new ドラム入力(this.KeyboardHID, this.GameControllersHID, this.MidiIns);


                // 最初のステージを生成する。

                Log.Header("起動ステージ");
                this.ステージ = new 起動.起動ステージ();
                //----------------
                #endregion

                var         スワップチェーン表示タスク = new PresentSwapChainVSync();
                var         tick          = new ManualResetEvent(false);
                TaskMessage?終了指示メッセージ     = null;

                while (true)
                {
                    tick.WaitOne(1);

                    #region " 自分宛のメッセージが届いていたら、すべて処理する。"
                    //----------------
                    foreach (var msg in Global.TaskMessageQueue.Get(TaskMessage.タスク名.進行描画))
                    {
                        switch (msg.内容)
                        {
                        case TaskMessage.内容名.終了指示:
                            終了指示メッセージ = msg;
                            break;

                        case TaskMessage.内容名.サイズ変更:
                        {
                            var newSize = (System.Drawing.Size)msg.引数 ![0];