diff --git a/Qwilight/System/DB.cs b/Qwilight/System/DB.cs index 563a62c..cdc7692 100644 --- a/Qwilight/System/DB.cs +++ b/Qwilight/System/DB.cs @@ -31,7 +31,7 @@ public static readonly DB Instance = QwilightComponent.GetBuiltInData(nameof(DB)); - readonly ReaderWriterLockSlim _dbCSX = new(); + readonly object _dbCSX = new(); readonly object _setSaveCSX = new(); SqliteConnection _fastDB; SqliteConnection _fileDB; @@ -53,7 +53,7 @@ try { LoadImpl(); - var dbStatement = NewDBStatement("PRAGMA integrity_check"); + using var dbStatement = new SqliteCommand("PRAGMA integrity_check", _fastDB); using var rows = dbStatement.ExecuteReader(); if (rows.Read()) { @@ -80,15 +80,15 @@ Compatible.Compatible.DB(_fastDB); #endregion - HandleStatements(t => + HandleStatementUnit(t => { #region 데이터베이스 정보 Date date; - using (var dbStatement = NewDBStatement("PRAGMA user_version", t)) + using (var dbStatement = new SqliteCommand("PRAGMA user_version", _fastDB, t)) { date = (Date)dbStatement.ExecuteScalar(); } - using (var dbStatement = NewDBStatement($"PRAGMA user_version = {((long)LatestDBDate)}", t)) + using (var dbStatement = new SqliteCommand($"PRAGMA user_version = {((long)LatestDBDate)}", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -97,7 +97,7 @@ #region 오프라인 기록 if (date < Date.DB_1_16_17) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_comment ( Date DATE, Event_Note_ID TEXT, @@ -156,40 +156,40 @@ Is_Paused INTEGER DEFAULT 0, Input_Flags INTEGER DEFAULT 0 ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("comment", t)) { // Input_Favor_Labelled_Millis - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_comment(Date, Event_Note_ID, Comment, Name, Multiplier, Auto_Mode, Note_Salt_Mode, Audio_Multiplier, Faint_Note_Mode, Judgment_Mode, Hit_Points_Mode, Note_Mobility_Mode, Long_Note_Mode, Input_Favor_Mode, Note_Modify_Mode, BPM_Mode, Wave_Mode, Set_Note_Mode, Lowest_Judgment_Condition_Mode, Stand, Band, Is_Band1, Point, Salt, Highest_Judgment_0, Higher_Judgment_0, High_Judgment_0, Low_Judgment_0, Lower_Judgment_0, Lowest_Judgment_0, Highest_Judgment_1, Higher_Judgment_1, High_Judgment_1, Low_Judgment_1, Lower_Judgment_1, Lowest_Judgment_1, Lowest_Long_Note_Modify, Highest_Long_Note_Modify, Set_Note_Put, Set_Note_Put_Millis, Highest_Hit_Points_0, Higher_Hit_Points_0, High_Hit_Points_0, Low_Hit_Points_0, Lower_Hit_Points_0, Lowest_Hit_Points_0, Highest_Hit_Points_1, Higher_Hit_Points_1, High_Hit_Points_1, Low_Hit_Points_1, Lower_Hit_Points_1, Lowest_Hit_Points_1, Note_ID, Is_Paused, Input_Flags) SELECT * FROM comment - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE comment", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE comment", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_comment RENAME TO comment - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE INDEX IF NOT EXISTS _comment ON comment ( Note_ID, Event_Note_ID ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -199,36 +199,36 @@ #region 폴더의 선택된 노트 파일 if (date < Date.DB_1_16_9) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_entry ( Entry_Path VARCHAR(260), Note_Position INTEGER, PRIMARY KEY (Entry_Path) ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("entry", t)) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_entry SELECT * FROM entry - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE entry", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE entry", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_entry RENAME TO entry - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -238,43 +238,43 @@ #region 컬렉션 if (date < Date.DB_1_16_9) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_favorite_entry ( Note_ID VARCHAR(139), Favorite_Entry TEXT ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("favorite_entry", t)) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_favorite_entry SELECT * FROM favorite_entry - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE favorite_entry", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE favorite_entry", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_favorite_entry RENAME TO favorite_entry - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE INDEX IF NOT EXISTS _favorite_entry ON favorite_entry ( Note_ID ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -284,36 +284,36 @@ #region 클리어 램프 if (date < Date.DB_1_16_9) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_handled ( Note_ID VARCHAR(137), Handled INTEGER, PRIMARY KEY (Note_ID) ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("handled", t)) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_handled SELECT * FROM handled - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE handled", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE handled", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_handled RENAME TO handled - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -323,45 +323,45 @@ #region 클리어 시간들 (플레이 카운트, 마지막 플레이 정렬) if (date < Date.DB_1_16_9) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_date ( Note_ID VARCHAR(139), Event_Note_ID TEXT, Date DATE ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("date", t)) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_date SELECT * FROM date - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE date", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE date", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_date RENAME TO date - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE INDEX IF NOT EXISTS _date ON date ( Note_ID, Event_Note_ID ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -371,7 +371,7 @@ #region 노트 파일 설정 (오디오 레이턴시, BGA 레이턴시, BGA 활성화) if (date < Date.DB_1_16_15) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_wait ( Note_ID VARCHAR(139), Audio_Wait REAL, @@ -379,30 +379,30 @@ Media LONG DEFAULT 1, PRIMARY KEY (Note_ID) ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("wait", t)) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_wait SELECT * FROM wait - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE wait", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE wait", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_wait RENAME TO wait - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -412,36 +412,36 @@ #region 텍스트 인코딩 if (date < Date.DB_1_16_9) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_format ( Note_ID VARCHAR(139), Format LONG DEFAULT -1, PRIMARY KEY (Note_ID) ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("format", t)) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_format SELECT * FROM format - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE format", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE format", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_format RENAME TO format - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -451,7 +451,7 @@ #region 코스 if (date < Date.DB_1_16_15) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_event_note ( Event_Note_ID TEXT, Name TEXT, @@ -459,30 +459,30 @@ Variety INTEGER DEFAULT 0, PRIMARY KEY (Event_Note_ID, Variety) ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("event_note", t)) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_event_note SELECT * FROM event_note - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE event_note", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE event_note", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_event_note RENAME TO event_note - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -492,7 +492,7 @@ #region 코스 캐시 if (date < Date.DB_1_16_9) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" CREATE TABLE IF NOT EXISTS tmp_event_note_data ( Note_ID VARCHAR(139), Note_Variety INTEGER, @@ -503,30 +503,30 @@ Genre TEXT, PRIMARY KEY (Note_ID) ) - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } if (HasTable("event_note_data", t)) { - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" INSERT INTO tmp_event_note_data SELECT * FROM event_note_data - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } - using (var dbStatement = NewDBStatement("DROP TABLE event_note_data", t)) + using (var dbStatement = new SqliteCommand("DROP TABLE event_note_data", _fastDB, t)) { dbStatement.ExecuteNonQuery(); } } - using (var dbStatement = NewDBStatement(""" + using (var dbStatement = new SqliteCommand(""" ALTER TABLE tmp_event_note_data RENAME TO event_note_data - """, t)) + """, _fastDB, t)) { dbStatement.ExecuteNonQuery(); } @@ -535,11 +535,11 @@ bool HasTable(string tableName, SqliteTransaction t) { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" SELECT name FROM sqlite_master WHERE type = "table" AND name = @tableName - """, t); + """, _fastDB, t); dbStatement.Parameters.AddWithValue("tableName", tableName); return dbStatement.ExecuteScalar() != null; } @@ -559,113 +559,116 @@ public ICollection GetCommentItems(BaseNoteFile noteFile, string eventNoteID, int noteFileCount) { var commentItems = new List(); - var dbStatement = NewDBStatement($""" - SELECT Date, Comment, Name, Multiplier, Auto_Mode, Note_Salt_Mode, Audio_Multiplier, Faint_Note_Mode, Judgment_Mode, Hit_Points_Mode, Note_Mobility_Mode, Long_Note_Mode, Input_Favor_Mode, Note_Modify_Mode, BPM_Mode, Wave_Mode, Set_Note_Mode, Lowest_Judgment_Condition_Mode, Stand, Band, Is_Band1, Point, Salt, Highest_Judgment_0, Higher_Judgment_0, High_Judgment_0, Low_Judgment_0, Lower_Judgment_0, Lowest_Judgment_0, Highest_Judgment_1, Higher_Judgment_1, High_Judgment_1, Low_Judgment_1, Lower_Judgment_1, Lowest_Judgment_1, Input_Favor_Labelled_Millis, Lowest_Long_Note_Modify, Highest_Long_Note_Modify, Set_Note_Put, Set_Note_Put_Millis, Highest_Hit_Points_0, Higher_Hit_Points_0, High_Hit_Points_0, Low_Hit_Points_0, Lower_Hit_Points_0, Lowest_Hit_Points_0, Highest_Hit_Points_1, Higher_Hit_Points_1, High_Hit_Points_1, Low_Hit_Points_1, Lower_Hit_Points_1, Lowest_Hit_Points_1, Is_Paused, Input_Flags - FROM comment - WHERE {(string.IsNullOrEmpty(eventNoteID) ? "Note_ID = @noteID" : "Event_Note_ID = @eventNoteID")} - ORDER BY Stand DESC - LIMIT 50 - """); - if (string.IsNullOrEmpty(eventNoteID)) - { - dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); - } - else - { - dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID); - } var commentPlace = 0; - using var rows = dbStatement.ExecuteReader(); - while (rows.Read()) + HandleCSX(() => { - var date = rows.GetDateTime("Date"); - var sentMultiplier = rows.GetDouble("Multiplier"); - var audioMultiplier = Math.Round(rows.GetDouble("Audio_Multiplier"), 2); - commentItems.Add(new(string.Empty, ++commentPlace, string.Empty, (DefaultCompute.InputFlag)rows.GetInt32("Input_Flags")) + using var dbStatement = new SqliteCommand($""" + SELECT Date, Comment, Name, Multiplier, Auto_Mode, Note_Salt_Mode, Audio_Multiplier, Faint_Note_Mode, Judgment_Mode, Hit_Points_Mode, Note_Mobility_Mode, Long_Note_Mode, Input_Favor_Mode, Note_Modify_Mode, BPM_Mode, Wave_Mode, Set_Note_Mode, Lowest_Judgment_Condition_Mode, Stand, Band, Is_Band1, Point, Salt, Highest_Judgment_0, Higher_Judgment_0, High_Judgment_0, Low_Judgment_0, Lower_Judgment_0, Lowest_Judgment_0, Highest_Judgment_1, Higher_Judgment_1, High_Judgment_1, Low_Judgment_1, Lower_Judgment_1, Lowest_Judgment_1, Input_Favor_Labelled_Millis, Lowest_Long_Note_Modify, Highest_Long_Note_Modify, Set_Note_Put, Set_Note_Put_Millis, Highest_Hit_Points_0, Higher_Hit_Points_0, High_Hit_Points_0, Low_Hit_Points_0, Lower_Hit_Points_0, Lowest_Hit_Points_0, Highest_Hit_Points_1, Higher_Hit_Points_1, High_Hit_Points_1, Low_Hit_Points_1, Lower_Hit_Points_1, Lowest_Hit_Points_1, Is_Paused, Input_Flags + FROM comment + WHERE {(string.IsNullOrEmpty(eventNoteID) ? "Note_ID = @noteID" : "Event_Note_ID = @eventNoteID")} + ORDER BY Stand DESC + LIMIT 50 + """, _fastDB); + if (string.IsNullOrEmpty(eventNoteID)) { - NoteFileCount = noteFileCount, - Date = date, - DateText = Utility.GetDateText(date), - CommentID = rows.GetString("Comment"), - AvatarName = rows.GetString("Name"), - ModeComponentValue = new() + dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); + } + else + { + dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID); + } + using var rows = dbStatement.ExecuteReader(); + while (rows.Read()) + { + var date = rows.GetDateTime("Date"); + var sentMultiplier = rows.GetDouble("Multiplier"); + var audioMultiplier = Math.Round(rows.GetDouble("Audio_Multiplier"), 2); + commentItems.Add(new(string.Empty, ++commentPlace, string.Empty, (DefaultCompute.InputFlag)rows.GetInt32("Input_Flags")) { - CanModifyMultiplier = false, - CanModifyAudioMultiplier = false, - ComputingValue = noteFile, - SentMultiplier = sentMultiplier, - MultiplierValue = noteFile.BPM * audioMultiplier * sentMultiplier, - AutoModeValue = (ModeComponent.AutoMode)rows.GetInt32("Auto_Mode"), - NoteSaltModeValue = (ModeComponent.NoteSaltMode)rows.GetInt32("Note_Salt_Mode"), - AudioMultiplier = audioMultiplier, - FaintNoteModeValue = (ModeComponent.FaintNoteMode)rows.GetInt32("Faint_Note_Mode"), - JudgmentModeValue = (ModeComponent.JudgmentMode)rows.GetInt32("Judgment_Mode"), - HitPointsModeValue = (ModeComponent.HitPointsMode)rows.GetInt32("Hit_Points_Mode"), - NoteMobilityModeValue = (ModeComponent.NoteMobilityMode)rows.GetInt32("Note_Mobility_Mode"), - LongNoteModeValue = (ModeComponent.LongNoteMode)rows.GetInt32("Long_Note_Mode"), - InputFavorModeValue = (ModeComponent.InputFavorMode)rows.GetInt32("Input_Favor_Mode"), - NoteModifyModeValue = (ModeComponent.NoteModifyMode)rows.GetInt32("Note_Modify_Mode"), - BPMModeValue = (ModeComponent.BPMMode)rows.GetInt32("BPM_Mode"), - WaveModeValue = (ModeComponent.WaveMode)rows.GetInt32("Wave_Mode"), - SetNoteModeValue = (ModeComponent.SetNoteMode)rows.GetInt32("Set_Note_Mode"), - LowestJudgmentConditionModeValue = (ModeComponent.LowestJudgmentConditionMode)rows.GetInt32("Lowest_Judgment_Condition_Mode"), - Salt = rows.GetInt32("Salt"), - HighestJudgment0 = rows.GetDouble("Highest_Judgment_0"), - HigherJudgment0 = rows.GetDouble("Higher_Judgment_0"), - HighJudgment0 = rows.GetDouble("High_Judgment_0"), - LowJudgment0 = rows.GetDouble("Low_Judgment_0"), - LowerJudgment0 = rows.GetDouble("Lower_Judgment_0"), - LowestJudgment0 = rows.GetDouble("Lowest_Judgment_0"), - HighestJudgment1 = rows.GetDouble("Highest_Judgment_1"), - HigherJudgment1 = rows.GetDouble("Higher_Judgment_1"), - HighJudgment1 = rows.GetDouble("High_Judgment_1"), - LowJudgment1 = rows.GetDouble("Low_Judgment_1"), - LowerJudgment1 = rows.GetDouble("Lower_Judgment_1"), - LowestJudgment1 = rows.GetDouble("Lowest_Judgment_1"), - InputFavorLabelledMillis = rows.GetDouble("Input_Favor_Labelled_Millis"), - LowestLongNoteModify = rows.GetDouble("Lowest_Long_Note_Modify"), - HighestLongNoteModify = rows.GetDouble("Highest_Long_Note_Modify"), - SetNotePut = rows.GetDouble("Set_Note_Put"), - SetNotePutMillis = rows.GetDouble("Set_Note_Put_Millis"), - HighestHitPoints0 = 100.0 * rows.GetDouble("Highest_Hit_Points_0"), - HigherHitPoints0 = 100.0 * rows.GetDouble("Higher_Hit_Points_0"), - HighHitPoints0 = 100.0 * rows.GetDouble("High_Hit_Points_0"), - LowHitPoints0 = 100.0 * rows.GetDouble("Low_Hit_Points_0"), - LowerHitPoints0 = 100.0 * rows.GetDouble("Lower_Hit_Points_0"), - LowestHitPoints0 = 100.0 * rows.GetDouble("Lowest_Hit_Points_0"), - HighestHitPoints1 = 100.0 * rows.GetDouble("Highest_Hit_Points_1"), - HigherHitPoints1 = 100.0 * rows.GetDouble("Higher_Hit_Points_1"), - HighHitPoints1 = 100.0 * rows.GetDouble("High_Hit_Points_1"), - LowHitPoints1 = 100.0 * rows.GetDouble("Low_Hit_Points_1"), - LowerHitPoints1 = 100.0 * rows.GetDouble("Lower_Hit_Points_1"), - LowestHitPoints1 = 100.0 * rows.GetDouble("Lowest_Hit_Points_1"), - }, - Stand = rows.GetInt32("Stand"), - Band = rows.GetInt32("Band"), - IsBand1 = rows.GetBoolean("Is_Band1"), - Point = rows.GetDouble("Point"), - IsPaused = rows.GetBoolean("Is_Paused") - }); - } - for (var i = commentItems.Count - 1; i >= 0; --i) - { - commentItems[i].TotalCommentPlaceText = $"/{commentPlace}"; - } + NoteFileCount = noteFileCount, + Date = date, + DateText = Utility.GetDateText(date), + CommentID = rows.GetString("Comment"), + AvatarName = rows.GetString("Name"), + ModeComponentValue = new() + { + CanModifyMultiplier = false, + CanModifyAudioMultiplier = false, + ComputingValue = noteFile, + SentMultiplier = sentMultiplier, + MultiplierValue = noteFile.BPM * audioMultiplier * sentMultiplier, + AutoModeValue = (ModeComponent.AutoMode)rows.GetInt32("Auto_Mode"), + NoteSaltModeValue = (ModeComponent.NoteSaltMode)rows.GetInt32("Note_Salt_Mode"), + AudioMultiplier = audioMultiplier, + FaintNoteModeValue = (ModeComponent.FaintNoteMode)rows.GetInt32("Faint_Note_Mode"), + JudgmentModeValue = (ModeComponent.JudgmentMode)rows.GetInt32("Judgment_Mode"), + HitPointsModeValue = (ModeComponent.HitPointsMode)rows.GetInt32("Hit_Points_Mode"), + NoteMobilityModeValue = (ModeComponent.NoteMobilityMode)rows.GetInt32("Note_Mobility_Mode"), + LongNoteModeValue = (ModeComponent.LongNoteMode)rows.GetInt32("Long_Note_Mode"), + InputFavorModeValue = (ModeComponent.InputFavorMode)rows.GetInt32("Input_Favor_Mode"), + NoteModifyModeValue = (ModeComponent.NoteModifyMode)rows.GetInt32("Note_Modify_Mode"), + BPMModeValue = (ModeComponent.BPMMode)rows.GetInt32("BPM_Mode"), + WaveModeValue = (ModeComponent.WaveMode)rows.GetInt32("Wave_Mode"), + SetNoteModeValue = (ModeComponent.SetNoteMode)rows.GetInt32("Set_Note_Mode"), + LowestJudgmentConditionModeValue = (ModeComponent.LowestJudgmentConditionMode)rows.GetInt32("Lowest_Judgment_Condition_Mode"), + Salt = rows.GetInt32("Salt"), + HighestJudgment0 = rows.GetDouble("Highest_Judgment_0"), + HigherJudgment0 = rows.GetDouble("Higher_Judgment_0"), + HighJudgment0 = rows.GetDouble("High_Judgment_0"), + LowJudgment0 = rows.GetDouble("Low_Judgment_0"), + LowerJudgment0 = rows.GetDouble("Lower_Judgment_0"), + LowestJudgment0 = rows.GetDouble("Lowest_Judgment_0"), + HighestJudgment1 = rows.GetDouble("Highest_Judgment_1"), + HigherJudgment1 = rows.GetDouble("Higher_Judgment_1"), + HighJudgment1 = rows.GetDouble("High_Judgment_1"), + LowJudgment1 = rows.GetDouble("Low_Judgment_1"), + LowerJudgment1 = rows.GetDouble("Lower_Judgment_1"), + LowestJudgment1 = rows.GetDouble("Lowest_Judgment_1"), + InputFavorLabelledMillis = rows.GetDouble("Input_Favor_Labelled_Millis"), + LowestLongNoteModify = rows.GetDouble("Lowest_Long_Note_Modify"), + HighestLongNoteModify = rows.GetDouble("Highest_Long_Note_Modify"), + SetNotePut = rows.GetDouble("Set_Note_Put"), + SetNotePutMillis = rows.GetDouble("Set_Note_Put_Millis"), + HighestHitPoints0 = 100.0 * rows.GetDouble("Highest_Hit_Points_0"), + HigherHitPoints0 = 100.0 * rows.GetDouble("Higher_Hit_Points_0"), + HighHitPoints0 = 100.0 * rows.GetDouble("High_Hit_Points_0"), + LowHitPoints0 = 100.0 * rows.GetDouble("Low_Hit_Points_0"), + LowerHitPoints0 = 100.0 * rows.GetDouble("Lower_Hit_Points_0"), + LowestHitPoints0 = 100.0 * rows.GetDouble("Lowest_Hit_Points_0"), + HighestHitPoints1 = 100.0 * rows.GetDouble("Highest_Hit_Points_1"), + HigherHitPoints1 = 100.0 * rows.GetDouble("Higher_Hit_Points_1"), + HighHitPoints1 = 100.0 * rows.GetDouble("High_Hit_Points_1"), + LowHitPoints1 = 100.0 * rows.GetDouble("Low_Hit_Points_1"), + LowerHitPoints1 = 100.0 * rows.GetDouble("Lower_Hit_Points_1"), + LowestHitPoints1 = 100.0 * rows.GetDouble("Lowest_Hit_Points_1"), + }, + Stand = rows.GetInt32("Stand"), + Band = rows.GetInt32("Band"), + IsBand1 = rows.GetBoolean("Is_Band1"), + Point = rows.GetDouble("Point"), + IsPaused = rows.GetBoolean("Is_Paused") + }); + } + for (var i = commentItems.Count - 1; i >= 0; --i) + { + commentItems[i].TotalCommentPlaceText = $"/{commentPlace}"; + } + }); return commentItems; } - public void SetEventNoteData(ICollection wwwLevelComputingValues) + public void SetEventNoteData(ICollection wwwLevelComputingValues) => HandleStatementUnit(t => { foreach (var wwwLevelComputingValue in wwwLevelComputingValues) { var noteVariety = (BaseNoteFile.NoteVariety)wwwLevelComputingValue.NoteVarietyValue; if (noteVariety != BaseNoteFile.NoteVariety.EventNote) { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" REPLACE INTO event_note_data VALUES(@noteID, @noteVariety, @title, @artist, @level, @levelText, @genre) - """); + """, _fastDB, t); dbStatement.Parameters.AddWithValue("noteID", wwwLevelComputingValue.GetNoteID512()); dbStatement.Parameters.AddWithValue("noteVariety", noteVariety); dbStatement.Parameters.AddWithValue("title", wwwLevelComputingValue.Title); @@ -676,15 +679,15 @@ dbStatement.ExecuteNonQuery(); } } - } + }); - public void GetEventNoteData(string noteID, NotAvailableNoteFile noteFile) + public void GetEventNoteData(string noteID, NotAvailableNoteFile noteFile) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" SELECT Note_Variety, Title, Artist, Level, Level_Text, Genre FROM event_note_data WHERE Note_ID = @noteID - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("noteID", noteID); using var rows = dbStatement.ExecuteReader(); if (rows.Read()) @@ -716,248 +719,257 @@ noteFile.LevelText = "❌"; noteFile.Genre = new('❌', 1 + RandomNumberGenerator.GetInt32(10)); } - } + }); public ICollection GetFavoriteEntryItems(BaseNoteFile noteFile) { var favoriteEntryItems = new List(); - var dbStatement = NewDBStatement(""" - SELECT Favorite_Entry - FROM favorite_entry - WHERE Note_ID = @noteID - """); - dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); - using var rows = dbStatement.ExecuteReader(); - while (rows.Read()) + HandleCSX(() => { - favoriteEntryItems.Add(new DefaultEntryItem + using var dbStatement = new SqliteCommand(""" + SELECT Favorite_Entry + FROM favorite_entry + WHERE Note_ID = @noteID + """, _fastDB); + dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); + using var rows = dbStatement.ExecuteReader(); + while (rows.Read()) { - DefaultEntryVarietyValue = DefaultEntryItem.DefaultEntryVariety.Favorite, - DefaultEntryPath = rows.GetString("Favorite_Entry") - }); - } + favoriteEntryItems.Add(new DefaultEntryItem + { + DefaultEntryVarietyValue = DefaultEntryItem.DefaultEntryVariety.Favorite, + DefaultEntryPath = rows.GetString("Favorite_Entry") + }); + } + }); return favoriteEntryItems; } public ICollection<(string, string, DateTime, EventNoteVariety)> GetEventNotes() { var eventNotes = new List<(string, string, DateTime, EventNoteVariety)>(); - var dbStatement = NewDBStatement(""" - SELECT Event_Note_ID, Name, Date, Variety - FROM event_note - """); - using var rows = dbStatement.ExecuteReader(); - while (rows.Read()) + HandleCSX(() => { - eventNotes.Add((rows.GetString("Event_Note_ID"), rows.GetString("Name"), rows.GetDateTime("Date"), (EventNoteVariety)rows.GetInt32("Variety"))); - } + using var dbStatement = new SqliteCommand(""" + SELECT Event_Note_ID, Name, Date, Variety + FROM event_note + """, _fastDB); + using var rows = dbStatement.ExecuteReader(); + while (rows.Read()) + { + eventNotes.Add((rows.GetString("Event_Note_ID"), rows.GetString("Name"), rows.GetDateTime("Date"), (EventNoteVariety)rows.GetInt32("Variety"))); + } + }); return eventNotes; } - public BaseNoteFile.Handled GetHandled(BaseNoteFile noteFile) + public BaseNoteFile.Handled GetHandled(BaseNoteFile noteFile) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" SELECT Handled FROM handled WHERE Note_ID = @noteID - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); using var rows = dbStatement.ExecuteReader(); return new BaseNoteFile.Handled { IDValue = rows.Read() ? (BaseNoteFile.Handled.ID)rows.GetInt32("Handled") : BaseNoteFile.Handled.ID.Not }; - } + }); - public void SetHandled(BaseNoteFile noteFile) + public void SetHandled(BaseNoteFile noteFile) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" REPLACE INTO handled VALUES(@noteID, @handled) - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); dbStatement.Parameters.AddWithValue("handled", noteFile.HandledValue.IDValue); dbStatement.ExecuteNonQuery(); - } + }); public (DateTime?, int) GetDate(BaseNoteFile noteFile, string eventNoteID) { var date = (null as DateTime?, 0); - var dbStatement = NewDBStatement($""" - SELECT MAX(Date) AS Latest, COUNT(Date) AS Count - FROM date - WHERE {(string.IsNullOrEmpty(eventNoteID) ? "Note_ID = @noteID" : "Event_Note_ID = @eventNoteID")} - """); - if (string.IsNullOrEmpty(eventNoteID)) + HandleCSX(() => { - dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); - } - else - { - dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID); - } - using var rows = dbStatement.ExecuteReader(); - if (rows.Read()) - { - if (!rows.IsDBNull("Latest")) + using var dbStatement = new SqliteCommand($""" + SELECT MAX(Date) AS Latest, COUNT(Date) AS Count + FROM date + WHERE {(string.IsNullOrEmpty(eventNoteID) ? "Note_ID = @noteID" : "Event_Note_ID = @eventNoteID")} + """, _fastDB); + if (string.IsNullOrEmpty(eventNoteID)) { - date.Item1 = rows.GetDateTime("Latest"); + dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); } - if (!rows.IsDBNull("Count")) + else { - date.Item2 = rows.GetInt32("Count"); + dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID); } - } + using var rows = dbStatement.ExecuteReader(); + if (rows.Read()) + { + if (!rows.IsDBNull("Latest")) + { + date.Item1 = rows.GetDateTime("Latest"); + } + if (!rows.IsDBNull("Count")) + { + date.Item2 = rows.GetInt32("Count"); + } + } + }); return date; } - public void NewDate(BaseNoteFile noteFile, string eventNoteID, DateTime date) + public void NewDate(BaseNoteFile noteFile, string eventNoteID, DateTime date) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" INSERT INTO date VALUES(@noteID, @eventNoteID, @date) - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("noteID", noteFile?.GetNoteID512() ?? DBNull.Value as object); dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID ?? DBNull.Value as object); dbStatement.Parameters.AddWithValue("date", date); dbStatement.ExecuteNonQuery(); - } + }); - public int GetNotePosition(string entryPath) + public int GetNotePosition(string entryPath) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" SELECT Note_Position FROM entry WHERE Entry_Path = @entryPath - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("entryPath", entryPath); using var rows = dbStatement.ExecuteReader(); return rows.Read() ? rows.GetInt32("Note_Position") : 0; - } + }); public (double, double, bool?) GetWait(BaseNoteFile noteFile) { - (double, double, bool?) data = (0.0, 0.0, default); - var dbStatement = NewDBStatement(""" - SELECT Audio_Wait, Media_Wait, Media - FROM wait - WHERE Note_ID = @noteID - """); - dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); - using var rows = dbStatement.ExecuteReader(); - if (rows.Read()) + (double, double, bool?) wait = (0.0, 0.0, default); + HandleCSX(() => { - if (!rows.IsDBNull("Audio_Wait")) - { - data.Item1 = rows.GetDouble("Audio_Wait"); - } - data.Item2 = rows.GetDouble("Media_Wait"); - if (!rows.IsDBNull("Media")) - { - data.Item3 = rows.GetInt32("Media") > 0; - } - } - return data; - } - - public int GetFormat(BaseNoteFile noteFile) - { - var dbStatement = NewDBStatement(""" - SELECT Format - FROM format - WHERE Note_ID = @noteID - """); - dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); - using var rows = dbStatement.ExecuteReader(); - return rows.Read() ? rows.GetInt32("Format") : -1; - } - - public void SetNotePosition(EntryItem entryItem) - { - var dbStatement = NewDBStatement(""" - REPLACE - INTO entry - VALUES(@entryPath, @notePosition) - """); - dbStatement.Parameters.AddWithValue("entryPath", entryItem.EntryPath); - dbStatement.Parameters.AddWithValue("notePosition", entryItem.NotePosition); - dbStatement.ExecuteNonQuery(); - } - - public void SetFavoriteEntry(BaseNoteFile noteFile) - { - HandleStatements(t => - { - using (var dbStatement = NewDBStatement(""" - DELETE - FROM favorite_entry + using var dbStatement = new SqliteCommand(""" + SELECT Audio_Wait, Media_Wait, Media + FROM wait WHERE Note_ID = @noteID - """, t)) + """, _fastDB); + dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); + using var rows = dbStatement.ExecuteReader(); + if (rows.Read()) { - dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); - dbStatement.ExecuteNonQuery(); - } - foreach (var favoriteEntryItem in noteFile.FavoriteEntryItems) - { - using (var dbStatement = NewDBStatement(""" - REPLACE - INTO favorite_entry - VALUES(@noteID, @favoriteEntry) - """, t)) + if (!rows.IsDBNull("Audio_Wait")) { - dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); - dbStatement.Parameters.AddWithValue("favoriteEntry", favoriteEntryItem.DefaultEntryPath); - dbStatement.ExecuteNonQuery(); + wait.Item1 = rows.GetDouble("Audio_Wait"); + } + wait.Item2 = rows.GetDouble("Media_Wait"); + if (!rows.IsDBNull("Media")) + { + wait.Item3 = rows.GetInt32("Media") > 0; } } }); + return wait; } - public void SetEventNote(string eventNoteID, string eventNoteName, DateTime date, EventNoteVariety eventNoteVariety) + public int GetFormat(BaseNoteFile noteFile) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" + SELECT Format + FROM format + WHERE Note_ID = @noteID + """, _fastDB); + dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); + using var rows = dbStatement.ExecuteReader(); + return rows.Read() ? rows.GetInt32("Format") : -1; + }); + + public void SetNotePosition(EntryItem entryItem) => HandleCSX(() => + { + using var dbStatement = new SqliteCommand(""" + REPLACE + INTO entry + VALUES(@entryPath, @notePosition) + """, _fastDB); + dbStatement.Parameters.AddWithValue("entryPath", entryItem.EntryPath); + dbStatement.Parameters.AddWithValue("notePosition", entryItem.NotePosition); + dbStatement.ExecuteNonQuery(); + }); + + public void SetFavoriteEntry(BaseNoteFile noteFile) => HandleStatementUnit(t => + { + using (var dbStatement = new SqliteCommand(""" + DELETE + FROM favorite_entry + WHERE Note_ID = @noteID + """, _fastDB, t)) + { + dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); + dbStatement.ExecuteNonQuery(); + } + foreach (var favoriteEntryItem in noteFile.FavoriteEntryItems) + { + using (var dbStatement = new SqliteCommand(""" + REPLACE + INTO favorite_entry + VALUES(@noteID, @favoriteEntry) + """, _fastDB, t)) + { + dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); + dbStatement.Parameters.AddWithValue("favoriteEntry", favoriteEntryItem.DefaultEntryPath); + dbStatement.ExecuteNonQuery(); + } + } + }); + + public void SetEventNote(string eventNoteID, string eventNoteName, DateTime date, EventNoteVariety eventNoteVariety) => HandleCSX(() => + { + using var dbStatement = new SqliteCommand(""" INSERT INTO event_note VALUES(@eventNoteID, @eventNoteName, @date, @eventNoteVariety) - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID); dbStatement.Parameters.AddWithValue("eventNoteName", eventNoteName); dbStatement.Parameters.AddWithValue("date", date); dbStatement.Parameters.AddWithValue("eventNoteVariety", eventNoteVariety); dbStatement.ExecuteNonQuery(); - } + }); - public void WipeEventNote(string eventNoteID) + public void WipeEventNote(string eventNoteID) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" DELETE FROM event_note WHERE Event_Note_ID = @eventNoteID - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID); dbStatement.ExecuteNonQuery(); - } + }); - public void ModifyEventNoteName(string eventNoteID, string eventNoteName) + public void ModifyEventNoteName(string eventNoteID, string eventNoteName) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" UPDATE event_note SET Name = @eventNoteName WHERE Event_Note_ID = @eventNoteID - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("eventNoteName", eventNoteName); dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID); dbStatement.ExecuteNonQuery(); - } + }); - public void SaveComment(DateTime date, BaseNoteFile noteFile, string eventNoteID, string comment, string avatar, double multiplier, double audioMultiplier, ModeComponent modeComponent, int stand, int band, bool isBand1, double point, bool isPaused, DefaultCompute.InputFlag inputFlags) + public void SaveComment(DateTime date, BaseNoteFile noteFile, string eventNoteID, string comment, string avatar, double multiplier, double audioMultiplier, ModeComponent modeComponent, int stand, int band, bool isBand1, double point, bool isPaused, DefaultCompute.InputFlag inputFlags) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" INSERT INTO comment VALUES(@date, @eventNoteID, @comment, @avatar, @multiplier, @autoMode, @noteSaltMode, @audioMultiplier, @faintNoteMode, @judgmentMode, @hitPointsMode, @noteMobilityMode, @longNoteMode, @inputFavorMode, @noteModifyMode, @bpmMode, @waveMode, @setNoteMode, @lowestJudgmentConditionMode, @stand, @band, @isBand1, @point, @salt, @highestJudgment0, @higherJudgment0, @highJudgment0, @lowJudgment0, @lowerJudgment0, @lowestJudgment0, @highestJudgment1, @higherJudgment1, @highJudgment1, @lowJudgment1, @lowerJudgment1, @lowestJudgment1, @inputFavorLabelledMillis, @lowestLongNoteModify, @highestLongNoteModify, @setNotePut, @setNotePutMillis, @highestHitPoints0, @higherHitPoints0, @highHitPoints0, @lowHitPoints0, @lowerHitPoints0, @lowestHitPoints0, @highestHitPoints1, @higherHitPoints1, @highHitPoints1, @lowHitPoints1, @lowerHitPoints1, @lowestHitPoints1, @noteID, @isPaused, @inputFlags) - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("date", date); dbStatement.Parameters.AddWithValue("eventNoteID", eventNoteID ?? DBNull.Value as object); dbStatement.Parameters.AddWithValue("comment", comment); @@ -1015,131 +1027,121 @@ dbStatement.Parameters.AddWithValue("isPaused", isPaused); dbStatement.Parameters.AddWithValue("inputFlags", inputFlags); dbStatement.ExecuteNonQuery(); - } + }); - public void SetWait(BaseNoteFile noteFile, double audioWait, double mediaWait, bool media) + public void SetWait(BaseNoteFile noteFile, double audioWait, double mediaWait, bool media) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" REPLACE INTO wait VALUES(@noteID, @audioWait, @mediaWait, @media) - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); dbStatement.Parameters.AddWithValue("audioWait", audioWait); dbStatement.Parameters.AddWithValue("mediaWait", mediaWait); dbStatement.Parameters.AddWithValue("media", media); dbStatement.ExecuteNonQuery(); - } + }); - public void SetNoteFormat(BaseNoteFile noteFile, int format) + public void SetNoteFormat(BaseNoteFile noteFile, int format) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" REPLACE INTO format VALUES(@noteID, @format) - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); dbStatement.Parameters.AddWithValue("format", format); dbStatement.ExecuteNonQuery(); - } + }); - public void WipeFavoriteEntry() + public void WipeFavoriteEntry() => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" DELETE FROM favorite_entry - """); + """, _fastDB); dbStatement.ExecuteNonQuery(); - } + }); - public void WipeHandled(BaseNoteFile noteFile) + public void WipeHandled(BaseNoteFile noteFile) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" DELETE FROM handled WHERE Note_ID = @noteID - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("noteID", noteFile.GetNoteID512()); dbStatement.ExecuteNonQuery(); - } + }); - public void InitWait() + public void InitWait() => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" UPDATE wait SET Audio_Wait = NULL, Media_Wait = 0.0 - """); + """, _fastDB); dbStatement.ExecuteNonQuery(); - } + }); - public void InitMedia() + public void InitMedia() => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" UPDATE wait SET Media = NULL - """); + """, _fastDB); dbStatement.ExecuteNonQuery(); - } + }); - public void WipeComment(string comment) + public void WipeComment(string comment) => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" DELETE FROM comment WHERE Comment = @comment - """); + """, _fastDB); dbStatement.Parameters.AddWithValue("comment", comment); dbStatement.ExecuteNonQuery(); - } + }); - public void WipeComment() + public void WipeComment() => HandleCSX(() => { - var dbStatement = NewDBStatement(""" + using var dbStatement = new SqliteCommand(""" DELETE FROM comment - """); + """, _fastDB); dbStatement.ExecuteNonQuery(); - } + }); - void HandleStatements(Action onHandle) + void HandleStatementUnit(Action onHandle) => HandleCSX(() => { + using var t = _fastDB.BeginTransaction(); try { - _dbCSX.EnterWriteLock(); - using var t = _fastDB.BeginTransaction(); - try - { - onHandle(t); - t.Commit(); - } - catch - { - t.Rollback(); - throw; - } + onHandle(t); + t.Commit(); } - finally + catch { - _dbCSX.ExitWriteLock(); + t.Rollback(); + throw; } - } + }); void HandleCSX(Action onHandle) { - try + lock (_dbCSX) { - _dbCSX.EnterReadLock(); onHandle(); } - finally - { - _dbCSX.ExitReadLock(); - } } - SqliteCommand NewDBStatement(string text, SqliteTransaction ta = null) + T HandleCSX(Func onHandle) { - return new(text, _fastDB, ta); + lock (_dbCSX) + { + return onHandle(); + } } public void Save() diff --git a/Qwilight/System/LevelSystem.cs b/Qwilight/System/LevelSystem.cs index cdc40f7..2792c9c 100644 --- a/Qwilight/System/LevelSystem.cs +++ b/Qwilight/System/LevelSystem.cs @@ -138,6 +138,10 @@ levelNotifyItem.Text += $" ({e.Message})"; NotifySystem.Instance.Notify(levelNotifyItem.Variety, NotifySystem.NotifyConfigure.Default, levelNotifyItem.Text, false, null, null, NotifySystem.SaveLevelID); } + finally + { + levelNotifyItem.OnStop = wipeTotal => true; + } return false; } diff --git a/Qwilight/System/NotifySystem.cs b/Qwilight/System/NotifySystem.cs index d654b48..f5a6367 100644 --- a/Qwilight/System/NotifySystem.cs +++ b/Qwilight/System/NotifySystem.cs @@ -12,7 +12,7 @@ public const int SaveQwilightID = -5; public const int SaveBundleID = -6; public const int SaveAsBundleID = -7; - public const int SaveFileID = -8; + public const int SaveNoteFileID = -8; public const int SaveUIID = -9; public enum NotifyVariety diff --git a/Qwilight/UIComponent/NotifyItem.cs b/Qwilight/UIComponent/NotifyItem.cs index 153be4e..83a7489 100644 --- a/Qwilight/UIComponent/NotifyItem.cs +++ b/Qwilight/UIComponent/NotifyItem.cs @@ -29,7 +29,7 @@ public Action OnHandle { get; init; } - public Func OnStop { get; set; } + public Func OnStop { get; set; } = wipeTotal => true; public NotifySystem.NotifyVariety Variety { diff --git a/Qwilight/ViewModel/MainViewModel.cs b/Qwilight/ViewModel/MainViewModel.cs index 5e0cd63..b9ad180 100644 --- a/Qwilight/ViewModel/MainViewModel.cs +++ b/Qwilight/ViewModel/MainViewModel.cs @@ -1792,7 +1792,7 @@ try { UIHandler.Instance.HandleParallel(() => ViewModels.Instance.NotifyValue.HandlingNotifyItemCollection.Insert(0, noteNotifyItem)); - NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, noteNotifyItem.Text, false, null, null, NotifySystem.SaveFileID); + NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, noteNotifyItem.Text, false, null, null, NotifySystem.SaveNoteFileID); var bundleEntryItem = Configure.Instance.LastDefaultEntryItem ?? DefaultEntryItem.EssentialBundle; if (bundleEntryItem.DefaultEntryVarietyValue != DefaultEntryItem.DefaultEntryVariety.Default && bundleEntryItem.DefaultEntryVarietyValue != DefaultEntryItem.DefaultEntryVariety.Essential) { @@ -1821,7 +1821,7 @@ LoadEntryItem(bundleEntryItem, bundleEntryPath); noteNotifyItem.Variety = NotifySystem.NotifyVariety.Closed; noteNotifyItem.Text = LanguageSystem.Instance.SavedNoteContents; - NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.OK, NotifySystem.NotifyConfigure.NotSave, noteNotifyItem.Text, false, null, null, NotifySystem.SaveFileID); + NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.OK, NotifySystem.NotifyConfigure.NotSave, noteNotifyItem.Text, false, null, null, NotifySystem.SaveNoteFileID); } catch (OperationCanceledException) { @@ -1830,7 +1830,7 @@ { noteNotifyItem.Variety = NotifySystem.NotifyVariety.Fault; noteNotifyItem.Text += $" ({e.Message})"; - NotifySystem.Instance.Notify(noteNotifyItem.Variety, NotifySystem.NotifyConfigure.NotSave, noteNotifyItem.Text, false, null, null, NotifySystem.SaveFileID); + NotifySystem.Instance.Notify(noteNotifyItem.Variety, NotifySystem.NotifyConfigure.NotSave, noteNotifyItem.Text, false, null, null, NotifySystem.SaveNoteFileID); } finally { @@ -3380,14 +3380,6 @@ } qwilightNotifyItem.Variety = NotifySystem.NotifyVariety.Closed; qwilightNotifyItem.Text = LanguageSystem.Instance.SavedQwilightContents; - qwilightNotifyItem.OnStop = wipeTotal => - { - if (!wipeTotal) - { - Utility.WipeEntry(_qwilightEntryPath); - } - return true; - }; NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, qwilightNotifyItem.Text); _qwilightEntryPath = tmpEntryPath; } @@ -3405,6 +3397,17 @@ NotifySystem.Instance.Notify(qwilightNotifyItem.Variety, NotifySystem.NotifyConfigure.NotSave, qwilightNotifyItem.Text); } } + finally + { + qwilightNotifyItem.OnStop = wipeTotal => + { + if (!wipeTotal) + { + Utility.WipeEntry(_qwilightEntryPath); + } + return true; + }; + } } public void WipeFavoriteEntry() diff --git a/Qwilight/ViewModel/NotifyViewModel.cs b/Qwilight/ViewModel/NotifyViewModel.cs index fa55a23..de8f098 100644 --- a/Qwilight/ViewModel/NotifyViewModel.cs +++ b/Qwilight/ViewModel/NotifyViewModel.cs @@ -87,7 +87,7 @@ { handlingNotifyItem.IsStopped = true; handlingNotifyItem.Variety = NotifySystem.NotifyVariety.Stopped; - if (handlingNotifyItem.OnStop?.Invoke(false) != false) + if (handlingNotifyItem.OnStop(false)) { HandlingNotifyItemCollection.Remove(handlingNotifyItem); } diff --git a/Test/Test.csproj b/Test/Test.csproj index 6dc36c0..156a552 100644 --- a/Test/Test.csproj +++ b/Test/Test.csproj @@ -25,7 +25,7 @@ - +