diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index ee375789..e6c17b61 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -19,6 +19,7 @@ along with this program. If not, see . using System; using System.Data; using System.IO; +using MySql.Data.MySqlClient; namespace TShockAPI.DB { @@ -30,15 +31,13 @@ namespace TShockAPI.DB { database = db; - 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); + var table = new SqlTable("Bans", + new SqlColumn("IP", MySqlDbType.String, 16) { Primary = true }, + new SqlColumn("Name", MySqlDbType.Text), + new SqlColumn("Reason", MySqlDbType.Text) + ); + var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); + creator.EnsureExists(table); String file = Path.Combine(TShock.SavePath, "bans.txt"); if (File.Exists(file)) @@ -49,6 +48,7 @@ namespace TShockAPI.DB while ((line = sr.ReadLine()) != null) { String[] info = line.Split('|'); + string query; if (TShock.Config.StorageType.ToLower() == "sqlite") query = "INSERT OR IGNORE INTO Bans (IP, Name, Reason) VALUES (@0, @1, @2);"; else diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 93b093f4..b086822c 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -17,29 +17,13 @@ namespace TShockAPI.DB { database = db; - string query = ""; - - /*var table = new SqlTable("GroupList", + var table = new SqlTable("GroupList", new SqlColumn("GroupName", MySqlDbType.VarChar, 32) { Primary = true }, new SqlColumn("Commands", MySqlDbType.Text), new SqlColumn("ChatColor", MySqlDbType.Text) ); - - new SqlTableCreator(db, new MysqlQueryCreator()).EnsureExists(table);*/ - - - if (db.GetSqlType() == SqlType.Sqlite) - { - db.Query("CREATE TABLE IF NOT EXISTS 'GroupList' ('GroupName' TEXT PRIMARY KEY, 'Commands' TEXT);"); - db.Query("CREATE TEMPORARY TABLE 'GroupList_backup' ('GroupName' TEXT, 'Commands' TEXT); INSERT INTO 'GroupList_backup' SELECT GroupName,Commands FROM 'GroupList'; DROP TABLE 'GroupList'; CREATE TABLE 'GroupList' ('GroupName' TEXT PRIMARY KEY, 'Commands' TEXT); INSERT INTO 'GroupList' SELECT GroupName,Commands FROM 'GroupList_backup'; DROP TABLE 'GroupList_backup';"); - db.Query("ALTER TABLE 'GroupList' ADD COLUMN 'ChatColor' TEXT"); - } - else - { - db.Query("CREATE TABLE IF NOT EXISTS GroupList (GroupName VARCHAR(255) PRIMARY, Commands VARCHAR(255));"); - db.Query("ALTER TABLE GroupList DROP COLUMN OrderBy"); - db.Query("ALTER TABLE GroupList ADD COLUMN ChatColor VARCHAR(255)"); - } + var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); + creator.EnsureExists(table); //Add default groups AddGroup("trustedadmin", "admin,maintenance,cfg,butcher,item,heal,immunetoban,ignorecheatdetection,ignoregriefdetection,usebanneditem,manageusers"); @@ -68,6 +52,7 @@ namespace TShockAPI.DB comms = comms + info[i].Trim(); } + string query = ""; if (TShock.Config.StorageType.ToLower() == "sqlite") query = "INSERT OR IGNORE INTO GroupList (GroupName, Commands) VALUES (@0, @1);"; else if (TShock.Config.StorageType.ToLower() == "mysql") @@ -195,17 +180,13 @@ namespace TShockAPI.DB { group.AddPermission(commands[i].Trim()); } - try + String[] chatcolour = (reader.Get("ChatColor") ?? "").Split(','); + if (chatcolour.Length == 3) { - String[] chatcolour = reader.Get("ChatColor").Split(','); - if (chatcolour.Length == 3) - { - byte.TryParse(chatcolour[0], out group.R); - byte.TryParse(chatcolour[1], out group.G); - byte.TryParse(chatcolour[2], out group.B); - } + byte.TryParse(chatcolour[0], out group.R); + byte.TryParse(chatcolour[1], out group.G); + byte.TryParse(chatcolour[2], out group.B); } - catch { } groups.Add(group); } } diff --git a/TShockAPI/DB/IQueryBuilder.cs b/TShockAPI/DB/IQueryBuilder.cs index 903a18a4..e613d1fb 100644 --- a/TShockAPI/DB/IQueryBuilder.cs +++ b/TShockAPI/DB/IQueryBuilder.cs @@ -56,6 +56,7 @@ namespace TShockAPI.DB {MySqlDbType.TinyText, "TEXT"}, {MySqlDbType.MediumText, "TEXT"}, {MySqlDbType.LongText, "TEXT"}, + {MySqlDbType.Int32, "NUMERIC"}, }; public string DbTypeToString(MySqlDbType type, int? length) { @@ -101,6 +102,7 @@ namespace TShockAPI.DB {MySqlDbType.TinyText, "TINYTEXT"}, {MySqlDbType.MediumText, "MEDIUMTEXT"}, {MySqlDbType.LongText, "LONGTEXT"}, + {MySqlDbType.Int32, "INT"}, }; public string DbTypeToString(MySqlDbType type, int? length) { diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs index 3f49d599..d44db632 100644 --- a/TShockAPI/DB/ItemManager.cs +++ b/TShockAPI/DB/ItemManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.IO; +using MySql.Data.MySqlClient; namespace TShockAPI.DB { @@ -14,11 +15,11 @@ namespace TShockAPI.DB { database = db; - - 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); + var table = new SqlTable("ItemBans", + new SqlColumn("ItemName", MySqlDbType.VarChar, 50) { Primary = true } + ); + var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); + creator.EnsureExists(table); String file = Path.Combine(TShock.SavePath, "itembans.txt"); if (File.Exists(file)) @@ -31,7 +32,7 @@ namespace TShockAPI.DB if (!line.Equals("") && !line.Substring(0, 1).Equals("#")) { - query = (TShock.Config.StorageType.ToLower() == "sqlite") ? + string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? "INSERT OR IGNORE INTO 'ItemBans' (ItemName) VALUES (@0);" : "INSERT IGNORE INTO ItemBans SET ItemName=@0;"; diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index 40a4cfc5..76048d83 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -22,6 +22,7 @@ using System.Data; using System.IO; using System.Xml; using Microsoft.Xna.Framework; +using MySql.Data.MySqlClient; using Terraria; namespace TShockAPI.DB @@ -36,17 +37,21 @@ namespace TShockAPI.DB { database = db; - using (var com = database.CreateCommand()) - { - 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));"; + var table = new SqlTable("Regions", + new SqlColumn("X1", MySqlDbType.Int32), + new SqlColumn("Y1", MySqlDbType.Int32), + new SqlColumn("height", MySqlDbType.Int32), + new SqlColumn("width", MySqlDbType.Int32), + new SqlColumn("RegionName", MySqlDbType.VarChar, 50) { Primary = true }, + new SqlColumn("WorldID", MySqlDbType.Text), + new SqlColumn("UserIds", MySqlDbType.Text), + new SqlColumn("Protected", MySqlDbType.Int32) + ); + var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); + creator.EnsureExists(table); - database.Query(query); + ImportOld(); - - ImportOld(); - } } public void ImportOld() @@ -182,7 +187,7 @@ namespace TShockAPI.DB 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. + // 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]); } } diff --git a/TShockAPI/DB/RememberPosManager.cs b/TShockAPI/DB/RememberPosManager.cs index 3d1498f0..e1d89ed9 100644 --- a/TShockAPI/DB/RememberPosManager.cs +++ b/TShockAPI/DB/RememberPosManager.cs @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Xml; using System.Data; using Microsoft.Xna.Framework; +using MySql.Data.MySqlClient; using Terraria; namespace TShockAPI.DB @@ -33,15 +34,15 @@ namespace TShockAPI.DB { database = db; - string query; - if (TShock.Config.StorageType.ToLower() == "sqlite") - query = - "CREATE TABLE IF NOT EXISTS 'RememberedPos' ('Name' TEXT PRIMARY KEY, 'IP' TEXT, 'X' NUMERIC, 'Y' NUMERIC, 'WorldID' TEXT);"; - else - query = - "CREATE TABLE IF NOT EXISTS RememberedPos (Name VARCHAR(255) PRIMARY, IP VARCHAR(255), X INT(11), Y INT(11), WorldID VARCHAR(255));"; - - db.Query(query); + var table = new SqlTable("RememberedPos", + new SqlColumn("Name", MySqlDbType.VarChar, 50) { Primary = true }, + new SqlColumn("IP", MySqlDbType.Text), + new SqlColumn("X", MySqlDbType.Int32), + new SqlColumn("Y", MySqlDbType.Int32), + new SqlColumn("WorldID", MySqlDbType.Text) + ); + var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); + creator.EnsureExists(table); } public Vector2 GetLeavePos(string name, string IP) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 395d69bc..de943668 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -20,6 +20,7 @@ along with this program. If not, see . using System; using System.Data; using System.IO; +using MySql.Data.MySqlClient; namespace TShockAPI.DB { @@ -31,12 +32,15 @@ namespace TShockAPI.DB { database = db; - - string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? - "CREATE TABLE IF NOT EXISTS 'Users' ('ID' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, 'Username' VARCHAR(32) UNIQUE, 'Password' VARCHAR(64), 'Usergroup' TEXT, 'IP' VARCHAR(32));" : - "CREATE TABLE IF NOT EXISTS Users (ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, Username VARCHAR(32) UNIQUE, Password VARCHAR(64), Usergroup VARCHAR(255), IP VARCHAR(15));"; - - database.Query(query); + var table = new SqlTable("Users", + new SqlColumn("ID", MySqlDbType.Int32) { Primary = true, AutoIncrement = true }, + new SqlColumn("Username", MySqlDbType.VarChar, 32) { Unique = true }, + new SqlColumn("Password", MySqlDbType.VarChar, 64), + new SqlColumn("Usergroup", MySqlDbType.Text), + new SqlColumn("IP", MySqlDbType.VarChar, 32) + ); + var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); + creator.EnsureExists(table); String file = Path.Combine(TShock.SavePath, "users.txt"); if (File.Exists(file)) @@ -69,7 +73,7 @@ namespace TShockAPI.DB group = info[1]; } - query = (TShock.Config.StorageType.ToLower() == "sqlite") ? + string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? "INSERT OR IGNORE INTO Users (Username, Password, Usergroup, IP) VALUES (@0, @1, @2, @3)" : "INSERT IGNORE INTO Users SET Username=@0, Password=@1, Usergroup=@2, IP=@3"; diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs index 71f374b0..8b320149 100644 --- a/TShockAPI/DB/WarpsManager.cs +++ b/TShockAPI/DB/WarpsManager.cs @@ -22,6 +22,7 @@ using System.Data; using System.IO; using System.Xml; using Microsoft.Xna.Framework; +using MySql.Data.MySqlClient; using Terraria; namespace TShockAPI.DB @@ -34,16 +35,15 @@ namespace TShockAPI.DB { database = db; - string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? - "CREATE TABLE IF NOT EXISTS 'Warps' ('X' NUMERIC, 'Y' NUMERIC, 'WarpName' TEXT PRIMARY KEY, 'WorldID' TEXT);" : - "CREATE TABLE IF NOT EXISTS Warps (X INT(11), Y INT(11), WarpName VARCHAR(255) PRIMARY, WorldID VARCHAR(255));"; - - if (TShock.Config.StorageType.ToLower() == "sqlite") - db.Query("ALTER TABLE 'Warps' ADD COLUMN 'Private' TEXT"); - else - db.Query("ALTER TABLE Warps ADD COLUMN Private VARCHAR(255)"); - - database.Query(query); + var table = new SqlTable("Warps", + new SqlColumn("WarpName", MySqlDbType.VarChar, 50) { Primary = true}, + new SqlColumn("X", MySqlDbType.Int32), + new SqlColumn("Y", MySqlDbType.Int32), + new SqlColumn("WorldID", MySqlDbType.Text), + new SqlColumn("Private", MySqlDbType.Text) + ); + var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); + creator.EnsureExists(table); String file = Path.Combine(TShock.SavePath, "warps.xml"); String name = ""; @@ -102,7 +102,7 @@ namespace TShockAPI.DB case XmlNodeType.EndElement: if (reader.Name.Equals("Warp")) { - query = (TShock.Config.StorageType.ToLower() == "sqlite") ? + string query = (TShock.Config.StorageType.ToLower() == "sqlite") ? "INSERT OR IGNORE INTO Warps VALUES (@0, @1,@2, @3);" : "INSERT IGNORE INTO Warps SET X=@0, Y=@1, WarpName=@2, WorldID=@3;"; database.Query(query, x1, y1, name, world);