From c063aabbc008e371b0fcf26ef1c42d9831e7b750 Mon Sep 17 00:00:00 2001 From: Luke Date: Sun, 27 Mar 2022 21:38:58 +1000 Subject: [PATCH] Switch to Microsoft.Data.Sqlite for arm64 There is a slight change the the way QueryResult works in order to satisfy the variances in the new library. Disposing of the command with the reader appears to solve this, and hopefully, with minimal impact to plugins. --- TShockAPI/Extensions/DbExt.cs | 17 ++++++++++++----- TShockAPI/TShock.cs | 17 ++++++++++++----- TShockAPI/TShockAPI.csproj | 3 +-- TShockLauncher/TShockLauncher.csproj | 3 +-- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/TShockAPI/Extensions/DbExt.cs b/TShockAPI/Extensions/DbExt.cs index b4fc7c31..6d52aec2 100644 --- a/TShockAPI/Extensions/DbExt.cs +++ b/TShockAPI/Extensions/DbExt.cs @@ -65,13 +65,13 @@ namespace TShockAPI.DB try { db.Open(); - using (var com = db.CreateCommand()) + var com = db.CreateCommand(); // this will be disposed via the QueryResult instance { com.CommandText = query; for (int i = 0; i < args.Length; i++) com.AddParameter("@" + i, args[i]); - return new QueryResult(db, com.ExecuteReader()); + return new QueryResult(db, com.ExecuteReader(), com); } } catch (Exception ex) @@ -117,13 +117,13 @@ namespace TShockAPI.DB { var db = olddb.CloneEx(); db.Open(); - using (var com = db.CreateCommand()) + var com = db.CreateCommand(); // this will be disposed via the QueryResult instance { com.CommandText = query; foreach (var kv in values) com.AddParameter("@" + kv.Key, kv.Value); - return new QueryResult(db, com.ExecuteReader()); + return new QueryResult(db, com.ExecuteReader(), com); } } @@ -274,11 +274,13 @@ namespace TShockAPI.DB { public IDbConnection Connection { get; protected set; } public IDataReader Reader { get; protected set; } + public IDbCommand Command { get; protected set; } - public QueryResult(IDbConnection conn, IDataReader reader) + public QueryResult(IDbConnection conn, IDataReader reader, IDbCommand command) { Connection = conn; Reader = reader; + Command = command; } ~QueryResult() @@ -301,6 +303,11 @@ namespace TShockAPI.DB Reader.Dispose(); Reader = null; } + if (Command != null) + { + Command.Dispose(); + Command = null; + } if (Connection != null) { Connection.Dispose(); diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 798b5a5b..3d0fd494 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -28,7 +28,6 @@ using System.Linq; using System.Net; using System.Reflection; using MaxMind; -using System.Data.SQLite; using MySql.Data.MySqlClient; using Newtonsoft.Json; using Rests; @@ -261,7 +260,7 @@ namespace TShockAPI }; // if sqlite.interop cannot be found, try and search the runtimes folder. this usually happens when debugging tsapi // since it does not have the dependency installed directly - NativeLibrary.SetDllImportResolver(typeof(SQLiteConnection).Assembly, ResolveNativeDep); + NativeLibrary.SetDllImportResolver(typeof(Microsoft.Data.Sqlite.SqliteConnection).Assembly, ResolveNativeDep); Main.SettingsUnlock_WorldEvil = true; @@ -322,7 +321,7 @@ namespace TShockAPI { string sql = Path.Combine(SavePath, Config.Settings.SqliteDBPath); Directory.CreateDirectory(Path.GetDirectoryName(sql)); - DB = new SQLiteConnection(string.Format("Data Source={0},Version=3", sql)); + DB = new Microsoft.Data.Sqlite.SqliteConnection(string.Format("Data Source={0}", sql)); } else if (Config.Settings.StorageType.ToLower() == "mysql") { @@ -441,8 +440,16 @@ namespace TShockAPI } catch (Exception ex) { - Log.ConsoleError("Fatal Startup Exception"); - Log.ConsoleError(ex.ToString()); + if (Log is not null) + { + Log.ConsoleError("Fatal Startup Exception"); + Log.ConsoleError(ex.ToString()); + } + else + { + Console.WriteLine("Fatal Startup Exception"); + Console.WriteLine(ex.ToString()); + } Environment.Exit(1); } } diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 0976c16d..ffb1afb4 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -30,8 +30,7 @@ - - + diff --git a/TShockLauncher/TShockLauncher.csproj b/TShockLauncher/TShockLauncher.csproj index d84c9a12..fa29a381 100644 --- a/TShockLauncher/TShockLauncher.csproj +++ b/TShockLauncher/TShockLauncher.csproj @@ -25,8 +25,7 @@ - - +