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];
public static void 最新版にバージョンアップする() { using var _ = new LogBlock(Log.現在のメソッド名); using var db = new ScoreDB(); int version = (int)db.UserVersion; // v007 から、SognDB.sqlite3 が ScoreDB.sqlire3 に改名された。 var songdbPath = new VariablePath(@"$(AppData)\SongDB.sqlite3"); using var songdb = File.Exists(songdbPath.数なしパス) ? new SQLiteDB(songdbPath.数なしパス) : null; // なければ null int songdb_version = (int)(songdb?.UserVersion ?? -1); // なければ負数 while (version < ScoreDBRecord.VERSION) { switch (version) { case 0: { #region " 0 → 最新版 " //---------------- // ScoreDB.sqlite3 に最新版のテーブルを新規に作成する。 foreach (var query in new[] { "PRAGMA foreign_keys = OFF", ScoreDBRecord.GetCreateTableSQL(), "PRAGMA foreign_keys = ON", }) { using var cmd = new SqliteCommand(query, db.Connection); cmd.ExecuteNonQuery(); } if (songdb is null) // SongDB.sqlite3 がある? { version = ScoreDBRecord.VERSION; db.UserVersion = version; break; } // SongDB.sqlite3 が存在するので、データ移行する。 switch (songdb_version) { case 0: case 1: case 2: case 3: case 4: case 5: // 何もしない。1~5 については、REAL 型の数値がすでにずれているため、データ移行しない。 break; case 6: #region " 6 → 最新版 " //---------------- { // ScoreDB 側に、最新バージョンのテーブルを作成する。 foreach (var query in new[] { "PRAGMA foreign_keys = OFF", ScoreDBRecord.GetCreateTableSQL(), }) { using var cmd = new SqliteCommand(query, db.Connection); cmd.ExecuteNonQuery(); } // v006 のレコードを読み込み、v007 テーブルに出力する。DBが違うので注意。 using (var cmdv007Begin = new SqliteCommand("BEGIN", db.Connection)) cmdv007Begin.ExecuteNonQuery(); using var cmdv006query = new SqliteCommand("SELECT * FROM Songs", songdb.Connection); var v006result = cmdv006query.ExecuteReader(); while (v006result.Read()) { var v006rc = new old.SongDBRecord.v006_SongDBRecord(v006result); var v007rc = new ScoreDBRecord() { ScorePath = v006rc.Path, // 以下変更なし。 Title = v006rc.Title, LastWriteTime = v006rc.LastWriteTime, Level = v006rc.Level, MinBPM = v006rc.MinBPM, MaxBPM = v006rc.MaxBPM, TotalNotes_LeftCymbal = v006rc.TotalNotes_LeftCymbal, TotalNotes_HiHat = v006rc.TotalNotes_HiHat, TotalNotes_LeftPedal = v006rc.TotalNotes_LeftPedal, TotalNotes_Snare = v006rc.TotalNotes_Snare, TotalNotes_Bass = v006rc.TotalNotes_Bass, TotalNotes_HighTom = v006rc.TotalNotes_HighTom, TotalNotes_LowTom = v006rc.TotalNotes_LowTom, TotalNotes_FloorTom = v006rc.TotalNotes_FloorTom, TotalNotes_RightCymbal = v006rc.TotalNotes_RightCymbal, PreImage = v006rc.PreImage, Artist = v006rc.Artist, PreSound = v006rc.PreSound, BGMAdjust = v006rc.BGMAdjust, }; v007rc.ReplaceTo(db); } using (var cmdv007End = new SqliteCommand("END", db.Connection)) cmdv007End.ExecuteNonQuery(); using (var cmdKeysOn = new SqliteCommand("PRAGMA foreign_keys = ON", db.Connection)) cmdKeysOn.ExecuteNonQuery(); version = ScoreDBRecord.VERSION; db.UserVersion = version; Log.Info($"ScoreDB をバージョン {version} に更新しました。"); } //---------------- #endregion break; } break; //---------------- #endregion } case 1: case 2: case 3: case 4: case 5: { #region " 1~5 → 6(BreakingChange)" //---------------- // テーブルを作り直す。REAL値が既にずれてるので、データ移行はしない。 foreach (var query in new[] { "PRAGMA foreign_keys = OFF", "DROP TABLE Songs", $"CREATE TABLE Songs {old.SongDBRecord.v006_SongDBRecord.ColumnList}", "PRAGMA foreign_keys = ON", }) { using var cmd = new SqliteCommand(query, db.Connection); cmd.ExecuteNonQuery(); } version = old.SongDBRecord.v006_SongDBRecord.VERSION; db.UserVersion = version; Log.Info($"SongDB をバージョン {version} に更新しました。"); break; //---------------- #endregion } } } }