From 81ef1b6cff011b6e4d257b76855b259a65795aba Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 23 Jul 2011 17:29:12 -0600 Subject: [PATCH 01/66] Test --- DBEditor/TShockDBEditor.csproj | 147 +++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 DBEditor/TShockDBEditor.csproj diff --git a/DBEditor/TShockDBEditor.csproj b/DBEditor/TShockDBEditor.csproj new file mode 100644 index 00000000..cdc90bbc --- /dev/null +++ b/DBEditor/TShockDBEditor.csproj @@ -0,0 +1,147 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {F1AE395C-6B4D-40E0-8BF8-0D8A126488D3} + WinExe + Properties + TShockDBEditor + TShockDBEditor + v4.0 + + + 512 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\SqlBins\Community.CsharpSqlite.SQLiteClient.dll + + + False + ..\SqlBins\MySql.Data.dll + True + + + False + ..\SqlBins\MySql.Web.dll + True + + + + + + + + + + + + + + + + + + Form + + + Main.cs + + + + + + Main.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 3.1 + true + + + + + \ No newline at end of file From d515616f729068c0962b808556fb1b52069fbe1a Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sat, 23 Jul 2011 22:27:21 -0400 Subject: [PATCH 02/66] A few more tests --- TShockAPI/DB/RegionManager.cs | 106 +++++++++++++++++++++--- UnitTests/ItemManagerTest.cs | 29 +------ UnitTests/RegionManagerTest.cs | 68 +++++++++++---- UnitTests/RegionManagerTest.orderedtest | 12 ++- 4 files changed, 161 insertions(+), 54 deletions(-) diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index 75ee9f7e..2c298dca 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -285,6 +285,56 @@ namespace TShockAPI.DB } } + public void ReloadForUnitTest(String n) + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Regions WHERE WorldID=@worldid"; + com.AddParameter("@worldid", n); + using (var reader = com.ExecuteReader()) + { + Regions.Clear(); + while (reader.Read()) + { + int X1 = reader.Get("X1"); + int Y1 = reader.Get("Y1"); + int height = reader.Get("height"); + int width = reader.Get("width"); + int Protected = reader.Get("Protected"); + string MergedIDs = DbExt.Get(reader, "UserIds"); + string name = DbExt.Get(reader, "RegionName"); + System.Console.WriteLine(MergedIDs); + string[] SplitIDs = MergedIDs.Split(','); + + Region r = new Region(new Rectangle(X1, Y1, width, height), name, Protected, Main.worldID.ToString()); + r.RegionAllowedIDs = new int[SplitIDs.Length]; + try + { + for (int i = 0; i < SplitIDs.Length; i++) + { + if (SplitIDs.Length == 1 && SplitIDs[0].Equals("")) + { + break; + } + //System.Console.WriteLine(SplitIDs[i]); + r.RegionAllowedIDs[i] = Convert.ToInt32(SplitIDs[i]); + } + } + catch (Exception e) + { + Log.Error("Your database contains invalid UserIDs (they should be ints)."); + Log.Error("A lot of things will fail because of this. You must manually delete and re-create the allowed field."); + Log.Error(e.Message); + Log.Error(e.StackTrace); + } + + Regions.Add(r); + } + reader.Close(); + } + } + } + public bool AddRegion(int tx, int ty, int width, int height, string regionname, string worldid) { try @@ -301,11 +351,9 @@ namespace TShockAPI.DB com.AddParameter("@worldid", worldid); com.AddParameter("@userids", ""); com.AddParameter("@protected", 1); - if (com.ExecuteNonQuery() > 0) - { - Regions.Add(new Region(new Rectangle(tx, ty, width, height), regionname, 0, worldid)); - return true; - } + com.ExecuteNonQuery(); + Regions.Add(new Region(new Rectangle(tx, ty, width, height), regionname, 0, worldid)); + return true; } } @@ -326,7 +374,7 @@ namespace TShockAPI.DB com.AddParameter("@name", name.ToLower()); com.AddParameter("@worldid", Main.worldID.ToString()); com.ExecuteNonQuery(); - ReloadAllRegions(); + Regions.Remove(getRegion(name)); return true; } } @@ -347,9 +395,31 @@ namespace TShockAPI.DB com.AddParameter("@name", name); com.AddParameter("@bool", state ? 1 : 0); com.AddParameter("@worldid", Main.worldID.ToString()); - int q = com.ExecuteNonQuery(); - ReloadAllRegions(); - return (q > 0); + com.ExecuteNonQuery(); + getRegion(name).DisableBuild = state ? 1 : 0; + return true; + } + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + return false; + } + } + + public bool SetRegionStateTest(string name, string world, bool state) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "UPDATE Regions SET Protected=@bool WHERE RegionName=@name AND WorldID=@worldid"; + com.AddParameter("@name", name); + com.AddParameter("@bool", state ? 1 : 0); + com.AddParameter("@worldid", world); + com.ExecuteNonQuery(); + getRegion(name).DisableBuild = state ? 1 : 0; + return true; } } catch (Exception ex) @@ -392,7 +462,7 @@ namespace TShockAPI.DB public static List ListIDs(string MergedIDs) { List SplitIDs = new List(); - var sb = new StringBuilder(); + /*var sb = new StringBuilder(); for (int i = 0; i < MergedIDs.Length; i++) { char c = MergedIDs[i]; @@ -406,6 +476,12 @@ namespace TShockAPI.DB SplitIDs.Add(sb.ToString()); sb.Clear(); } + }*/ + String[] s = MergedIDs.Split(','); + for( int i = 0; i < s.Length; i++ ) + { + if (!s[i].Equals("")) + SplitIDs.Add(s[i]); } return SplitIDs; } @@ -482,6 +558,16 @@ namespace TShockAPI.DB } return regions; } + + public Region getRegion(String name) + { + foreach (Region r in Regions) + { + if (r.RegionName.Equals(name)) + return r; + } + return new Region(); + } } public class Region diff --git a/UnitTests/ItemManagerTest.cs b/UnitTests/ItemManagerTest.cs index 992e5c35..ef6ed314 100644 --- a/UnitTests/ItemManagerTest.cs +++ b/UnitTests/ItemManagerTest.cs @@ -24,6 +24,7 @@ namespace UnitTests public class ItemManagerTest { public static IDbConnection DB; + public static ItemManager manager; [TestInitialize] public void Initialize() { @@ -32,33 +33,12 @@ namespace UnitTests DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", "tshock.test.sqlite")); DB.Open(); - /*try - { - var hostport = Config.MySqlHost.Split(':'); - DB = new MySqlConnection(); - DB.ConnectionString = String.Format("Server='{0}'; Port='{1}'; Database='{2}'; Uid='{3}'; Pwd='{4}';", - hostport[0], - hostport.Length > 1 ? hostport[1] : "3306", - Config.MySqlDbName, - Config.MySqlUsername, - Config.MySqlPassword - ); - DB.Open(); - } - catch (MySqlException ex) - { - Log.Error(ex.ToString()); - throw new Exception("MySql not setup correctly"); - }*/ + manager = new ItemManager(DB); } [TestMethod] public void SQLiteItemTest_AddBan() { - // - // TODO: Add test logic here - // - ItemManager manager = new ItemManager(DB); Assert.IsNotNull(manager); Assert.IsFalse( manager.ItemIsBanned("Dirt Block"), "Item isn't banned" ); manager.AddNewBan("Dirt Block"); @@ -74,10 +54,7 @@ namespace UnitTests [TestMethod] public void SQLiteItemTest_RemoveBan() { - // - // TODO: Add test logic here - // - ItemManager manager = new ItemManager(DB); + manager = new ItemManager(DB); Assert.IsNotNull(manager); Assert.AreEqual(2, manager.ItemBans.Count); manager.AddNewBan("Dirt Block"); diff --git a/UnitTests/RegionManagerTest.cs b/UnitTests/RegionManagerTest.cs index c67d0e41..2c2e5218 100644 --- a/UnitTests/RegionManagerTest.cs +++ b/UnitTests/RegionManagerTest.cs @@ -29,51 +29,91 @@ namespace UnitTests DB.Open(); manager = new RegionManager(DB); + manager.ReloadForUnitTest("test"); } [TestMethod] public void AddRegion() { - Region r = new Region( new Rectangle(100,100,100,100), "test", 0, "test world"); + Region r = new Region( new Rectangle(100,100,100,100), "test", 1, "test"); Assert.IsTrue(manager.AddRegion(r.RegionArea.X, r.RegionArea.Y, r.RegionArea.Width, r.RegionArea.Height, r.RegionName, r.RegionWorldID)); Assert.AreEqual(1, manager.Regions.Count); + Assert.IsNotNull(manager.getRegion("test")); - Region r2 = new Region(new Rectangle(201, 201, 100, 100), "test2", 0, "test world"); + Region r2 = new Region(new Rectangle(201, 201, 100, 100), "test2", 1, "test"); manager.AddRegion(r2.RegionArea.X, r2.RegionArea.Y, r2.RegionArea.Width, r2.RegionArea.Height, r2.RegionName, r2.RegionWorldID); Assert.AreEqual(2, manager.Regions.Count); + Assert.IsNotNull(manager.getRegion("test2")); } [TestMethod] public void DeleteRegion() { + Assert.IsTrue(2 == manager.Regions.Count); Assert.IsTrue(manager.DeleteRegion("test")); + Assert.IsTrue(1 == manager.Regions.Count); Assert.IsTrue(manager.DeleteRegion("test2")); - Assert.AreEqual(0, manager.Regions.Count); + Assert.IsTrue(0 == manager.Regions.Count); } [TestMethod] public void InRegion() { - // - // TODO: Add test logic here - // + Assert.IsTrue(manager.InArea(100, 100)); + Assert.IsTrue(manager.InArea(150, 150)); + Assert.IsTrue(manager.InArea(200, 200)); + Assert.IsTrue(manager.InArea(201, 201)); + Assert.IsTrue(manager.InArea(251, 251)); + Assert.IsTrue(manager.InArea(301, 301)); + Assert.IsFalse(manager.InArea(311, 311)); + Assert.IsFalse(manager.InArea(99, 99)); } [TestMethod] - public void TestMethod2() + public void SetRegionState() { - // - // TODO: Add test logic here - // + Assert.IsTrue(manager.getRegion("test").DisableBuild == 1); + manager.SetRegionStateTest("test", "test", false); + Assert.IsTrue(manager.getRegion("test").DisableBuild == 0); + manager.SetRegionStateTest("test", "test", true); + Assert.IsTrue(manager.getRegion("test").DisableBuild == 1); + Assert.IsTrue(manager.getRegion("test2").DisableBuild == 1); + manager.SetRegionStateTest("test2", "test", false); + Assert.IsTrue(manager.getRegion("test2").DisableBuild == 0); + manager.SetRegionStateTest("test2", "test", true); + Assert.IsTrue(manager.getRegion("test2").DisableBuild == 1); } [TestMethod] - public void TestMethod3() + public void CanBuild() { - // - // TODO: Add test logic here - // + /** + * For now, this test is useless. Need to implement user groups so we can alter Canbuild permission. + */ + TSPlayer t = new TSPlayer(0); + Assert.IsFalse( manager.CanBuild( 100,100,t) ); + } + + [TestMethod] + public void AddUser() + { + /** + * For now, this test is useless. Need to implement users so we have names to get ids from. + */ + } + + [TestMethod] + public void ListID() + { + Assert.IsTrue(RegionManager.ListIDs("1,2,3,4,5").Count == 5); + Assert.IsTrue(RegionManager.ListIDs("").Count == 0); + } + + [TestMethod] + public void ListRegions() + { + //needs a little more work. } [TestCleanup] diff --git a/UnitTests/RegionManagerTest.orderedtest b/UnitTests/RegionManagerTest.orderedtest index 201f1b3f..c9d1a48f 100644 --- a/UnitTests/RegionManagerTest.orderedtest +++ b/UnitTests/RegionManagerTest.orderedtest @@ -1,10 +1,14 @@  - + + - - - + + + + + + \ No newline at end of file From ec1d42b16e83d02b68f1277d1a2e11060a424d09 Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sun, 24 Jul 2011 00:10:39 -0400 Subject: [PATCH 03/66] New test settings --- .gitignore | 3 ++- Terraria.vsmdi | 7 +++++++ TraceAndTestImpact.testsettings | 9 +++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 TraceAndTestImpact.testsettings diff --git a/.gitignore b/.gitignore index cd88c055..3fee42f6 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,5 @@ Thumbs.db #Template Bat file# ################### -myass.bat \ No newline at end of file +myass.bat +/TestResults \ No newline at end of file diff --git a/Terraria.vsmdi b/Terraria.vsmdi index 042d537c..c807b09d 100644 --- a/Terraria.vsmdi +++ b/Terraria.vsmdi @@ -1,5 +1,12 @@  + + + + + + + diff --git a/TraceAndTestImpact.testsettings b/TraceAndTestImpact.testsettings new file mode 100644 index 00000000..de2742ce --- /dev/null +++ b/TraceAndTestImpact.testsettings @@ -0,0 +1,9 @@ + + + These are test settings for Trace and Test Impact. + + + + + + \ No newline at end of file From 41ab3637950d57440e48b0e15e6ecab99faedda1 Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sun, 24 Jul 2011 00:18:27 -0400 Subject: [PATCH 04/66] better? --- Terraria.vsmdi | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Terraria.vsmdi b/Terraria.vsmdi index c807b09d..cf50deb4 100644 --- a/Terraria.vsmdi +++ b/Terraria.vsmdi @@ -2,9 +2,19 @@ - - - + + + + + + + + + + + + + From 8a017fd76c095c333c359cb96fa25af1d36a8813 Mon Sep 17 00:00:00 2001 From: Zack Date: Sat, 23 Jul 2011 21:51:24 -0700 Subject: [PATCH 05/66] Edited README.md via GitHub --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 3b665774..ce8a1414 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -####Do not download the latest master! - TShock is a server modification based upon High6's mod API that allows for basic server administration commands. __Constant builds__: http://ci.tshock.co/ From 440f9cd9ab3c21840182705ed5ddc4fcc12f9930 Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sun, 24 Jul 2011 00:54:09 -0400 Subject: [PATCH 06/66] no, it wasnt better. going back to ordered tests --- Terraria.vsmdi | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/Terraria.vsmdi b/Terraria.vsmdi index cf50deb4..c807b09d 100644 --- a/Terraria.vsmdi +++ b/Terraria.vsmdi @@ -2,19 +2,9 @@ - - - - - - - - - - - - - + + + From 1a49d68dc4a2bc48d94837a9dbd5a40022899bf3 Mon Sep 17 00:00:00 2001 From: high Date: Sun, 24 Jul 2011 01:14:50 -0400 Subject: [PATCH 07/66] Now logs null sockets on unhandled exception in serverloop/listenforclients. Hopefully to track down the null error in terraria. --- TShockAPI/Properties/AssemblyInfo.cs | 4 ++-- TShockAPI/TShock.cs | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 2471e719..43f2e26a 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.3.0723")] -[assembly: AssemblyFileVersion("3.1.3.0723")] +[assembly: AssemblyVersion("3.1.4.0724")] +[assembly: AssemblyFileVersion("3.1.4.0724")] diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 1d06be19..6c7b555a 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -222,6 +222,25 @@ namespace TShockAPI private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Log.Error(e.ExceptionObject.ToString()); + + if (e.ExceptionObject.ToString().Contains("Terraria.Netplay.ListenForClients") || + e.ExceptionObject.ToString().Contains("Terraria.Netplay.ServerLoop")) + { + var sb = new List(); + for (int i = 0; i < Netplay.serverSock.Length; i++) + { + if (Netplay.serverSock[i] == null) + { + sb.Add("Sock[" + i + "]"); + } + else if (Netplay.serverSock[i].tcpClient == null) + { + sb.Add("Tcp[" + i + "]"); + } + } + Log.Error(string.Join(", ", sb)); + } + if (e.IsTerminating) { if (Main.worldPathName != null) From 57a2d082ef68c864ef787f4b1a4b328e5b9e8c95 Mon Sep 17 00:00:00 2001 From: high Date: Sun, 24 Jul 2011 10:12:18 -0400 Subject: [PATCH 08/66] Added query function for easier queries. Normalized method names in GroupManager.cs --- TShockAPI/Commands.cs | 8 +- TShockAPI/DB/BanManager.cs | 118 +++++++------------ TShockAPI/DB/DbExt.cs | 40 ++++++- TShockAPI/DB/GroupManager.cs | 208 ++++++++++++---------------------- TShockAPI/DB/ItemManager.cs | 84 ++++++-------- TShockAPI/DB/RegionManager.cs | 9 +- TShockAPI/DB/SqlTable.cs | 11 ++ TShockAPI/TShockAPI.csproj | 3 +- 8 files changed, 205 insertions(+), 276 deletions(-) create mode 100644 TShockAPI/DB/SqlTable.cs diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 230add18..896cc4bd 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1218,7 +1218,7 @@ namespace TShockAPI args.Parameters.RemoveAt(0); String permissions = String.Join(",", args.Parameters ); - String response = TShock.Groups.addGroup(groupname, permissions); + String response = TShock.Groups.AddGroup(groupname, permissions); if( response.Length > 0 ) args.Player.SendMessage(response, Color.Green); } @@ -1234,7 +1234,7 @@ namespace TShockAPI { String groupname = args.Parameters[0]; - String response = TShock.Groups.delGroup(groupname); + String response = TShock.Groups.DeleteGroup(groupname); if (response.Length > 0) args.Player.SendMessage(response, Color.Green); } @@ -1256,14 +1256,14 @@ namespace TShockAPI if (com.Equals("add")) { - String response = TShock.Groups.addPermission(groupname, args.Parameters); + String response = TShock.Groups.AddPermissions(groupname, args.Parameters); if (response.Length > 0) args.Player.SendMessage(response, Color.Green); return; } else if (com.Equals("del") || com.Equals("delete")) { - String response = TShock.Groups.delPermission(groupname, args.Parameters); + String response = TShock.Groups.DeletePermissions(groupname, args.Parameters); if (response.Length > 0) args.Player.SendMessage(response, Color.Green); return; diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index b4beb54d..20bf5c84 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -34,45 +34,39 @@ namespace TShockAPI.DB { database = db; - using (var com = database.CreateCommand()) + string query; + if (TShock.Config.StorageType.ToLower() == "sqlite") + query = + "CREATE TABLE IF NOT EXISTS 'Bans' ('IP' TEXT PRIMARY KEY, 'Name' TEXT, 'Reason' TEXT);"; + else + query = + "CREATE TABLE IF NOT EXISTS Bans (IP VARCHAR(255) PRIMARY, Name VARCHAR(255), Reason VARCHAR(255));"; + + db.Query(query); + + String file = Path.Combine(TShock.SavePath, "bans.txt"); + if (File.Exists(file)) { - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'Bans' ('IP' TEXT PRIMARY KEY, 'Name' TEXT, 'Reason' TEXT);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = - "CREATE TABLE IF NOT EXISTS Bans (IP VARCHAR(255) PRIMARY, Name VARCHAR(255), Reason VARCHAR(255));"; - - com.ExecuteNonQuery(); - - String file = Path.Combine( TShock.SavePath, "bans.txt" ); - if (File.Exists(file)) + using (StreamReader sr = new StreamReader(file)) { - using (StreamReader sr = new StreamReader(file)) + String line; + while ((line = sr.ReadLine()) != null) { - String line; - while ((line = sr.ReadLine()) != null) - { - String[] info = line.Split('|'); - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO Bans SET IP=@ip, Name=@name, Reason=@reason;"; - com.AddParameter("@ip", info[0].Trim()); - com.AddParameter("@name", info[1].Trim()); - com.AddParameter("@reason", info[2].Trim()); - com.ExecuteNonQuery(); - com.Parameters.Clear(); - } + String[] info = line.Split('|'); + if (TShock.Config.StorageType.ToLower() == "sqlite") + query = "INSERT OR IGNORE INTO Bans (IP, Name, Reason) VALUES (@0, @1, @2);"; + else + query = "INSERT IGNORE INTO Bans SET IP=@0, Name=@1, Reason=@2;"; + db.Query(query, info[0].Trim(), info[1].Trim(), info[2].Trim()); } - String path = Path.Combine(TShock.SavePath, "old_configs"); - String file2 = Path.Combine(path, "bans.txt"); - if (!Directory.Exists(path)) - System.IO.Directory.CreateDirectory(path); - if (File.Exists(file2)) - File.Delete(file2); - File.Move(file, file2); } + String path = Path.Combine(TShock.SavePath, "old_configs"); + String file2 = Path.Combine(path, "bans.txt"); + if (!Directory.Exists(path)) + System.IO.Directory.CreateDirectory(path); + if (File.Exists(file2)) + File.Delete(file2); + File.Move(file, file2); } } @@ -80,17 +74,10 @@ namespace TShockAPI.DB { try { - using (var com = database.CreateCommand()) + using (var reader = database.QueryReader("SELECT * FROM Bans WHERE IP=@0", ip)) { - com.CommandText = "SELECT * FROM Bans WHERE IP=@ip"; - com.AddParameter("@ip", ip); - using (var reader = com.ExecuteReader()) - { - if (reader.Read()) - return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); - - reader.Close(); - } + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); } } catch (Exception ex) @@ -108,20 +95,14 @@ namespace TShockAPI.DB } try { - using (var com = database.CreateCommand()) + var namecol = casesensitive ? "Name" : "UPPER(Name)"; + if (!casesensitive) + name = name.ToUpper(); + using (var reader = database.QueryReader("SELECT * FROM Bans WHERE " + namecol + "=@0", name)) { - var namecol = casesensitive ? "Name" : "UPPER(Name)"; - if (!casesensitive) - name = name.ToUpper(); - com.CommandText = "SELECT * FROM Bans WHERE " + namecol + "=@name"; - com.AddParameter("@name", name); - using (var reader = com.ExecuteReader()) - { - if (reader.Read()) - return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); - reader.Close(); - } } } catch (Exception ex) @@ -135,15 +116,7 @@ namespace TShockAPI.DB { try { - using (var com = database.CreateCommand()) - { - com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason);"; - com.AddParameter("@ip", ip); - com.AddParameter("@name", name); - com.AddParameter("@reason", reason); - com.ExecuteNonQuery(); - } - return true; + return database.Query("INSERT INTO Bans (IP, Name, Reason) VALUES (@0, @1, @2);", ip, name, reason) != 0; } catch (Exception ex) { @@ -156,13 +129,7 @@ namespace TShockAPI.DB { try { - using (var com = database.CreateCommand()) - { - com.CommandText = "DELETE FROM Bans WHERE IP=@ip"; - com.AddParameter("@ip", ip); - com.ExecuteNonQuery(); - return true; - } + return database.Query("DELETE FROM Bans WHERE IP=@ip", ip) != 0; } catch (Exception ex) { @@ -174,12 +141,7 @@ namespace TShockAPI.DB { try { - using (var com = database.CreateCommand()) - { - com.CommandText = "DELETE FROM Bans"; - com.ExecuteNonQuery(); - return true; - } + return database.Query("DELETE FROM Bans") != 0; } catch (Exception ex) { diff --git a/TShockAPI/DB/DbExt.cs b/TShockAPI/DB/DbExt.cs index 13942cf2..49014ac8 100644 --- a/TShockAPI/DB/DbExt.cs +++ b/TShockAPI/DB/DbExt.cs @@ -7,7 +7,45 @@ using System.Text; namespace TShockAPI.DB { public static class DbExt - { + { + + /// + /// Executes a query on a database. + /// + /// 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) + { + using (var com = db.CreateCommand()) + { + com.CommandText = query; + for (int i = 0; i < args.Length; i++) + com.AddParameter("@" + i, args[i]); + + return com.ExecuteNonQuery(); + } + } + /// + /// Executes a query on a database. + /// + /// 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) + { + using (var com = db.CreateCommand()) + { + com.CommandText = query; + for (int i = 0; i < args.Length; i++) + com.AddParameter("@" + i, args[i]); + + return com.ExecuteReader(); + } + } + public static IDbDataParameter AddParameter(this IDbCommand command, string name, object data) { var parm = command.CreateParameter(); diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index bd0edb4e..c82b2eaa 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -18,17 +18,15 @@ namespace TShockAPI.DB { database = db; - using (var com = database.CreateCommand()) - { - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'GroupList' ('GroupName' TEXT PRIMARY KEY, 'Commands' TEXT, 'OrderBy' TEXT);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = - "CREATE TABLE IF NOT EXISTS GroupList (GroupName VARCHAR(255) PRIMARY, Commands VARCHAR(255), OrderBy VARCHAR(255));"; + string query; + if (TShock.Config.StorageType.ToLower() == "sqlite") + query = + "CREATE TABLE IF NOT EXISTS 'GroupList' ('GroupName' TEXT PRIMARY KEY, 'Commands' TEXT, 'OrderBy' TEXT);"; + else + query = + "CREATE TABLE IF NOT EXISTS GroupList (GroupName VARCHAR(255) PRIMARY, Commands VARCHAR(255), OrderBy VARCHAR(255));"; - com.ExecuteNonQuery(); - } + db.Query(query); //Add default groups AddGroup("trustedadmin", "admin,maintenance,cfg,butcher,item,heal,immunetoban,ignorecheatdetection,ignoregriefdetection,usebanneditem,manageusers"); @@ -60,18 +58,14 @@ namespace TShockAPI.DB comms = comms + ","; comms = comms + info[i].Trim(); } - using (var com = database.CreateCommand()) - { - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - com.AddParameter("@groupname", info[0].Trim()); - com.AddParameter("@commands", comms); - com.AddParameter("@order", hasOrder ? info[info.Length - 1] : "0"); - com.ExecuteNonQuery(); - } + if (TShock.Config.StorageType.ToLower() == "sqlite") + query = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@0, @1, @2);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + query = "INSERT IGNORE INTO GroupList SET GroupName=@0, Commands=@1, OrderBy=@2;"; + + db.Query(query, info[0].Trim(), comms, hasOrder ? info[info.Length - 1] : "0"); + } } } @@ -86,27 +80,6 @@ namespace TShockAPI.DB } - /// - /// Adds group with name and permissions if it does not exist. - /// - /// name of group - /// permissions - public void AddGroup(string name, string commands) - { - using (var com = database.CreateCommand()) - { - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = - "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = - "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - com.AddParameter("@groupname", name); - com.AddParameter("@commands", commands); - com.AddParameter("@order", "0"); - com.ExecuteNonQuery(); - } - } public bool GroupExists(string group) { @@ -123,93 +96,74 @@ namespace TShockAPI.DB return false; } - public String addGroup(String name, String permissions) + /// + /// Adds group with name and permissions if it does not exist. + /// + /// name of group + /// permissions + public String AddGroup(String name, String permissions) { String message = ""; - if( GroupExists( name ) ) + if (GroupExists(name)) return "Error: Group already exists. Use /modGroup to change permissions."; - using (var com = database.CreateCommand()) - { - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; - com.AddParameter("@groupname", name); - com.AddParameter("@commands", permissions); - com.AddParameter("@order", "0"); - if (com.ExecuteNonQuery() == 1) - message = "Group " + name + " has been created successfully."; - Group g = new Group(name); - g.permissions.Add(permissions); - groups.Add(g); - } + + + + string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? + "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@0, @1, @2);" : + "INSERT IGNORE INTO GroupList SET GroupName=@0, Commands=@1, OrderBy=@2;"; + if (database.Query(query, name, permissions, "0") == 1) + message = "Group " + name + " has been created successfully."; + Group g = new Group(name); + g.permissions.Add(permissions); + groups.Add(g); + return message; } - public String delGroup(String name) + public String DeleteGroup(String name) { String message = ""; if (!GroupExists(name)) return "Error: Group doesn't exists."; - using (var com = database.CreateCommand()) - { - com.CommandText = "Delete FROM GroupList WHERE GroupName=@groupname;"; - com.AddParameter("@groupname", name); - if (com.ExecuteNonQuery() == 1) - message = "Group " + name + " has been deleted successfully."; - groups.Remove(Tools.GetGroup(name)); - } + + if (database.Query("DELETE FROM GroupList WHERE GroupName=@0", name) == 1) + message = "Group " + name + " has been deleted successfully."; + groups.Remove(Tools.GetGroup(name)); + return message; } - public String addPermission(String name, List permissions) + public String AddPermissions(String name, List permissions) { String message = ""; if (!GroupExists(name)) return "Error: Group doesn't exists."; - using (var com = database.CreateCommand()) - { - Group g = Tools.GetGroup(name); - List perm = g.permissions; - foreach (String p in permissions) - { - if (!perm.Contains(p)) - { - if (perm.Count > 0 && perm[0].Equals("")) - perm[0] = p; - else - g.permissions.Add(p); - } - } - com.CommandText = "UPDATE GroupList SET Commands=@perm WHERE GroupName=@name;"; - com.AddParameter("@perm", String.Join(",", perm)); - com.AddParameter("@name", name); - if (com.ExecuteNonQuery() == 1) - message = "Group " + name + " has been modified successfully."; - } + + var group = Tools.GetGroup(name); + //Add existing permissions (without duplicating) + permissions.AddRange(group.permissions.Where(s => !permissions.Contains(s))); + + if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", String.Join(",", permissions), name) != 0) + message = "Group " + name + " has been modified successfully."; + return message; } - public String delPermission(String name, List permissions) + public String DeletePermissions(String name, List permissions) { String message = ""; if (!GroupExists(name)) return "Error: Group doesn't exists."; - using (var com = database.CreateCommand()) - { - Group g = Tools.GetGroup(name); - List perm = g.permissions; - foreach (String p in permissions) - { - if (perm.Contains(p)) - g.permissions.Remove(p); - } - com.CommandText = "UPDATE GroupList SET Commands=@perm WHERE GroupName=@name;"; - com.AddParameter("@perm", String.Join(",", perm)); - com.AddParameter("@name", name); - if (com.ExecuteNonQuery() == 1) - message = "Group " + name + " has been modified successfully."; - } + + var group = Tools.GetGroup(name); + + //Only get permissions that exist in the group. + var newperms = permissions.Where(s => group.permissions.Contains(s)); + + if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", String.Join(",", newperms), name) != 0) + message = "Group " + name + " has been modified successfully."; + return message; } @@ -220,41 +174,23 @@ namespace TShockAPI.DB try { - using (var com = database.CreateCommand()) - { - com.CommandText = "SELECT * FROM Grouplist;"; - using (var reader = com.ExecuteReader()) - { - while (reader.Read()) - { - Group group = null; - string groupname = reader.Get("GroupName"); - group = new Group(groupname); - //Inherit Given commands - String[] commands = reader.Get("Commands").Split(','); - for (int i = 0; i < commands.Length; i++) - { - group.AddPermission(commands[i].Trim()); - } - groups.Add(group); - } - } - /** ORDER BY IS DUMB - //Inherit all commands from group below in order, unless Order is 0 (unique groups anyone) - foreach (Group group in groups) + using (var reader = database.QueryReader("SELECT * FROM Grouplist;")) + { + while (reader.Read()) { - if (group.Order != 0 && group.Order < groups.Count) + Group group = null; + string groupname = reader.Get("GroupName"); + group = new Group(groupname); + + //Inherit Given commands + String[] commands = reader.Get("Commands").Split(','); + for (int i = 0; i < commands.Length; i++) { - for (int i = group.Order + 1; i < groups.Count; i++) - { - for (int j = 0; j < groups[i].permissions.Count; j++) - { - group.AddPermission(groups[i].permissions[j]); - } - } + group.AddPermission(commands[i].Trim()); } - }*/ + groups.Add(group); + } } } catch (Exception ex) diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs index 12ddb646..d30c580f 100644 --- a/TShockAPI/DB/ItemManager.cs +++ b/TShockAPI/DB/ItemManager.cs @@ -18,48 +18,42 @@ namespace TShockAPI.DB { database = db; - using (var com = database.CreateCommand()) + + string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? + "CREATE TABLE IF NOT EXISTS 'ItemBans' ('ItemName' TEXT PRIMARY KEY);" : + "CREATE TABLE IF NOT EXISTS ItemBans (ItemName VARCHAR(255) PRIMARY);"; + database.Query(query); + + String file = Path.Combine(TShock.SavePath, "itembans.txt"); + if (File.Exists(file)) { - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'ItemBans' ('ItemName' TEXT PRIMARY KEY);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = - "CREATE TABLE IF NOT EXISTS ItemBans (ItemName VARCHAR(255) PRIMARY);"; - com.ExecuteNonQuery(); - - String file = Path.Combine(TShock.SavePath, "itembans.txt"); - if (File.Exists(file)) + using (StreamReader sr = new StreamReader(file)) { - using (StreamReader sr = new StreamReader(file)) + String line; + while ((line = sr.ReadLine()) != null) { - String line; - while ((line = sr.ReadLine()) != null) + if (!line.Equals("") && !line.Substring(0, 1).Equals("#")) { - if (!line.Equals("") && !line.Substring(0, 1).Equals("#")) - { - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = "INSERT OR IGNORE INTO 'ItemBans' (ItemName) VALUES (@name);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = "INSERT IGNORE INTO ItemBans SET ItemName=@name;"; - int id = 0; - int.TryParse(line, out id); - com.AddParameter("@name", Tools.GetItemById(id).name); - com.ExecuteNonQuery(); - com.Parameters.Clear(); - } + query = (TShock.Config.StorageType.ToLower() == "sqlite") ? + "INSERT OR IGNORE INTO 'ItemBans' (ItemName) VALUES (@0);" : + "INSERT IGNORE INTO ItemBans SET ItemName=@0;"; + + int id = 0; + int.TryParse(line, out id); + + database.Query(query, Tools.GetItemById(id).name); } } - - String path = Path.Combine(TShock.SavePath, "old_configs"); - String file2 = Path.Combine(path, "itembans.txt"); - if (!Directory.Exists(path)) - System.IO.Directory.CreateDirectory(path); - if (File.Exists(file2)) - File.Delete(file2); - File.Move(file, file2); } + + String path = Path.Combine(TShock.SavePath, "old_configs"); + String file2 = Path.Combine(path, "itembans.txt"); + if (!Directory.Exists(path)) + System.IO.Directory.CreateDirectory(path); + if (File.Exists(file2)) + File.Delete(file2); + File.Move(file, file2); } UpdateItemBans(); @@ -74,7 +68,7 @@ namespace TShockAPI.DB using (var reader = com.ExecuteReader()) { - while (reader!=null&&reader.Read()) + while (reader != null && reader.Read()) ItemBans.Add(reader.Get("ItemName")); } } @@ -83,14 +77,9 @@ namespace TShockAPI.DB { try { - using (var com = database.CreateCommand()) - { - com.CommandText = "INSERT INTO ItemBans (ItemName) VALUES (@itemname);"; - com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); - com.ExecuteNonQuery(); - if( !ItemIsBanned( itemname ) ) - ItemBans.Add(itemname); - } + database.Query("INSERT INTO ItemBans (ItemName) VALUES (@0);", Tools.GetItemByName(itemname)[0].name); + if (!ItemIsBanned(itemname)) + ItemBans.Add(itemname); } catch (Exception ex) { @@ -104,13 +93,8 @@ namespace TShockAPI.DB return; try { - using (var com = database.CreateCommand()) - { - com.CommandText = "Delete FROM 'ItemBans' WHERE ItemName=@itemname;"; - com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); - com.ExecuteNonQuery(); - ItemBans.Remove(itemname); - } + database.Query("Delete FROM 'ItemBans' WHERE ItemName=@0;", Tools.GetItemByName(itemname)[0].name); + ItemBans.Remove(itemname); } catch (Exception ex) { diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index 2c298dca..f05126c4 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -43,14 +43,11 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { - if (TShock.Config.StorageType.ToLower() == "sqlite") - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'Regions' ('X1' NUMERIC, 'Y1' NUMERIC, 'height' NUMERIC, 'width' NUMERIC, 'RegionName' TEXT PRIMARY KEY, 'WorldID' TEXT, 'UserIds' TEXT, 'Protected' NUMERIC);"; - else if (TShock.Config.StorageType.ToLower() == "mysql") - com.CommandText = + string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? + "CREATE TABLE IF NOT EXISTS 'Regions' ('X1' NUMERIC, 'Y1' NUMERIC, 'height' NUMERIC, 'width' NUMERIC, 'RegionName' TEXT PRIMARY KEY, 'WorldID' TEXT, 'UserIds' TEXT, 'Protected' NUMERIC);": "CREATE TABLE IF NOT EXISTS Regions (X1 INT(11), Y1 INT(11), height INT(11), width INT(11), RegionName VARCHAR(255) PRIMARY, WorldID VARCHAR(255), UserIds VARCHAR(255), Protected INT(1));"; - com.ExecuteNonQuery(); + database.Query(query); String file = Path.Combine(TShock.SavePath, "regions.xml"); String name = ""; diff --git a/TShockAPI/DB/SqlTable.cs b/TShockAPI/DB/SqlTable.cs new file mode 100644 index 00000000..4d1dc44c --- /dev/null +++ b/TShockAPI/DB/SqlTable.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TShockAPI.DB +{ + class SqlTable + { + } +} diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index ab773528..06d95c87 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -96,6 +96,7 @@ + @@ -170,7 +171,7 @@ - + c-$yBe=vKlqah-t4uC4CzTocHb9@$~<|Ngsjiyd~lkuXWy+yuHU;iYj0p z4AAtJwGj5=Ev&Mq47tbT=w~L(A$UZ39auzqJxY6OZiK9egAp&)++Be%R4u&$To}_v zJX~EGA(ZJXsVf$9`-|0VK&r<3J^BlNs_k4_X}s+^jWFml2x8xX?EkmOvdk}_GpMIG zaSuXQH6!*5SgAB~VSkSp|0!bPCx}7K>7r^GUQfC`6y2peP+-HN>6q-ck@humGI4W* zQ|X(qQT_?FKrFuljCf?7$DMe@S`ZapsYbW&LRBh*>eIPnfSW=6aqi3+%9*<%)(E-( zVK>a?2(WoS-Jy(cLq-8MQ;33SG^1)QcS8_&VfOS~7?k2LGFFibEks&PO2}X>Q0y(> ztPKen!GK!=_~ySaMk25{ynPO*pQ^``E8XN!ny!lIQh`BUG_A_k!4wv0 zGN#UT#klHcxqHwa!1G=_Bbv^spZlvP&lyUMsg14)RCm?fhCoP@eK=h>%1>j!EuX7_ z`FL%&+{b;GA=BQ*6^lYvY5IOtQ4x3vnO6D%Ms&O=WMQ);4Y5L2?#3)+Mm)G+^1##1 zA`K{|w!&!@Nx(w`;8eU&;d$vF$33!7+y!R1OJB=&lycZRP??X=%#68;N58WZMtEEg zcENh-1|-VT2rP+~ZnzGeM?4`<)U!S0*%`88olUWj=Cs8-+u|Wzwq>kDXJbOH35U0& zv$>>8bIU`pAYxb{BN|KZLY+(m)M+E*$U40#Zl!<8ti1ot`43J-qQFvo7p;7=DZScx zw`oL7_!OsP1-VI3ivFr9a(67SFFqA_>YTWJa5G*MI8L3D%j|r8#~^=PN=Z6i>z&6b z2B2pg1;}eqFr+I3gEJH$fpjWhkf%HH!@ANL;5eqy5*WyTBHB6tZO-Lg>p-rS+PG`cNh3E27;E*%X;5O{eH^?1~je`cbbv}aNiM2hSD^%5s zH|PD?oXM;Vp7FL|_}!7Oy9>q;pq9}v8#RhdDEq()sOnKlk*5iQW+yUWm2`jYpqtJ^3 z2-n4OwiTD4U_v<$rTeBhoy<-Vd|*6{>|8#;5vd55jE({AOxqqx?F+%ZFI}e)bkmQ1B%m&S4m6fpTJ!R~Wp>#V!S2xXdB)5@F&5CQ2Pu*Feq2 zyh5%nlS2K`9@U&LS)g2{@lamM@+#(1#zl5yX>kU-nu!>qbHqZd#DzTls_B12t3z`& zLZ0;?VE8x#J>KeK{yw4&4b$E68_8MNZpfxnobC}b?+PR59LNiK?8lakGbv^;^P^K} z9F-du=lsM;LmDr5N9fL?yGdiC5UBiB36x5@*LnC1v)jz+bDT4TG@khon4Nstc$q(Q z1_MUO3|Q3$6!8O!x);uzeg+>_5c9P;eEj%6AMeSq=9sS?4D+B+KAAJ+YQz<~DmQOf z)L3rY%c71&oESrp$1-R6Te+Vwow&&L3kKxSk>r^EGnYQOlkOZmkmPdxbKKm{hVtDd zcN>HLVN6$@FXymn#3>D@0hdR54W6ZQ9VI{KPT+sOyue~9lELCCO+Sv1@l{*$*0s|J zjV^)waF*x0L9)7+%K()3E?Bky$*cAWh%R#{&or{F$slZyada(u!vB){IWtgAo~pjc zRql6!RZz|2xByQXAS+?0_Lcy$Q_z|I4GM@OvMcCJ+FsCvx}KTSPohrMM$5nBxr~=w zM$lL&9l>_5g!NsOKIJGyboV@y^fc>CKZ9}?>-FYT8dbxDx~qv(=3@AeB!sPslS3q2 zz))rlz>K;}CRk^gv+z|+c2WZ1jb0w((wwdvVWPrEC?{b!XQA_8yx_Btv7URD3nq6? za%jAo*0UMkqh*}XU(ZH;kLX0Pd;|OdZ51nJYx6W8Jn3|}7Btxm7wfbZJ{k!lTb_l( zyvAG7KRje{_!jPRY;xw{aT;_>mKk^DG6%!*M06$oO`8(Zwolj0rFP{r~fj*{b4|7j%s-s&NH13?0xJ= zTv;E_jFB5^`NM|%j|GlLyO+w<~DD?FQc9} zJD1Y}m#4R_<8O5MPoW(9prH7J8;O3wV zZQd?l`^#Y%_HWTFQ=k9%1pZwD|JWh_yM*H*?6b}=G_0K}7RY5GO}e;`-)YEjOSNw6 zIC$a3%fF96j{>(K-NrbVCv5rUS2&h)Rtvy#gQrWRUxg8;UDO5hH2Z#VsZ*UCge0U% zmqH!=NauscxLV2gUhunw?lFi*}FlPOkE8}+`Aq95M9XV=pwK3>B(^@RtS#} zQR#$T0WC)l-X=Up@zXxU_R79;hBy;rKgNbUoYMn&o)|=!t4EP~Ty>321&Y+?s%^~c zJsSba26TErwXp>|ZHTNG`AsU$uB#}`yaAh_kPXduP!0zEtFxKfz?Y+4SC86d5>?Tt zVR3YcCmw!EPSnZ^kvut)FbV7=c?l?4`?kCZm2IF4t?G`-iV+n(aHqPGXcL|l-B6!$ z=TSB)au1S>8BZ>Fo2K_$4)T5}E&~aJ*U6z58kGuxemy|>2loHmwLe{s) za%K|kQJRNGPr5U?JZaD~+(e#k-|WrUH;IWammIW0^bc9urCh&SmUqbVce4C%S@tVC z2I}>)yjPZQ$x=^p`>^D(?8xe~GMiEuH*Kb;lnUf{4en+1TjgwgyKtwA4lC#2!sUZJ z8iB<-u&2X$Oc{&Ba6+Or)?bv#NVQ+N=x@rUoOorltg(c+5=kT`QM(lu(|}SLm)KKG zMp%w=P<)WM6lj`*s9wy(%t zCDl8DCb{Trbt{fC*YPzvv(~BG0Gk{ly5EPJ(@!LNg%)aa5G2DZB_}P@UITj7MXR(! zI7+^gM@Nu`K624o(3148JUW7JU_-qeEm`PHQL2}`33?49JO()YEGD+oRuFs8>o%iX z=^^bnkky;fYxEoK7{0K$81EV8d>WkP^a);ej6T%<3bdQk0*2J47hy_2a8U&J4NtqoSYGJMzyM zJ0RB4I2XMKG>VqE=>GtXrrj?3+PXs-L$A0<^Dyc&z%i!Ovju3Hi)tj=?xK;NZJ_OQ z(KLxZ86cy2GcEP(0MWv=1Fz|&o`;os8t0;QppB(DF1i=!0=mydj{}XPLlSk+QO{$_ zc}Z+cs}|E~9}vdB znbN+&Viw(p%MM2EzR`%meR*`DSU?rH$Y9zAU!!OyKKSs$x!1RqTIgGEnoWZ!zErm-r6|-b`P)$nf6)#8({LVZy&a z+(I!I_4Y3YN;wDtyhJRaha4o6&kA}>A}2Am(kl`X@dIUC$ z42?LCiJPfU-~sV7y2wRC1HTlv(o`3X3H(~Dp<7%uIq;;oo$hi`W8iu5b9&rGvjPXi zdOGByMS+82BYo_k46O*fB{tD_E^!6Azk~cEo$hZ7920lZEEi?b#ohFfiyjR8MQo*G zF4`0LP~1abyXcv~XX0K;)j3)Y1ilpa(Kr{q5%@}MqeU*t{4wx<#r?F!h3^Mc^#R)F zqQ3<^>UR3XMPCI9)E#7vBK&Q}{duvvQ~q3oQ6P8@JxJqRS|C`eK159}iUrHnU(y~I z^$dO`9wyIdN6W;F=&kOixC>Wlqtr*J$wmCae3TB2VOD32?4g$=t%DvfIbiLfH(c}) z&|~zji%LrmSdY_ZF1i@#H}qdFS`G9hc^sYeTxsTj^%TWj_&JErknN(1vZK~>RPUlj zpyz42i#7tiKr3AITc8(di;KPndWoKNQBCrw^)k&G>x{Q4I8EJ04LEkQ*P4T~GU@>; z9OuB+;C%JB)F+P?tFO?wJX)r{Msr+rTX23GYw8DCFbp|6e_OVu-!>g`o?Tt1i<{ zD&IyLv`>{_(bd|QO7Eful;;)A)D$sD%+-2`RYh~iqwuTSqpT}x(-O+Aq7JQ}c)92v zZ76sS(I{Dt7gq5OZ9LY_qoDRE{qZ*>z|?=f>Mjt>FuH{dcMAtYNHeMwc_09#rl^tDY})uq$^O) zrE6uGj$W?sr`Bi_HBu%zU2mi{(d$uWQST7HiZ0YoDo;fhbBk7jEx?P>E3rE`9NmOX z=ZDcH(?R|;vXxFMuN1G5tm{zzE7}03cw#Toco;MXyWA_yZ92ZtjxEu5h*WHk{)niJ zJqM#F#9oG3Y_x|qV;fRN7sn36ph4mt45Kktmwj<~Eb}3B-W2;xFQZKC3zWCV=FqcZ zORSf1Qn^1?W9%1ewSmU7;?dYp*-~#D6wk&kF^-7e#jZ3Oi7jk|{yCt&6RT8q(4S(r z7(3{%F-)HD#@mfgQLZr_!7k(ul<&wg5#M4|u>BeQ9;Z3>peoTkByV`Iy9W5KcM6o z*+$<8N_>I#rr^JfX0j6B8JT8S5jLACk|;sRtj$uanMxD=&68jnX6}c&KdUpSGSOhp z!1lJu{1Vd|!F1Oqxa^PeQyP-E8SV9`E9h*9t|+WcQP>DY;eja%59}NCxXM)2%Mxo% zC8MrQbO1b%*kXoMp3qO}*~F9Pr}VNcUq#si?azaHDsez^9ya??NeNl|(R~vlrdNq! z^`k*0Z)-g1bFihIP_mWALyEVzb4rS=gW|A~M7g+Ru62oQA4uy)w4tV zC(7P(b+>1mM?QG*(*EzO;%ey?ycTA^M`cik?AB3&l~-(qNSLva@j_n~wHU z+KsYY@>I)m0KJ5kb7lJ&dIR-|^vvGoy2B!Kg?F?zUb{tGtv#*1svXqc)ZWu{y_?=s zze-=Bcj&wHC-gt-U+EDeY4kMCGbS3-jfF;wvBFqq+;2Q#ykfj*ykl5qFSEuRWllD) zGgq2B&G*f3&7hUA$}QXKYYnu9S#{P}Ym#-Tb)_}UnrWr2o2(bC53Ns4E8!XJxx};g zzA=v}p^e%>{UPHSv(>uC+G*{z-p^ij{u9cgY+&r*qHncpDQFZcJn&t2a2Weghbp)sGgq3j)JS1YLUVaO z=HkDEY;CpRhj4MYy%p`@q2UGLVhr2DXLH&+LhW~j+P8*N7Q{kr?NYLRTey8~-1Iqu?Q8vh zKRCn9kV^V7eHmD!6UHAf@q-eMM$8yO8=;`+mX_XSwSk14m3I((DVlR9(-Q9?~nVAgpRDI(jkU?kKDERgJ53(7Tg zT9*CCg4$7j)07Jm7b>`Kfg8J#-_)_{!skP*8^M3jWxx$QXjAv2gnw^X z_@=;G8Js>+L%DwvE3k!|kI&cm2J7pkM3+vfpAwt3{a?{bwoPjP{PsN`zcuQG?7&5% zD`Zlb)-ZY0xY Date: Thu, 4 Aug 2011 21:53:02 +1200 Subject: [PATCH 60/66] Adds SQL Queries for Update, Read and Insert --- TShockAPI/DB/IQueryBuilder.cs | 141 ++++++++++++++++++++++++++++++++++ TShockAPI/DB/SqlValue.cs | 53 +++++++++++++ TShockAPI/Extensions/DbExt.cs | 1 + TShockAPI/TShockAPI.csproj | 3 +- 4 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 TShockAPI/DB/SqlValue.cs diff --git a/TShockAPI/DB/IQueryBuilder.cs b/TShockAPI/DB/IQueryBuilder.cs index 8eede642..9967797e 100644 --- a/TShockAPI/DB/IQueryBuilder.cs +++ b/TShockAPI/DB/IQueryBuilder.cs @@ -13,6 +13,9 @@ namespace TShockAPI.DB string CreateTable(SqlTable table); string AlterTable(SqlTable from, SqlTable to); string DbTypeToString(MySqlDbType type, int? length); + string UpdateValue(string table, List values, List wheres); + string InsertValues(string table, List values); + string ReadColumn(string table, List wheres); } public class SqliteQueryCreator : IQueryBuilder @@ -44,9 +47,79 @@ namespace TShockAPI.DB CREATE TABLE "main"."Bans" ("IP" TEXT PRIMARY KEY ,"Name" TEXT) INSERT INTO "main"."Bans" SELECT "IP","Name" FROM "main"."oXHFcGcd04oXHFcGcd04_Bans" DROP TABLE "main"."oXHFcGcd04oXHFcGcd04_Bans" + * + * Twitchy - Oh. I get it! */ } + public string UpdateValue(string table, List values, List wheres) + { + var sbvalues = new StringBuilder(); + var sbwheres = new StringBuilder(); + int count = 0; + foreach (SqlValue value in values) + { + sbvalues.Append(value.Name + "=" + value.Value.ToString()); + if (count != values.Count - 1) + sbvalues.Append(","); + count++; + } + count = 0; + foreach (SqlValue where in wheres) + { + sbwheres.Append(where.Name + "=" + where.Value.ToString()); + if (count != wheres.Count - 1) + sbvalues.Append(" AND "); + count++; + } + if (wheres.Count > 0) + return "UPDATE '{0}' SET {1} WHERE {2}".SFormat(table, sbvalues.ToString(), sbwheres.ToString()); + else + return "UPDATE '{0}' SET {1}".SFormat(table, sbvalues.ToString()); + } + public string InsertValues(string table, List values) + { + var sbnames = new StringBuilder(); + var sbvalues = new StringBuilder(); + int count = 0; + + foreach (SqlValue name in values) + { + sbnames.Append(name.Name); + + if (count != values.Count - 1) + sbnames.Append(", "); + count++; + } + count = 0; + foreach (SqlValue value in values) + { + sbvalues.Append(value.Value.ToString()); + if (count != values.Count - 1) + sbvalues.Append(", "); + count++; + } + + return "INSERT INTO '{0}' ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString()); + } + public string ReadColumn(string table, List wheres) + { + var sbwheres = new StringBuilder(); + int count = 0; + + foreach (SqlValue where in wheres) + { + sbwheres.Append(where.Name + "=" + where.Value.ToString()); + if (count != wheres.Count - 1) + sbwheres.Append(" AND "); + count++; + } + + if(wheres.Count > 0) + return "SELECT * FROM {0} WHERE {1}".SFormat(table, sbwheres.ToString()); + else + return "SELECT * FROM {0}".SFormat(table); + } static readonly Dictionary TypesAsStrings = new Dictionary { @@ -92,7 +165,75 @@ namespace TShockAPI.DB var drop = "DROP TABLE {0}_{1}".SFormat(rstr, from.Name); return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop); } + public string UpdateValue(string table, List values, List wheres) + { + var sbvalues = new StringBuilder(); + var sbwheres = new StringBuilder(); + int count = 0; + foreach (SqlValue value in values) + { + sbvalues.Append(value.Name + "=" + value.Value.ToString()); + if (count != values.Count - 1) + sbvalues.Append("AND"); + count++; + } + count = 0; + foreach (SqlValue where in wheres) + { + sbwheres.Append(where.Name + "=" + where.Value.ToString()); + if (count != wheres.Count - 1) + sbvalues.Append(" AND "); + count++; + } + if (wheres.Count > 0) + return "UPDATE {0} SET {1} WHERE {2}".SFormat(table, sbvalues.ToString(), sbwheres.ToString()); + else + return "UPDATE {0} SET {1}".SFormat(table, sbvalues.ToString()); + } + public string InsertValues(string table, List values) + { + var sbnames = new StringBuilder(); + var sbvalues = new StringBuilder(); + int count = 0; + + foreach (SqlValue name in values) + { + sbnames.Append(name.Name); + + if (count != values.Count - 1) + sbnames.Append(", "); + count++; + } + count = 0; + foreach (SqlValue value in values) + { + sbvalues.Append(value.Value.ToString()); + if (count != values.Count - 1) + sbvalues.Append(", "); + count++; + } + + return "INSERT INTO {0} ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString()); + } + public string ReadColumn(string table, List wheres) + { + var sbwheres = new StringBuilder(); + int count = 0; + + foreach (SqlValue where in wheres) + { + sbwheres.Append(where.Name + "=" + where.Value.ToString()); + if (count != wheres.Count - 1) + sbwheres.Append(" AND "); + count++; + } + + if (wheres.Count > 0) + return "SELECT * FROM {0} WHERE {1}".SFormat(table, sbwheres.ToString()); + else + return "SELECT * FROM {0}".SFormat(table); + } static readonly Dictionary TypesAsStrings = new Dictionary { diff --git a/TShockAPI/DB/SqlValue.cs b/TShockAPI/DB/SqlValue.cs new file mode 100644 index 00000000..f74d3149 --- /dev/null +++ b/TShockAPI/DB/SqlValue.cs @@ -0,0 +1,53 @@ +using System.Data; +using MySql.Data.MySqlClient; +using System.Collections.Generic; + +namespace TShockAPI.DB +{ + public class SqlValue + { + public string Name { get; set; } + public object Value { get; set; } + + public SqlValue(string name, object value) + { + Name = name; + Value = value; + } + } + + public class SqlTableEditor + { + IDbConnection database; + IQueryBuilder creator; + + public SqlTableEditor(IDbConnection db, IQueryBuilder provider) + { + database = db; + creator = provider; + } + + public void UpdateValues(string table, List values, List wheres) + { + database.Query(creator.UpdateValue(table, values, wheres)); + } + + public void InsertValues(string table, List values) + { + database.Query(creator.InsertValues(table, values)); + } + + public List ReadColumn(string table, string column, List wheres) + { + List values = new List(); + + using (var reader = database.QueryReader(creator.ReadColumn(table, wheres))) + { + while (reader.Read()) + values.Add(reader.Reader.Get(column)); + } + + return values; + } + } +} diff --git a/TShockAPI/Extensions/DbExt.cs b/TShockAPI/Extensions/DbExt.cs index 25429577..e33459a7 100644 --- a/TShockAPI/Extensions/DbExt.cs +++ b/TShockAPI/Extensions/DbExt.cs @@ -87,6 +87,7 @@ 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) diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 476636cd..640654d5 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -98,6 +98,7 @@ + @@ -178,7 +179,7 @@ - +