diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 8e8b2227..ee375789 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -73,7 +73,7 @@ namespace TShockAPI.DB using (var reader = database.QueryReader("SELECT * FROM Bans WHERE IP=@0", ip)) { if (reader.Read()) - return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + return new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason")); } } catch (Exception ex) @@ -97,7 +97,7 @@ namespace TShockAPI.DB using (var reader = database.QueryReader("SELECT * FROM Bans WHERE " + namecol + "=@0", name)) { if (reader.Read()) - return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + return new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason")); } } diff --git a/TShockAPI/DB/DbExt.cs b/TShockAPI/DB/DbExt.cs index 269fec1c..978f79dd 100644 --- a/TShockAPI/DB/DbExt.cs +++ b/TShockAPI/DB/DbExt.cs @@ -5,42 +5,48 @@ using System.Data; namespace TShockAPI.DB { public static class DbExt - { + { /// /// Executes a query on a database. /// - /// Database to query + /// Database to query /// Query string with parameters as @0, @1, etc. /// Parameters to be put in the query /// Rows affected by query - public static int Query(this IDbConnection db, string query, params object[] args) + public static int Query(this IDbConnection olddb, string query, params object[] args) { - using (var com = db.CreateCommand()) + using (var db = olddb.CloneEx()) { - com.CommandText = query; - for (int i = 0; i < args.Length; i++) - com.AddParameter("@" + i, args[i]); + db.Open(); + using (var com = db.CreateCommand()) + { + com.CommandText = query; + for (int i = 0; i < args.Length; i++) + com.AddParameter("@" + i, args[i]); - return com.ExecuteNonQuery(); + return com.ExecuteNonQuery(); + } } } /// /// Executes a query on a database. /// - /// Database to query + /// Database to query /// Query string with parameters as @0, @1, etc. /// Parameters to be put in the query /// Query result as IDataReader - public static IDataReader QueryReader(this IDbConnection db, string query, params object[] args) + public static QueryResult QueryReader(this IDbConnection olddb, string query, params object[] args) { + var db = olddb.CloneEx(); + db.Open(); using (var com = db.CreateCommand()) { com.CommandText = query; for (int i = 0; i < args.Length; i++) com.AddParameter("@" + i, args[i]); - return com.ExecuteReader(); + return new QueryResult(db, com.ExecuteReader()); } } @@ -53,8 +59,15 @@ namespace TShockAPI.DB return parm; } - static Dictionary> ReadFuncs = new Dictionary> - { + public static IDbConnection CloneEx(this IDbConnection conn) + { + var clone = (IDbConnection)Activator.CreateInstance(conn.GetType()); + clone.ConnectionString = conn.ConnectionString; + return clone; + } + + static Dictionary> ReadFuncs = new Dictionary>() + { {typeof(bool), (s, i) => s.GetBoolean(i)}, {typeof(byte), (s, i) => s.GetByte(i)}, {typeof(Int16), (s, i) => s.GetInt16(i)}, @@ -64,7 +77,6 @@ namespace TShockAPI.DB {typeof(decimal), (s, i) => s.GetDecimal(i)}, {typeof(float), (s, i) => s.GetFloat(i)}, {typeof(double), (s, i) => s.GetDouble(i)}, - {typeof(object), (s, i) => s.GetValue(i)}, }; public static T Get(this IDataReader reader, string column) @@ -80,4 +92,34 @@ namespace TShockAPI.DB throw new NotImplementedException(); } } + + + public class QueryResult : IDisposable + { + public IDbConnection Connection { get; protected set; } + public IDataReader Reader { get; protected set; } + + public QueryResult(IDbConnection conn, IDataReader reader) + { + Connection = conn; + Reader = reader; + } + + public void Dispose() + { + Reader.Dispose(); + Connection.Dispose(); + } + + public bool Read() + { + return Reader.Read(); + } + + public T Get(string column) + { + return Reader.Get(Reader.GetOrdinal(column)); + } + } + } diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index fea9328a..40a4cfc5 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -1,4 +1,4 @@ -/* +/* TShock, a server mod for Terraria Copyright (C) 2011 The TShock Team @@ -172,11 +172,18 @@ namespace TShockAPI.DB string[] SplitIDs = MergedIDs.Split(','); Region r = new Region(new Rectangle(X1, Y1, width, height), name, Protected != 0, Main.worldID.ToString()); + try { for (int i = 0; i < SplitIDs.Length; i++) { - r.AllowedIDs.Add(Convert.ToInt32(SplitIDs[i])); + int id; + + if (Int32.TryParse(SplitIDs[i], out id)) // if unparsable, it's not an int, so silently skip + r.AllowedIDs.Add(id); + else if (SplitIDs[i] == "") // Split gotcha, can return an empty string with certain conditions + // but we only want to let the user know if it's really a nonparsable integer. + Log.Warn("One of your UserIDs is not a usable integer: " + SplitIDs[i]); } } catch (Exception e) @@ -219,7 +226,13 @@ namespace TShockAPI.DB { for (int i = 0; i < SplitIDs.Length; i++) { - r.AllowedIDs[i] = Convert.ToInt32(SplitIDs[i]); + int id; + + if (Int32.TryParse(SplitIDs[i], out id)) // if unparsable, it's not an int, so silently skip + r.AllowedIDs.Add(id); + else if (SplitIDs[i] == "") // Split gotcha, can return an empty string with certain conditions + // but we only want to let the user know if it's really a nonparsable integer. + Log.Warn("UnitTest: One of your UserIDs is not a usable integer: " + SplitIDs[i]); } } catch (Exception e) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 2dbee46c..395d69bc 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -193,7 +193,6 @@ namespace TShockAPI.DB returndata[1] = reader.Get("UserGroup"); return returndata; } - reader.Close(); } } catch (Exception ex) @@ -295,7 +294,7 @@ namespace TShockAPI.DB { try { - IDataReader result; + QueryResult result; if (string.IsNullOrEmpty(user.Address)) { result = database.QueryReader("SELECT * FROM Users WHERE Username=@0", user.Name); diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 490cfd41..af424af1 100644 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -36,5 +36,5 @@ using System.Runtime.InteropServices; // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("3.1.4.0726")] -[assembly: AssemblyFileVersion("3.1.4.0726")] +[assembly: AssemblyVersion("3.1.4.0801")] +[assembly: AssemblyFileVersion("3.1.4.0801")] diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 29ee20fa..4be71218 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -44,7 +44,7 @@ using TShockAPI.DB; namespace TShockAPI { - [APIVersion(1, 5)] + [APIVersion(1, 6)] public class TShock : TerrariaPlugin { public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version; @@ -127,7 +127,6 @@ namespace TShockAPI { string sql = Path.Combine(SavePath, "tshock.sqlite"); DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); - DB.Open(); } else if (Config.StorageType.ToLower() == "mysql") { @@ -201,7 +200,6 @@ namespace TShockAPI public override void DeInitialize() { - DB.Close(); GameHooks.PostInitialize -= OnPostInit; GameHooks.Update -= OnUpdate; ServerHooks.Join -= OnJoin; diff --git a/TerrariaServerBins/TerrariaServer.exe b/TerrariaServerBins/TerrariaServer.exe index 82dfccbd..7030cbc4 100644 Binary files a/TerrariaServerBins/TerrariaServer.exe and b/TerrariaServerBins/TerrariaServer.exe differ diff --git a/TerrariaServerBins/TerrariaServerAPI.dll b/TerrariaServerBins/TerrariaServerAPI.dll index 93b76fb0..d38cc55b 100644 Binary files a/TerrariaServerBins/TerrariaServerAPI.dll and b/TerrariaServerBins/TerrariaServerAPI.dll differ diff --git a/TerrariaServerBins/XNAHelpers.dll b/TerrariaServerBins/XNAHelpers.dll index 0dde3c46..bfd6b050 100644 Binary files a/TerrariaServerBins/XNAHelpers.dll and b/TerrariaServerBins/XNAHelpers.dll differ