/// <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 } }
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 } }