Skip to content

Commit

Permalink
Combine SqlQuery into IDatabaseBackend
Browse files Browse the repository at this point in the history
  • Loading branch information
UnknownShadow200 committed May 25, 2022
1 parent 7952de4 commit 9a86929
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 108 deletions.
10 changes: 6 additions & 4 deletions MCGalaxy/Database/ColumnDesc.cs
Expand Up @@ -17,10 +17,11 @@
*/
using System;

namespace MCGalaxy.SQL {

namespace MCGalaxy.SQL
{
/// <summary> Describes a column for an SQL create statement. </summary>
public struct ColumnDesc {
public struct ColumnDesc
{
public readonly string Column;
public readonly ColumnType Type;
public readonly ushort MaxLength;
Expand Down Expand Up @@ -57,7 +58,8 @@ public ColumnDesc(string col, ColumnType type, ushort maxLen)
};
}

public enum ColumnType {
public enum ColumnType
{
UInt8, UInt16, UInt24, UInt32, UInt64,
Int8, Int16, Int24, Int32, Int64,
Integer, DateTime, Char, VarChar
Expand Down
13 changes: 9 additions & 4 deletions MCGalaxy/Database/Database.cs
Expand Up @@ -20,12 +20,14 @@
using System.Data;
using System.IO;

namespace MCGalaxy.SQL {
namespace MCGalaxy.SQL
{
/// <summary> Callback function invoked on a row returned from an SQL query. </summary>
public delegate object ReaderCallback(IDataRecord record, object arg);

/// <summary> Abstracts a SQL database management engine. </summary>
public static class Database {
public static class Database
{
public static IDatabaseBackend Backend;
public const string DateFormat = "yyyy-MM-dd HH:mm:ss";

Expand Down Expand Up @@ -175,13 +177,15 @@ public static class Database {

internal static object Do(string sql, bool createDB, object arg,
ReaderCallback callback, params object[] args) {
IDatabaseBackend db = Backend;
Exception e = null;

for (int i = 0; i < 10; i++) {
try {
if (callback != null) {
arg = SqlQuery.Iterate(sql, args, arg, callback);
arg = db.Iterate(sql, args, arg, callback);
} else {
SqlQuery.Execute(sql, args, createDB);
db.Execute(sql, args, createDB);
}

return arg;
Expand All @@ -195,6 +199,7 @@ public static class Database {
}
#endregion


internal static bool ValidNameChar(char c) {
return
c > ' ' && c != '"' && c != '%' && c != '&' &&
Expand Down
79 changes: 72 additions & 7 deletions MCGalaxy/Database/IDatabaseBackend.cs
Expand Up @@ -21,11 +21,11 @@
using System.IO;
using System.Text;

namespace MCGalaxy.SQL {

/// <summary> Simple abstraction for a database management system. </summary>
public abstract class IDatabaseBackend {

namespace MCGalaxy.SQL
{
/// <summary> Abstracts a SQL based database management system </summary>
public abstract class IDatabaseBackend
{
/// <summary> Whether this backend enforces the character length in VARCHAR columns. </summary>
public abstract bool EnforcesTextLength { get; }
/// <summary> Whether this backend supports multiple database schemas. </summary>
Expand Down Expand Up @@ -135,14 +135,79 @@ public abstract class IDatabaseBackend {
sql.Append(" `").Append(table).Append("` ");
sql.Append('(').Append(columns).Append(')');

string[] names = SqlQuery.GetNames(args.Length);
string[] names = GetNames(args.Length);
sql.Append(" VALUES (");
for (int i = 0; i < args.Length; i++) {
for (int i = 0; i < args.Length; i++)
{
sql.Append(names[i]);
if (i < args.Length - 1) sql.Append(", ");
else sql.Append(")");
}
return sql.ToString();
}


#region Raw SQL functions

/// <summary> Executes an SQL command that does not return any results. </summary>
public void Execute(string sql, object[] parameters, bool createDB) {
using (IDbConnection conn = CreateConnection()) {
conn.Open();
if (!createDB && MultipleSchema)
conn.ChangeDatabase(Server.Config.MySQLDatabaseName);

using (IDbCommand cmd = CreateCommand(sql, conn)) {
FillParams(cmd, parameters);
cmd.ExecuteNonQuery();
}
conn.Close();
}
}

/// <summary> Excecutes an SQL query, invoking a callback on the returned rows one by one. </summary>
public object Iterate(string sql, object[] parameters, object arg, ReaderCallback callback) {
using (IDbConnection conn = CreateConnection()) {
conn.Open();
if (MultipleSchema)
conn.ChangeDatabase(Server.Config.MySQLDatabaseName);

using (IDbCommand cmd = CreateCommand(sql, conn)) {
FillParams(cmd, parameters);
using (IDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) { arg = callback(reader, arg); }
}
}
conn.Close();
}
return arg;
}


/// <summary> Adds IDbDataParameter for each argument to the given command. </summary>
public void FillParams(IDbCommand cmd, object[] parameters) {
if (parameters == null || parameters.Length == 0) return;

string[] names = GetNames(parameters.Length);
for (int i = 0; i < parameters.Length; i++)
{
IDbDataParameter arg = CreateParameter();
arg.ParameterName = names[i];
arg.Value = parameters[i];
cmd.Parameters.Add(arg);
}
}

volatile static string[] ids;
internal static string[] GetNames(int count) {
// Avoid allocation overhead from string concat every query by caching
string[] names = ids;
if (names == null || count > names.Length) {
names = new string[count];
for (int i = 0; i < names.Length; i++) { names[i] = "@" + i; }
ids = names;
}
return names;
}
#endregion
}
}
88 changes: 0 additions & 88 deletions MCGalaxy/Database/SqlQuery.cs

This file was deleted.

9 changes: 5 additions & 4 deletions MCGalaxy/Database/SqlTransaction.cs
Expand Up @@ -18,9 +18,10 @@
using System;
using System.Data;

namespace MCGalaxy.SQL {

public sealed class SqlTransaction : IDisposable {
namespace MCGalaxy.SQL
{
public sealed class SqlTransaction : IDisposable
{
internal IDbConnection conn;
internal IDbTransaction transaction;

Expand Down Expand Up @@ -66,7 +67,7 @@ public sealed class SqlTransaction : IDisposable {
try {
using (IDbCommand cmd = db.CreateCommand(sql, conn)) {
cmd.Transaction = transaction;
SqlQuery.FillParams(cmd, args);
db.FillParams(cmd, args);
cmd.ExecuteNonQuery();
return true;
}
Expand Down
1 change: 0 additions & 1 deletion MCGalaxy/MCGalaxy_.csproj
Expand Up @@ -396,7 +396,6 @@
<Compile Include="Database\ColumnDesc.cs" />
<Compile Include="Database\IDatabaseBackend.cs" />
<Compile Include="Database\Backends\MySQL.cs" />
<Compile Include="Database\SqlQuery.cs" />
<Compile Include="Database\PlayerData.cs" />
<Compile Include="Database\Stats\OfflineStat.cs" />
<Compile Include="Database\Stats\OnlineStat.cs" />
Expand Down

0 comments on commit 9a86929

Please sign in to comment.