diff --git a/Commands/Chat/CmdInbox.cs b/Commands/Chat/CmdInbox.cs index cb3576486..95d4c57e7 100644 --- a/Commands/Chat/CmdInbox.cs +++ b/Commands/Chat/CmdInbox.cs @@ -65,8 +65,7 @@ namespace MCGalaxy.Commands { //safe against SQL injections because no user input is given here if (num == -1) { - string syntax = Server.useMySQL ? "TRUNCATE TABLE `Inbox" + p.name + "`" : "DELETE FROM `Inbox" + p.name + "`"; - Database.Execute(syntax); + Database.Backend.ClearTable("Inbox" + p.name); } else { DataRow row = Inbox.Rows[num]; string syntax = "DELETE FROM `Inbox" + p.name + "` WHERE PlayerFrom=@0 AND TimeSent=@1"; diff --git a/Commands/Chat/CmdSend.cs b/Commands/Chat/CmdSend.cs index 924a7f2d0..b2482e0bf 100644 --- a/Commands/Chat/CmdSend.cs +++ b/Commands/Chat/CmdSend.cs @@ -38,7 +38,7 @@ namespace MCGalaxy.Commands { message = parts[1]; //DB - if (message.Length >= 256 && Server.useMySQL) { + if (message.Length >= 256 && Database.Backend.EnforcesTextLength) { Player.Message(p, "Message was too long. It has been trimmed to:"); Player.Message(p, message.Substring(0, 255)); message = message.Substring(0, 255); diff --git a/Commands/World/CmdBlockDB.cs b/Commands/World/CmdBlockDB.cs index d822d9fd8..a9d8e98b2 100644 --- a/Commands/World/CmdBlockDB.cs +++ b/Commands/World/CmdBlockDB.cs @@ -42,10 +42,7 @@ namespace MCGalaxy.Commands.World { if (args[0] == "clear") { Player.Message(p, "Clearing &cALL %Sblock changes for &d{0}...", lvl.name); - if (Server.useMySQL) - Database.Execute("TRUNCATE TABLE `Block" + lvl.name + "`"); - else - Database.Execute("DELETE FROM `Block" + lvl.name + "`"); + Database.Backend.ClearTable("Block" + lvl.name); Player.Message(p, "Cleared &cALL %Sblock changes for &d" + lvl.name); } else if (args[0] == "disable") { lvl.UseBlockDB = false; diff --git a/Database/IDatabaseBackend.cs b/Database/IDatabaseBackend.cs index 1fe369f52..6bd928080 100644 --- a/Database/IDatabaseBackend.cs +++ b/Database/IDatabaseBackend.cs @@ -25,6 +25,9 @@ namespace MCGalaxy.SQL { /// (such as database name or file location) public abstract string ConnectionString { get; } + /// Whether this backend enforces the character length in VARCHAR columns. + public abstract bool EnforcesTextLength { get; } + /// Returns a new BulkTransaction instance, which can be used to execute /// many sql statements as one single transaction. public abstract BulkTransaction CreateBulk(); @@ -42,5 +45,11 @@ namespace MCGalaxy.SQL { /// Returns whether a table (case sensitive) exists by that name. public abstract bool TableExists(string table); + + /// Renames the source table to the given name. + public abstract void RenameTable(string srcTable, string dstTable); + + /// Removes all entries from the given table. + public abstract void ClearTable(string table); } } diff --git a/Database/MySQL/MySQLBackend.cs b/Database/MySQL/MySQLBackend.cs index 229a62d0a..72432e513 100644 --- a/Database/MySQL/MySQLBackend.cs +++ b/Database/MySQL/MySQLBackend.cs @@ -30,7 +30,8 @@ namespace MCGalaxy.SQL { public override string ConnectionString { get { return String.Format(connFormat, Server.MySQLHost, Server.MySQLPort, Server.MySQLUsername, Server.MySQLPassword, Server.DatabasePooling); } - } + } + public override bool EnforcesTextLength { get { return true; } } public override BulkTransaction CreateBulk() { return new MySQLBulkTransaction(ConnectionString); @@ -50,5 +51,15 @@ namespace MCGalaxy.SQL { using (DataTable results = Database.Fill(syntax, table, Server.MySQLDatabaseName)) return results.Rows.Count > 0; } + + public override void RenameTable(string srcTable, string dstTable) { + string syntax = "RENAME TABLE `" + srcTable + "` TO `" + dstTable + "`"; + Database.Execute(syntax); + } + + public override void ClearTable(string table) { + string syntax = "TRUNCATE TABLE `" + table + "`"; + Database.Execute(syntax); + } } } diff --git a/Database/SQLite/SQLiteBackend.cs b/Database/SQLite/SQLiteBackend.cs index b7b37d532..efbb959b9 100644 --- a/Database/SQLite/SQLiteBackend.cs +++ b/Database/SQLite/SQLiteBackend.cs @@ -30,6 +30,7 @@ namespace MCGalaxy.SQL { public override string ConnectionString { get { return String.Format(connFormat, Server.DatabasePooling); } } + public override bool EnforcesTextLength { get { return false; } } public override BulkTransaction CreateBulk() { return new SQLiteBulkTransaction(ConnectionString); @@ -49,5 +50,15 @@ namespace MCGalaxy.SQL { using (DataTable results = Database.Fill(syntax, table)) return results.Rows.Count > 0; } + + public override void RenameTable(string srcTable, string dstTable) { + string syntax = "ALTER TABLE `" + srcTable + "` RENAME TO `" + dstTable + "`"; + Database.Execute(syntax); + } + + public override void ClearTable(string table) { + string syntax = "DELETE FROM `" + table + "`"; + Database.Execute(syntax); + } } } diff --git a/Levels/LevelActions.cs b/Levels/LevelActions.cs index f511cfbe1..b6ad4d226 100644 --- a/Levels/LevelActions.cs +++ b/Levels/LevelActions.cs @@ -55,24 +55,19 @@ namespace MCGalaxy { } BotsFile.MoveBots(src, dst); - //safe against SQL injections because foundLevel is being checked and, - //newName is being split and partly checked on illegal characters reserved for Windows. - string syntax = Server.useMySQL - ? "RENAME TABLE `{2}{0}` TO `{2}{1}`" : "ALTER TABLE `{2}{0}` RENAME TO `{2}{1}`"; - Database.Execute(String.Format(syntax, src, dst, "Block")); - + Database.Backend.RenameTable("Block" + src, "Block" + dst); object locker = ThreadSafeCache.DBCache.Get(src); lock (locker) { if (Database.TableExists("Portals" + src)) { - Database.Execute(String.Format(syntax, src, dst, "Portals")); + Database.Backend.RenameTable("Portals" + src, "Portals" + dst); string updateSyntax = "UPDATE `Portals" + dst + "` SET ExitMap=@1 WHERE ExitMap=@0"; Database.Execute(updateSyntax, src, dst); } if (Database.TableExists("Messages" + src)) { - Database.Execute(String.Format(syntax, src, dst, "Messages")); + Database.Backend.RenameTable("Messages" + src, "Messages" + dst); } if (Database.TableExists("Zone" + src)) { - Database.Execute(String.Format(syntax, src, dst, "Zone")); + Database.Backend.RenameTable("Zone" + src, "Zone" + dst); } } }