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
+