2025-06-06 01:11:26 +02:00

261 lines
8.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Data;
using DX86.Modules;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
namespace Server
{
public class MySQL
{
private MySqlConnection _connection;
private MessageSender ms;
public MySQL(string username, string password, string server, string port, string database, MessageSender ms)
{
this.ms = ms;
ms.Log("[MySQL] Initializing connection...");
// include port in the connection string:
string connectionString = $"Server={server};Port={port};Database={database};User ID={username};Password={password};";
_connection = new MySqlConnection(connectionString);
ms.Log("[MySQL] Connection to database...");
try
{
_connection.Open();
ms.Log("[MySQL] Connection established.");
}
catch (Exception ex)
{
ms.Error("[MySQL] Connection failed: " + ex.Message);
ms.Error("[MySQL] Please check your connection settings.");
ms.Error("[MySQL] Make sure the MySQL server is running and accessible.");
ms.Error("[MySQL] A MySQL Connection is necessary to run this application.");
ms.Error("[MySQL] Exiting...");
Environment.Exit(1);
}
}
private string JsonResponse(object data, bool error = false)
{
return JsonConvert.SerializeObject(new { error, data });
}
private string GetType(object value)
{
return value switch
{
int => "i",
float or double => "d",
string => "s",
_ => "b"
};
}
/// <summary>
/// Executes a nonquery SQL statement (e.g. CREATE TABLE, ALTER, etc.).
/// Returns null on success, or an error JSON if it fails.
/// </summary>
public string ExecuteNonQuery(string sql)
{
using var cmd = new MySqlCommand(sql, _connection);
try
{
cmd.ExecuteNonQuery();
return JsonResponse(new { success = true });
}
catch (Exception ex)
{
return JsonResponse($"Execute failed: {ex.Message}", true);
}
}
public string Insert(string table, Dictionary<string, object> data)
{
string columns = string.Join(", ", data.Keys);
string placeholders = string.Join(", ", new string[data.Count].Select(_ => "?"));
string sql = $"INSERT INTO `{table}` ({columns}) VALUES ({placeholders})";
using var cmd = new MySqlCommand(sql, _connection);
string types = "";
foreach (var value in data.Values)
{
types += GetType(value);
cmd.Parameters.AddWithValue(null, value);
}
try
{
cmd.ExecuteNonQuery();
long insertId = cmd.LastInsertedId;
return JsonResponse(new { insert_id = insertId });
}
catch (Exception ex)
{
return JsonResponse($"Execute failed: {ex.Message}", true);
}
}
public string Get(string table, Dictionary<string, object> parameters = null, int? limit = null, int? offset = null)
{
string sql = $"SELECT * FROM `{table}`";
string types = "";
var values = new List<object>();
if (parameters != null && parameters.Count > 0)
{
var conditions = new List<string>();
foreach (var param in parameters)
{
conditions.Add($"`{param.Key}` = ?");
types += GetType(param.Value);
values.Add(param.Value);
}
sql += " WHERE " + string.Join(" AND ", conditions);
}
if (limit.HasValue)
{
sql += " LIMIT ?";
types += "i";
values.Add(limit.Value);
if (offset.HasValue)
{
sql += " OFFSET ?";
types += "i";
values.Add(offset.Value);
}
}
using var cmd = new MySqlCommand(sql, _connection);
for (int i = 0; i < values.Count; i++)
{
cmd.Parameters.AddWithValue(null, values[i]);
}
try
{
using var reader = cmd.ExecuteReader();
var data = new List<Dictionary<string, object>>();
while (reader.Read())
{
var row = new Dictionary<string, object>();
for (int i = 0; i < reader.FieldCount; i++)
{
row[reader.GetName(i)] = reader.GetValue(i);
}
data.Add(row);
}
return JsonResponse(data);
}
catch (Exception ex)
{
return JsonResponse($"Execute failed: {ex.Message}", true);
}
}
public string Update(string table, Dictionary<string, object> data, Dictionary<string, object> where)
{
var setClauses = new List<string>();
var whereClauses = new List<string>();
string types = "";
var values = new List<object>();
foreach (var item in data)
{
setClauses.Add($"`{item.Key}` = ?");
types += GetType(item.Value);
values.Add(item.Value);
}
foreach (var condition in where)
{
whereClauses.Add($"`{condition.Key}` = ?");
types += GetType(condition.Value);
values.Add(condition.Value);
}
string sql = $"UPDATE `{table}` SET {string.Join(", ", setClauses)} WHERE {string.Join(" AND ", whereClauses)}";
using var cmd = new MySqlCommand(sql, _connection);
for (int i = 0; i < values.Count; i++)
{
cmd.Parameters.AddWithValue(null, values[i]);
}
try
{
int affectedRows = cmd.ExecuteNonQuery();
return JsonResponse(new { affected_rows = affectedRows });
}
catch (Exception ex)
{
return JsonResponse($"Execute failed: {ex.Message}", true);
}
}
public string Delete(string table, Dictionary<string, object> where)
{
var whereClauses = new List<string>();
string types = "";
var values = new List<object>();
foreach (var condition in where)
{
whereClauses.Add($"`{condition.Key}` = ?");
types += GetType(condition.Value);
values.Add(condition.Value);
}
string sql = $"DELETE FROM `{table}` WHERE {string.Join(" AND ", whereClauses)}";
using var cmd = new MySqlCommand(sql, _connection);
for (int i = 0; i < values.Count; i++)
{
cmd.Parameters.AddWithValue(null, values[i]);
}
try
{
int affectedRows = cmd.ExecuteNonQuery();
return JsonResponse(new { affected_rows = affectedRows });
}
catch (Exception ex)
{
return JsonResponse($"Execute failed: {ex.Message}", true);
}
}
public string Query(string sql, string types = null, List<object> values = null)
{
using var cmd = new MySqlCommand(sql, _connection);
if (types != null && values != null)
{
for (int i = 0; i < values.Count; i++)
{
cmd.Parameters.AddWithValue(null, values[i]);
}
}
try
{
using var reader = cmd.ExecuteReader();
var data = new List<Dictionary<string, object>>();
while (reader.Read())
{
var row = new Dictionary<string, object>();
for (int i = 0; i < reader.FieldCount; i++)
{
row[reader.GetName(i)] = reader.GetValue(i);
}
data.Add(row);
}
return JsonResponse(data);
}
catch (Exception ex)
{
return JsonResponse($"Query failed: {ex.Message}", true);
}
}
}
}