Esempio n. 1
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
            }
        }
Esempio n. 2
0
        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
            }
        }