From bc2bfd548594933050c4da25935954de510fda6f Mon Sep 17 00:00:00 2001 From: Twitchy Date: Wed, 27 Jul 2011 18:22:12 +1200 Subject: [PATCH] Adds DBTools.cs (Create and Insert Table) --- TShockAPI/DB/DBTools.cs | 206 +++++++++++++++++++++++++++++++++++++ TShockAPI/DB/SqlTable.cs | 6 -- TShockAPI/TShock.cs | 1 + TShockAPI/TShockAPI.csproj | 4 +- 4 files changed, 209 insertions(+), 8 deletions(-) create mode 100644 TShockAPI/DB/DBTools.cs delete mode 100644 TShockAPI/DB/SqlTable.cs diff --git a/TShockAPI/DB/DBTools.cs b/TShockAPI/DB/DBTools.cs new file mode 100644 index 00000000..8851a470 --- /dev/null +++ b/TShockAPI/DB/DBTools.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using TShockAPI.DB; + +namespace TShockAPI.DB +{ + public class DBTools + { + public static IDbConnection database; + + public static void CreateTable(string name, bool IfNotExists, List columns) + { + //Build up Creation string :) + StringBuilder sb = new StringBuilder(); + sb.Append("CREATE TABLE "); + + if (IfNotExists) + sb.Append("IF NOT EXISTS "); + + if (TShock.Config.StorageType.ToLower() == "sqlite") + sb.Append("'" + name + "' ("); + else if (TShock.Config.StorageType.ToLower() == "mysql") + sb.Append(name + " ("); + + int count = 0; + + foreach (Column column in columns) + { + count++; + if (column.Type.ToLower() == "int") + { + if (TShock.Config.StorageType.ToLower() == "sqlite") + sb.Append(column.Name + " NUMERIC "); + else if (TShock.Config.StorageType.ToLower() == "mysql") + sb.Append(column.Name + " INT(255) "); + } + else if (column.Type.ToLower() == "string") + { + if (TShock.Config.StorageType.ToLower() == "sqlite") + sb.Append(column.Name + " TEXT "); + else if (TShock.Config.StorageType.ToLower() == "mysql") + sb.Append(column.Name + " VARCHAR(255) "); + } + if (column.Unique) + { + if (columns.Count != count) + { + sb.Append("UNIQUE, "); + } + else + sb.Append("UNIQUE) "); + } + if (columns.Count == count) + sb.Append(")"); + } + + using (var com = database.CreateCommand()) + { + com.CommandText = sb.ToString(); + com.ExecuteNonQuery(); + } + } + + public static void InsertTable(string tablename, bool Ignore, List Values, List WhereAndStatements) + { + StringBuilder sb = new StringBuilder(); + sb.Append("INSERT "); + + if (Ignore) + { + if (TShock.Config.StorageType.ToLower() == "sqlite") + sb.Append("OR IGNORE "); + else if (TShock.Config.StorageType.ToLower() == "mysql") + sb.Append("IGNORE "); + } + + if (TShock.Config.StorageType.ToLower() == "sqlite") + sb.Append("INTO '" + tablename + "' ("); + else if (TShock.Config.StorageType.ToLower() == "mysql") + sb.Append("INTO " + tablename + " "); + + using (var com = database.CreateCommand()) + { + //Values + if (TShock.Config.StorageType.ToLower() == "sqlite") + { + int count = 0; + + foreach (ColumnData columnname in Values) + { + count++; + if (Values.Count != count) + sb.Append(columnname.Name + ", "); + else + sb.Append(columnname.Name + ") "); + } + + sb.Append("VALUES ("); + count = 0; + + foreach (ColumnData columnname in Values) + { + count++; + if (Values.Count != count) + { + sb.Append("@" + columnname.Name + ", "); + com.AddParameter("@" + columnname.Name.ToLower(), columnname.Value); + } + else + { + sb.Append("@" + columnname.Name + ") "); + com.AddParameter("@" + columnname.Name.ToLower(), columnname.Value); + } + } + } + else if (TShock.Config.StorageType.ToLower() == "mysql") + { + sb.Append("SET "); + int count = 0; + + foreach (ColumnData columnname in Values) + { + count++; + if (Values.Count != count) + { + sb.Append("@" + columnname.Name + "=" + columnname.Value + ", "); + com.AddParameter("@" + columnname.Name.ToLower(), columnname.Value); + } + else + { + sb.Append("@" + columnname.Name + "=" + columnname.Value + ") "); + com.AddParameter("@" + columnname.Name.ToLower(), columnname.Value); + } + } + } + + //Where Statement (if any) + if (WhereAndStatements.Count > 0) + { + sb.Append("WHERE "); + int count = 0; + + foreach (ColumnData columnname in WhereAndStatements) + { + count++; + if (Values.Count != count) + { + sb.Append("@" + columnname.Name + "=" + columnname.Value + "-where" + " AND "); + com.AddParameter("@" + columnname.Name.ToLower() + "-where", columnname.Value); + } + else + { + sb.Append("@" + columnname.Name + "=" + columnname.Value + "-where" + ";"); + com.AddParameter("@" + columnname.Name.ToLower() + "-where", columnname.Value); + } + } + } + } + } + } + + public class Column + { + public string Name { get; set; } + public string Type { get; set; } + public bool Unique { get; set; } + public string Parameters { get; set; } + + public Column(string name, bool unique, string type, string parameters) + { + Name = name; + Type = type; + Unique = unique; + Parameters = parameters; + } + + public Column() + { + Name = string.Empty; + Type = string.Empty; + Unique = false; + Parameters = string.Empty; + } + } + + public class ColumnData + { + public string Name { get; set; } + public object Value { get; set; } + + public ColumnData(string name, object value) + { + Name = name; + Value = value; + } + + public ColumnData() + { + Name = string.Empty; + Value = string.Empty; + } + } +} diff --git a/TShockAPI/DB/SqlTable.cs b/TShockAPI/DB/SqlTable.cs deleted file mode 100644 index fd6eefea..00000000 --- a/TShockAPI/DB/SqlTable.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TShockAPI.DB -{ - class SqlTable - { - } -} diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index e285830b..cc1af36e 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -155,6 +155,7 @@ namespace TShockAPI throw new Exception("Invalid storage type"); } + DBTools.database = DB; Backups = new BackupManager(Path.Combine(SavePath, "backups")); Backups.KeepFor = Config.BackupKeepFor; Backups.Interval = Config.BackupInterval; diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 06d95c87..10c54c58 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -93,10 +93,10 @@ + - @@ -171,7 +171,7 @@ - +