From abb3d6c2efa30b39c5396f56b2c38ebc191ceb8b Mon Sep 17 00:00:00 2001 From: Chenx221 Date: Wed, 16 Oct 2024 13:31:13 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D+sqlite=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EscudeTools/Define.cs | 26 ++++++++++++++++---- EscudeTools/ScriptManager.cs | 46 +++++++++++++++++++----------------- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/EscudeTools/Define.cs b/EscudeTools/Define.cs index 145510f..153768e 100644 --- a/EscudeTools/Define.cs +++ b/EscudeTools/Define.cs @@ -146,14 +146,19 @@ namespace EscudeTools public static string SetCommandStr(Command c, ScriptFile sf, ScriptMessage sm, ref int messIndex) { //__cdecl - //todo - //可考虑对pop进行进一步处理 switch (c.Instruction) { case INST_POP: - return "Pop a value"; + { + Mark(sf, 1); + return "Pop a value"; + } + case INST_POP_N: - return $"Pop multiple values"; + { + Mark(sf, (uint)c.Parameter); + return $"Pop multiple values"; + } case INST_POP_RET: return $"Pop a return value"; case INST_PUSH_INT: @@ -250,6 +255,18 @@ namespace EscudeTools } } + private static void Mark(ScriptFile sf, uint j) + { + int k = sf.Commands.Count - 1; + for (int i = 0; i < j; i++) + { + if (sf.Commands[k].Instruction <= 10 && sf.Commands[k].Instruction >= 4 && !sf.Commands[k].IsProcSet) + { + sf.Commands[k--].IsProcSet = true; + } + } + } + private static string SetExtStr(Command c, ScriptFile sf) { switch ((uint)c.Parameter) @@ -810,6 +827,7 @@ namespace EscudeTools private static void SetExtStr1(string[] ps, ScriptFile sf) { int i = sf.Commands.Count - 2; + sf.Commands[i + 1].IsProcSet = true; for (int k = 0; k < ps.Length; k++) { if (sf.Commands[i].IsProcSet || sf.Commands[i].Instruction < 4 || sf.Commands[i].Instruction > 10) diff --git a/EscudeTools/ScriptManager.cs b/EscudeTools/ScriptManager.cs index b9f5364..43b1d86 100644 --- a/EscudeTools/ScriptManager.cs +++ b/EscudeTools/ScriptManager.cs @@ -266,65 +266,63 @@ namespace EscudeTools connection.Open(); string checkTableExistsQuery = $"SELECT name FROM sqlite_master WHERE type='table' AND name='{name}';"; - using (var checkTableCmd = new SqliteCommand(checkTableExistsQuery, connection)) { var result = checkTableCmd.ExecuteScalar(); - if (result != null) - return true; + if (result != null) return true; } string createTableQuery = $@" - CREATE TABLE {name} ( - Offset INTEGER, - Instruction INTEGER, - InstructionString TEXT, - Parameter TEXT, - Helper TEXT - );"; - + CREATE TABLE {name} ( + Offset INTEGER, + Instruction INTEGER, + InstructionString TEXT, + Parameter TEXT, + Helper TEXT + );"; using (var createTableCmd = new SqliteCommand(createTableQuery, connection)) { createTableCmd.ExecuteNonQuery(); } - string insertQuery = $"INSERT INTO {name} (Offset, Instruction, InstructionString,Parameter, Helper) VALUES (@Offset, @Instruction, @InstructionString,@Parameter, @Helper);"; + string insertQuery = $"INSERT INTO {name} (Offset, Instruction, InstructionString, Parameter, Helper) VALUES (@Offset, @Instruction, @InstructionString, @Parameter, @Helper);"; + + using var transaction = connection.BeginTransaction(); + using var insertCmd = new SqliteCommand(insertQuery, connection, transaction); - using var insertCmd = new SqliteCommand(insertQuery, connection); foreach (var command in sf.Commands) { insertCmd.Parameters.Clear(); insertCmd.Parameters.AddWithValue("@Offset", command.Offset); insertCmd.Parameters.AddWithValue("@Instruction", command.Instruction); insertCmd.Parameters.AddWithValue("@InstructionString", command.InstructionString); - insertCmd.Parameters.AddWithValue("@Parameter", command.Parameter == null ? "" : command.Parameter.ToString()); + insertCmd.Parameters.AddWithValue("@Parameter", command.Parameter ?? ""); insertCmd.Parameters.AddWithValue("@Helper", command.Helper ?? ""); insertCmd.ExecuteNonQuery(); } + transaction.Commit(); return true; } + private bool SqliteProcess(ScriptMessage sm, string path) { using SqliteConnection connection = new($"Data Source={path};"); connection.Open(); string checkTableExistsQuery = $"SELECT name FROM sqlite_master WHERE type='table' AND name='{name}';"; - using (var checkTableCmd = new SqliteCommand(checkTableExistsQuery, connection)) { var result = checkTableCmd.ExecuteScalar(); - if (result != null) - return true; + if (result != null) return true; } string createTableQuery = $@" - CREATE TABLE {name} ( - DataString TEXT - );"; - + CREATE TABLE {name} ( + DataString TEXT + );"; using (var createTableCmd = new SqliteCommand(createTableQuery, connection)) { createTableCmd.ExecuteNonQuery(); @@ -332,7 +330,9 @@ namespace EscudeTools string insertQuery = $"INSERT INTO {name} (DataString) VALUES (@DataString);"; - using var insertCmd = new SqliteCommand(insertQuery, connection); + using var transaction = connection.BeginTransaction(); + using var insertCmd = new SqliteCommand(insertQuery, connection, transaction); + foreach (var ds in sm.DataString) { insertCmd.Parameters.Clear(); @@ -340,9 +340,11 @@ namespace EscudeTools insertCmd.ExecuteNonQuery(); } + transaction.Commit(); return true; } + private static string GetSQLiteColumnType(ushort type) { return type switch