From c644fcd45ccb6a9f3e032537f0095a4de22534c3 Mon Sep 17 00:00:00 2001 From: high Date: Fri, 1 Jul 2011 15:54:52 -0400 Subject: [PATCH] Sqlite added BanManager now uses sqlite (imcomplete) --- TShockAPI/BanManager.cs | 122 +++++++++++++++---------------------- TShockAPI/ConfigFile.cs | 5 ++ TShockAPI/TShock.cs | 40 ++++++++---- TShockAPI/TShockAPI.csproj | 3 + 4 files changed, 84 insertions(+), 86 deletions(-) diff --git a/TShockAPI/BanManager.cs b/TShockAPI/BanManager.cs index 649387c7..04d5a945 100644 --- a/TShockAPI/BanManager.cs +++ b/TShockAPI/BanManager.cs @@ -18,118 +18,92 @@ along with this program. If not, see . using System; using System.Collections.Generic; +using System.Data; using System.IO; using System.Text; +using Community.CsharpSqlite.SQLiteClient; namespace TShockAPI { public class BanManager { private DateTime LastLoad; - private string Path; + private IDbConnection database; /// /// IP - Name - Reason /// private List Bans = new List(); - public BanManager(string path) + public BanManager(IDbConnection db) { - Path = path; + database = db; + + using (var com = database.CreateCommand()) + { + com.CommandText = + "CREATE TABLE IF NOT EXISTS \"Bans\" (\"IP\" VARCHAR(15) NOT NULL UNIQUE , \"Name\" VARCHAR(32) NOT NULL , \"Reason\" VARCHAR(255) NOT NULL );"; + com.ExecuteNonQuery(); + } } public Ban GetBanByIp(string ip) { - EnsureChanges(); - foreach (var ban in Bans) + using (var com = database.CreateCommand()) { - if (ban.IP.Equals(ip)) - return ban; + com.CommandText = "SELECT * FROM Bans WHERE IP=@ip"; + AddParameter(com, "@ip", ip); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + } } return null; } + IDbDataParameter AddParameter(IDbCommand command, string name, object data) + { + var parm = command.CreateParameter(); + parm.ParameterName = name; + parm.Value = data; + command.Parameters.Add(parm); + return parm; + } + public Ban GetBanByName(string name, bool casesensitive = true) { - EnsureChanges(); - foreach (var ban in Bans) + using (var com = database.CreateCommand()) { - if (ban.Name.Equals(name, - casesensitive - ? StringComparison.Ordinal - : StringComparison.InvariantCultureIgnoreCase)) - return ban; + var namecol = casesensitive ? "Name" : "UPPER(Name)"; + if (!casesensitive) + name = name.ToUpper(); + com.CommandText = "SELECT *, COUNT(*) FROM Bans WHERE " + namecol + "=@name LIMIT 5"; + AddParameter(com, "@name", name); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + } } return null; } public void AddBan(string ip, string name = "", string reason = "") { - if (GetBanByIp(ip) != null) - return; - Bans.Add(new Ban(ip, name, reason)); - SaveBans(); + using (var com = database.CreateCommand()) + { + com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason)"; + AddParameter(com, "@ip", ip); + AddParameter(com, "@name", name); + AddParameter(com, "@reason", reason); + com.ExecuteNonQuery(); + } } public void RemoveBan(Ban ban) { - Bans.Remove(ban); - SaveBans(); - } - /// - /// Reloads the file if it was changed - /// - public void EnsureChanges() - { - if (File.Exists(Path)) - { - if (new FileInfo(Path).LastWriteTime > LastLoad) - LoadBans(); - } - else - { - Bans.Clear(); - } - } - - /// - /// Removes | from the string - /// - /// - /// - public string MakeSafe(string str) - { - return str.Replace("|", " "); - } - - public void LoadBans() - { - Bans.Clear(); - - if (!File.Exists(Path)) - return; - - LastLoad = new FileInfo(Path).LastWriteTime; - - foreach (var line in File.ReadAllLines(Path)) - { - var bansp = line.Split('|'); - if (bansp.Length != 3) - continue; - Bans.Add(new Ban(bansp[0], bansp[1], bansp[2])); - } - } - - public void SaveBans() - { - var output = new StringBuilder(); - foreach (var ban in Bans) - { - output.AppendFormat("{0}|{1}|{2}\r\n", MakeSafe(ban.IP), MakeSafe(ban.Name), MakeSafe(ban.Reason)); - } - - File.WriteAllText(Path, output.ToString()); } } diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 88f82be0..4c83cc91 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -67,6 +67,11 @@ namespace TShockAPI public int MaximumLoginAttempts = 3; + /// + /// Valid types are "sqlite" and "mysql" + /// + public string StorageType = "sqlite"; + public static ConfigFile Read(string path) { if (!File.Exists(path)) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 70a3dccd..bb6fed51 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -23,6 +23,7 @@ using System.Diagnostics; using System.IO; using System.Net; using System.Reflection; +using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Terraria; @@ -46,7 +47,7 @@ namespace TShockAPI public static ConfigFile Config { get; set; } - public static IDbConnection Sql; + public static IDbConnection DB; public override Version Version { @@ -77,21 +78,38 @@ namespace TShockAPI public override void Initialize() { - HandleCommandLine(Environment.GetCommandLineArgs()); - + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; ConfigFile.ConfigRead += OnConfigRead; - Bans = new BanManager(FileTools.BansPath); - Backups = new BackupManager(Path.Combine(SavePath, "backups")); - - FileTools.SetupConfig(); - #if DEBUG Log.Initialize(Path.Combine(SavePath, "log.txt"), LogLevel.All, false); #else Log.Initialize(Path.Combine(SavePath, "log.txt"), LogLevel.All & ~LogLevel.Debug, false); #endif + HandleCommandLine(Environment.GetCommandLineArgs()); + + Backups = new BackupManager(Path.Combine(SavePath, "backups")); + + FileTools.SetupConfig(); + + if (Config.StorageType.ToLower() == "sqlite") + { + 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") + { + throw new NotSupportedException("Mysql is not yet supported"); + } + else + { + throw new Exception("Invalid storage type"); + } + + Bans = new BanManager(DB); + Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename)); @@ -104,9 +122,7 @@ namespace TShockAPI NetHooks.GetData += GetData; NetHooks.GreetPlayer += OnGreetPlayer; NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - Bans.LoadBans(); GetDataHandlers.InitGetDataHandler(); Commands.InitCommands(); RegionManager.ReadAllSettings(); @@ -119,7 +135,7 @@ namespace TShockAPI public override void DeInitialize() { - Bans.SaveBans(); + DB.Close(); GameHooks.PostInitialize -= OnPostInit; GameHooks.Update -= OnUpdate; ServerHooks.Join -= OnJoin; @@ -274,7 +290,7 @@ namespace TShockAPI Players[ply] = player; - + } private void OnLeave(int ply) diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 9a054663..52530b7b 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -48,6 +48,9 @@ true + + SqlBins\Community.CsharpSqlite.SQLiteClient.dll +