87 lines
2.9 KiB
C#
87 lines
2.9 KiB
C#
using MySqlConnector;
|
|
using SharpChat.Configuration;
|
|
|
|
namespace SharpChat.MariaDB;
|
|
|
|
public partial class MariaDBMessageStorage {
|
|
public static string BuildConnString(Config config) {
|
|
return BuildConnString(
|
|
config.ReadValue("host", "localhost"),
|
|
config.ReadValue("user", string.Empty),
|
|
config.ReadValue("pass", string.Empty),
|
|
config.ReadValue("db", "sharpchat")
|
|
);
|
|
}
|
|
|
|
public static string BuildConnString(string? host, string? username, string? password, string? database) {
|
|
return new MySqlConnectionStringBuilder {
|
|
Server = host,
|
|
UserID = username,
|
|
Password = password,
|
|
Database = database,
|
|
OldGuids = false,
|
|
TreatTinyAsBoolean = false,
|
|
CharacterSet = "utf8mb4",
|
|
SslMode = MySqlSslMode.None,
|
|
ForceSynchronous = true,
|
|
ConnectionTimeout = 5,
|
|
DefaultCommandTimeout = 900, // fuck it, 15 minutes
|
|
}.ToString();
|
|
}
|
|
|
|
private async Task<MySqlConnection> GetConnection() {
|
|
MySqlConnection conn = new(ConnectionString);
|
|
await conn.OpenAsync();
|
|
return conn;
|
|
}
|
|
|
|
private async Task<int> RunCommand(string command, params MySqlParameter[] parameters) {
|
|
try {
|
|
using MySqlConnection conn = await GetConnection();
|
|
using MySqlCommand cmd = conn.CreateCommand();
|
|
if(parameters?.Length > 0)
|
|
cmd.Parameters.AddRange(parameters);
|
|
cmd.CommandText = command;
|
|
return await cmd.ExecuteNonQueryAsync();
|
|
} catch(MySqlException ex) {
|
|
Logger.Write(ex);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
private async Task<MySqlDataReader?> RunQuery(string command, params MySqlParameter[] parameters) {
|
|
try {
|
|
MySqlConnection conn = await GetConnection();
|
|
MySqlCommand cmd = conn.CreateCommand();
|
|
if(parameters?.Length > 0)
|
|
cmd.Parameters.AddRange(parameters);
|
|
cmd.CommandText = command;
|
|
return await cmd.ExecuteReaderAsync(System.Data.CommandBehavior.CloseConnection);
|
|
} catch(MySqlException ex) {
|
|
Logger.Write(ex);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private async Task<T> RunQueryValue<T>(string command, params MySqlParameter[] parameters)
|
|
where T : struct {
|
|
try {
|
|
using MySqlConnection conn = await GetConnection();
|
|
using MySqlCommand cmd = conn.CreateCommand();
|
|
if(parameters?.Length > 0)
|
|
cmd.Parameters.AddRange(parameters);
|
|
cmd.CommandText = command;
|
|
await cmd.PrepareAsync();
|
|
|
|
object? raw = await cmd.ExecuteScalarAsync();
|
|
if(raw is T value)
|
|
return value;
|
|
} catch(MySqlException ex) {
|
|
Logger.Write(ex);
|
|
}
|
|
|
|
return default;
|
|
}
|
|
}
|