Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Config.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ public class WeaponPaintsConfig : BasePluginConfig
[JsonPropertyName("DatabaseName")]
public string DatabaseName { get; set; } = "";

[JsonPropertyName("DatabaseType")]
public string DatabaseType { get; set; } = "mysql";

[JsonPropertyName("DatabasePath")]
public string DatabasePath { get; set; } = "weaponpaints.db";

[JsonPropertyName("CmdRefreshCooldownSeconds")]
public int CmdRefreshCooldownSeconds { get; set; } = 3;

Expand Down
34 changes: 16 additions & 18 deletions Database.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
using Microsoft.Extensions.Logging;
using MySqlConnector;

namespace WeaponPaints
{
public class Database(string dbConnectionString)
{
public async Task<MySqlConnection> GetConnectionAsync()
{
try
{
var connection = new MySqlConnection(dbConnectionString);
await connection.OpenAsync();
return connection;
}
catch (Exception ex)
{
WeaponPaints.Instance.Logger.LogError($"Unable to connect to database: {ex.Message}");
throw;
}
}
}
public class Database
{
private readonly Func<IDatabaseConnection> _connectionFactory;

public Database(Func<IDatabaseConnection> connectionFactory)
{
_connectionFactory = connectionFactory;
}

public async Task<IDatabaseConnection> GetConnectionAsync()
{
var connection = _connectionFactory();
await connection.OpenAsync();
return connection;
}
}
}
14 changes: 14 additions & 0 deletions IDatabaseConnection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.Data;

namespace WeaponPaints
{
public interface IDatabaseConnection : IAsyncDisposable, IDisposable
{
Task OpenAsync();
Task CloseAsync();
Task<IDbTransaction> BeginTransactionAsync();
Task CommitTransactionAsync(IDbTransaction transaction);
Task RollbackTransactionAsync(IDbTransaction transaction);
IDbConnection GetConnection();
}
}
68 changes: 68 additions & 0 deletions MySQLConnection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using Microsoft.Extensions.Logging;
using MySqlConnector;
using System.Data;

namespace WeaponPaints
{
public class MySQLConnection : IDatabaseConnection
{
private readonly MySqlConnection _connection;
private readonly ILogger _logger;

public MySQLConnection(string connectionString, ILogger logger)
{
_connection = new MySqlConnection(connectionString);
_logger = logger;
}

public async Task OpenAsync()
{
try
{
await _connection.OpenAsync();
}
catch (Exception ex)
{
_logger.LogError($"Unable to connect to MySQL database: {ex.Message}");
throw;
}
}

public async Task CloseAsync()
{
await _connection.CloseAsync();
}

public async Task<IDbTransaction> BeginTransactionAsync()
{
return await _connection.BeginTransactionAsync();
}

public Task CommitTransactionAsync(IDbTransaction transaction)
{
transaction.Commit();
return Task.CompletedTask;
}

public Task RollbackTransactionAsync(IDbTransaction transaction)
{
transaction.Rollback();
return Task.CompletedTask;
}

public IDbConnection GetConnection()
{
return _connection;
}

public void Dispose()
{
_connection?.Dispose();
}

public async ValueTask DisposeAsync()
{
await _connection.DisposeAsync();
}
}
}
68 changes: 68 additions & 0 deletions SQLiteConnection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Logging;
using System.Data;

namespace WeaponPaints
{
public class SQLiteConnection : IDatabaseConnection
{
private readonly Microsoft.Data.Sqlite.SqliteConnection _connection;
private readonly ILogger _logger;

public SQLiteConnection(string connectionString, ILogger logger)
{
_connection = new Microsoft.Data.Sqlite.SqliteConnection(connectionString);
_logger = logger;
}

public async Task OpenAsync()
{
try
{
await _connection.OpenAsync();
}
catch (Exception ex)
{
_logger.LogError($"Unable to connect to SQLite database: {ex.Message}");
throw;
}
}

public async Task CloseAsync()
{
await _connection.CloseAsync();
}

public async Task<IDbTransaction> BeginTransactionAsync()
{
return await _connection.BeginTransactionAsync();
}

public Task CommitTransactionAsync(IDbTransaction transaction)
{
transaction.Commit();
return Task.CompletedTask;
}

public Task RollbackTransactionAsync(IDbTransaction transaction)
{
transaction.Rollback();
return Task.CompletedTask;
}

public IDbConnection GetConnection()
{
return _connection;
}

public void Dispose()
{
_connection?.Dispose();
}

public async ValueTask DisposeAsync()
{
await _connection.DisposeAsync();
}
}
}
Loading