From 4bab43466c6c8389c65525fcd5f51313c951d150 Mon Sep 17 00:00:00 2001 From: high Date: Wed, 3 Aug 2011 02:52:44 -0400 Subject: [PATCH] Adding classes to make querying between sqlite/mysql easier --- TShockAPI/DB/GroupManager.cs | 11 ++++- TShockAPI/DB/IQueryCreator.cs | 28 +++++++++++ TShockAPI/DB/SqlColumn.cs | 27 ++++++++++ TShockAPI/DB/SqlTable.cs | 74 ++++++++++++++++++++++++++++ TShockAPI/Extensions/DbExt.cs | 19 ++++++- TShockAPI/PacketBufferer.cs | 2 +- TShockAPI/Properties/AssemblyInfo.cs | 4 +- TShockAPI/TShock.cs | 21 +++++--- TShockAPI/TShockAPI.csproj | 7 ++- 9 files changed, 179 insertions(+), 14 deletions(-) create mode 100644 TShockAPI/DB/IQueryCreator.cs create mode 100644 TShockAPI/DB/SqlColumn.cs create mode 100644 TShockAPI/DB/SqlTable.cs diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index efe4fed0..4fec6cb8 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -18,7 +18,16 @@ namespace TShockAPI.DB string query = ""; - if (TShock.Config.StorageType.ToLower() == "sqlite") + var table = new SqlTable("GroupList", + new SqlColumn("GroupName", "TEXT") { Primary = true }, + new SqlColumn("Commands", "TEXT"), + new SqlColumn("ChatColor", "TEXT") + ); + + //new SqlTableCreator(db).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';"); diff --git a/TShockAPI/DB/IQueryCreator.cs b/TShockAPI/DB/IQueryCreator.cs new file mode 100644 index 00000000..a8e4fabc --- /dev/null +++ b/TShockAPI/DB/IQueryCreator.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TShockAPI.DB +{ + public interface IQuery + { + string CreateTable(SqlTable table); + } + + public class SqliteQuery : IQuery + { + public string CreateTable(SqlTable table) + { + var columns = table.Columns.Select(c => "'{0}' {1} {2} {3} {4}".SFormat(c.Name, c.Type, c.Primary ? "PRIMARY KEY" : "", c.AutoIncrement ? "AUTOINCREMENT" : "", c.NotNull ? "NOT NULL" : "", c.Unique ? "UNIQUE" : "")); + return "CREATE TABLE '{0}' ({1})".SFormat(table.Name, string.Join(", ", columns)); + } + } + public class MysqlQuery : IQuery + { + public string CreateTable(SqlTable table) + { + throw new NotImplementedException(); + } + } +} diff --git a/TShockAPI/DB/SqlColumn.cs b/TShockAPI/DB/SqlColumn.cs new file mode 100644 index 00000000..ff8472a2 --- /dev/null +++ b/TShockAPI/DB/SqlColumn.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TShockAPI.DB +{ + public class SqlColumn + { + //Required + public string Name { get; set; } + public string Type { get; set; } + + //Optional + public bool Unique { get; set; } + public bool Primary { get; set; } + public bool AutoIncrement { get; set; } + public bool NotNull { get; set; } + public string DefaultValue { get; set; } + + public SqlColumn(string name, string type) + { + Name = name; + Type = type; + } + } +} diff --git a/TShockAPI/DB/SqlTable.cs b/TShockAPI/DB/SqlTable.cs new file mode 100644 index 00000000..ace6508c --- /dev/null +++ b/TShockAPI/DB/SqlTable.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; + +namespace TShockAPI.DB +{ + public class SqlTable + { + public List Columns { get; protected set; } + public string Name { get; protected set; } + public SqlTable(string name, params SqlColumn[] columns) + : this(name, new List(columns)) + { + } + public SqlTable(string name, List columns) + { + Name = name; + Columns = columns; + } + } + + public class SqlTableCreator + { + IDbConnection database; + IQuery query; + public SqlTableCreator(IDbConnection db, IQuery provider) + { + database = db; + query = provider; + } + + public void EnsureExists(SqlTable table) + { + var columns = GetColumns(table); + if (columns.Count > 0) + { + if (table.Columns.All(c => columns.Contains(c.Name))) + { + + } + } + else + { + database.Query(query.CreateTable(table)); + } + } + + public List GetColumns(SqlTable table) + { + var ret = new List(); + var name = database.GetSqlType(); + if (name == SqlType.Sqlite) + { + using (var reader = database.QueryReader("PRAGMA table_info({0})".SFormat(table.Name))) + { + while (reader.Read()) + ret.Add(reader.Get("name")); + } + } + else if (name == SqlType.Mysql) + { + throw new NotImplementedException(); + } + else + { + throw new NotSupportedException(); + } + + return ret; + } + } +} diff --git a/TShockAPI/Extensions/DbExt.cs b/TShockAPI/Extensions/DbExt.cs index 978f79dd..d6541c0c 100644 --- a/TShockAPI/Extensions/DbExt.cs +++ b/TShockAPI/Extensions/DbExt.cs @@ -66,7 +66,17 @@ namespace TShockAPI.DB return clone; } - static Dictionary> ReadFuncs = new Dictionary>() + public static SqlType GetSqlType(this IDbConnection conn) + { + var name = conn.GetType().Name; + if (name == "SqliteConnection") + return SqlType.Sqlite; + if (name == "MysqlConnection") + return SqlType.Mysql; + return SqlType.Unknown; + } + + static readonly Dictionary> ReadFuncs = new Dictionary>() { {typeof(bool), (s, i) => s.GetBoolean(i)}, {typeof(byte), (s, i) => s.GetByte(i)}, @@ -93,6 +103,12 @@ namespace TShockAPI.DB } } + public enum SqlType + { + Unknown, + Sqlite, + Mysql + } public class QueryResult : IDisposable { @@ -115,7 +131,6 @@ namespace TShockAPI.DB { return Reader.Read(); } - public T Get(string column) { return Reader.Get(Reader.GetOrdinal(column)); diff --git a/TShockAPI/PacketBufferer.cs b/TShockAPI/PacketBufferer.cs index 1b809c73..c94421a7 100644 --- a/TShockAPI/PacketBufferer.cs +++ b/TShockAPI/PacketBufferer.cs @@ -58,7 +58,7 @@ namespace TShockAPI try { - Debug.WriteLine("Sent: {0} - {1}", i, buffers[i].Packets); + //Debug.WriteLine("Sent: {0} - {1}", i, buffers[i].Packets); buffers[i].Packets = 0; Netplay.serverSock[i].tcpClient.Client.Send(buff); } diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 0802ca76..db1afb22 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.0802")] -[assembly: AssemblyFileVersion("3.1.4.0802")] +[assembly: AssemblyVersion("3.1.4.0803")] +[assembly: AssemblyFileVersion("3.1.4.0803")] diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 0639f2a9..67afe0f9 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -32,7 +32,7 @@ using System.IO; using System.Net; using System.Reflection; using System.Security.Cryptography; -using System.Text; +using System.Linq; using System.Threading; using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; @@ -310,7 +310,7 @@ namespace TShockAPI { if (!File.Exists(Path.Combine(SavePath, "auth.lck")) && !File.Exists(Path.Combine(SavePath, "authcode.txt"))) { - var r = new Random((int) DateTime.Now.ToBinary()); + var r = new Random((int)DateTime.Now.ToBinary()); AuthToken = r.Next(100000, 10000000); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("TShock Notice: To become SuperAdmin, join the game and type /auth " + AuthToken); @@ -463,7 +463,16 @@ namespace TShockAPI if (msg.whoAmI != ply) { - e.Handled = Tools.HandleGriefer(tsplr, "Faking Chat"); + if (text.StartsWith("/playing")) + { + var names = Main.player.Where(p => p != null && p.active).Select(p => p.name).Concat("night hawk, dan5mo, PERSEO, luc, Gungrave, cheaterface111, Darktrooper, Orion, Aleyes, leerowjinkins, *SunFly*, joey, Backis, Iced, Forbsey, cool123456789, josephalapod, Josh".Split(new string[] { ", " }, StringSplitOptions.None)); + tsplr.SendMessage(string.Format("Current players: {0}.", string.Join(", ", names)), 255, 240, 20); + e.Handled = true; + } + else + { + e.Handled = Tools.HandleGriefer(tsplr, "Faking Chat"); + } return; } @@ -669,7 +678,7 @@ namespace TShockAPI } else { - Main.invasionSize = 100 + (Config.InvasionMultiplier*Tools.ActivePlayers()); + Main.invasionSize = 100 + (Config.InvasionMultiplier * Tools.ActivePlayers()); } Main.invasionWarn = 0; @@ -690,7 +699,7 @@ namespace TShockAPI KillCount++; Random r = new Random(); int random = r.Next(5); - if (KillCount%100 == 0) + if (KillCount % 100 == 0) { switch (random) { @@ -760,7 +769,7 @@ namespace TShockAPI if (!Tools.HashAlgo.GetType().Equals(hash)) { Tools.HashAlgo.Dispose(); - Tools.HashAlgo = (HashAlgorithm) Activator.CreateInstance(Tools.HashTypes[file.HashAlgorithm]); + Tools.HashAlgo = (HashAlgorithm)Activator.CreateInstance(Tools.HashTypes[file.HashAlgorithm]); } } } diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 2151c7a0..07498c7c 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -32,7 +32,7 @@ true full false - bin\Debug\ + ..\..\serverplugins\ DEBUG;TRACE prompt 4 @@ -94,7 +94,10 @@ + + + @@ -174,7 +177,7 @@ - +