From 0762d539c8352d1cbba5ad14dea5283aec220397 Mon Sep 17 00:00:00 2001 From: MSWS Date: Fri, 30 Aug 2024 21:54:06 -0700 Subject: [PATCH] Begin work on SQL implementation --- Gangs.sln | 34 ------------ GangsAPI/Services/IStatManager.cs | 7 --- GangsImpl.Mock/MockStatManager.cs | 7 --- GangsImpl.SQL/GangsImpl.SQL.csproj | 18 +++++++ GangsImpl.SQL/SQLStat.cs | 9 ++++ GangsImpl.SQL/SQLStatManager.cs | 75 ++++++++++++++++++++++++++ GangsTest/GangsTest.csproj | 16 +++--- GangsTest/StatTests/StatManagerData.cs | 6 ++- 8 files changed, 116 insertions(+), 56 deletions(-) delete mode 100644 Gangs.sln create mode 100644 GangsImpl.SQL/GangsImpl.SQL.csproj create mode 100644 GangsImpl.SQL/SQLStat.cs create mode 100644 GangsImpl.SQL/SQLStatManager.cs diff --git a/Gangs.sln b/Gangs.sln deleted file mode 100644 index 547042d..0000000 --- a/Gangs.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GangsAPI", "GangsAPI\GangsAPI.csproj", "{787D12D8-1310-4042-ADCE-102E517F269E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GangsPlugin", "GangsPlugin\GangsPlugin.csproj", "{3EA38296-9022-4874-8309-872388D884DE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GangsTest", "GangsTest\GangsTest.csproj", "{B1D1E7C7-BDF3-4238-9025-4FEB2B7DAB89}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GangsImpl.Mock", "GangsImpl.Mock\GangsImpl.Mock.csproj", "{140E1706-30E8-4440-AAA0-56E8DD32F054}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {787D12D8-1310-4042-ADCE-102E517F269E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {787D12D8-1310-4042-ADCE-102E517F269E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {787D12D8-1310-4042-ADCE-102E517F269E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {787D12D8-1310-4042-ADCE-102E517F269E}.Release|Any CPU.Build.0 = Release|Any CPU - {3EA38296-9022-4874-8309-872388D884DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3EA38296-9022-4874-8309-872388D884DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3EA38296-9022-4874-8309-872388D884DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3EA38296-9022-4874-8309-872388D884DE}.Release|Any CPU.Build.0 = Release|Any CPU - {B1D1E7C7-BDF3-4238-9025-4FEB2B7DAB89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B1D1E7C7-BDF3-4238-9025-4FEB2B7DAB89}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B1D1E7C7-BDF3-4238-9025-4FEB2B7DAB89}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B1D1E7C7-BDF3-4238-9025-4FEB2B7DAB89}.Release|Any CPU.Build.0 = Release|Any CPU - {140E1706-30E8-4440-AAA0-56E8DD32F054}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {140E1706-30E8-4440-AAA0-56E8DD32F054}.Debug|Any CPU.Build.0 = Debug|Any CPU - {140E1706-30E8-4440-AAA0-56E8DD32F054}.Release|Any CPU.ActiveCfg = Release|Any CPU - {140E1706-30E8-4440-AAA0-56E8DD32F054}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/GangsAPI/Services/IStatManager.cs b/GangsAPI/Services/IStatManager.cs index 39cb1c9..1b5ebaa 100644 --- a/GangsAPI/Services/IStatManager.cs +++ b/GangsAPI/Services/IStatManager.cs @@ -43,11 +43,4 @@ public interface IStatManager : IPluginBehavior { /// /// Task UnregisterStat(string id); - - /// - /// Updates a statistic with the manager. - /// - /// - /// - Task UpdateStat(IStat stat); } \ No newline at end of file diff --git a/GangsImpl.Mock/MockStatManager.cs b/GangsImpl.Mock/MockStatManager.cs index 0290fee..5d364df 100644 --- a/GangsImpl.Mock/MockStatManager.cs +++ b/GangsImpl.Mock/MockStatManager.cs @@ -32,11 +32,4 @@ public Task UnregisterStat(string id) { foreach (var stat in matches) stats.Remove(stat); return Task.FromResult(matches.Count > 0); } - - public Task UpdateStat(IStat stat) { - var matches = stats.Where(s => s.StatId == stat.StatId).ToList(); - foreach (var match in matches) stats.Remove(match); - stats.Add(stat); - return Task.FromResult(matches.Count > 0); - } } \ No newline at end of file diff --git a/GangsImpl.SQL/GangsImpl.SQL.csproj b/GangsImpl.SQL/GangsImpl.SQL.csproj new file mode 100644 index 0000000..e8de084 --- /dev/null +++ b/GangsImpl.SQL/GangsImpl.SQL.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + diff --git a/GangsImpl.SQL/SQLStat.cs b/GangsImpl.SQL/SQLStat.cs new file mode 100644 index 0000000..54f4af1 --- /dev/null +++ b/GangsImpl.SQL/SQLStat.cs @@ -0,0 +1,9 @@ +using GangsAPI.Data.Stat; + +namespace GangsImpl.SQL; + +public class SQLStat : IStat { + public string StatId { get; set; } + public string Name { get; set; } + public string? Description { get; set; } +} \ No newline at end of file diff --git a/GangsImpl.SQL/SQLStatManager.cs b/GangsImpl.SQL/SQLStatManager.cs new file mode 100644 index 0000000..6fdabba --- /dev/null +++ b/GangsImpl.SQL/SQLStatManager.cs @@ -0,0 +1,75 @@ +using System.Data; +using Dapper; +using GangsAPI.Data.Stat; +using GangsAPI.Services; +using MySqlConnector; + +namespace GangsImpl.SQL; + +public class SQLStatManager(string connectionString, + string table = "gang_stats") : IStatManager { + private readonly HashSet stats = []; + private MySqlConnection connection = null!; + + public void Start() { + connection = new MySqlConnection(connectionString); + + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = + $"CREATE TABLE IF NOT EXISTS {table} (StatId VARCHAR(255) PRIMARY KEY, Name VARCHAR(255), Description TEXT)"; + command.ExecuteNonQuery(); + + connection.Query($"SELECT * FROM {table}") + .ToList() + .ForEach(stat => stats.Add(stat)); + } + + public void Dispose() { + var command = connection.CreateCommand(); + command.CommandText = $"DROP TABLE IF EXISTS {table}"; + command.ExecuteNonQuery(); + connection.Close(); + connection.Dispose(); + } + + public async Task> GetStats() { + return await Task.FromResult>(stats); + } + + public Task GetStat(string id) { + return Task.FromResult(stats.FirstOrDefault(stat => stat.StatId == id)); + } + + public async Task CreateStat(string id, string name, + string? description = null) { + var stat = await GetStat(id); + if (stat != null) return stat; + stat = new SQLStat { StatId = id, Name = name, Description = description }; + return stat; + } + + public async Task RegisterStat(IStat stat) { + var sqlStat = (SQLStat)stat; + var command = connection.CreateCommand(); + command.CommandText = + $"INSERT INTO {table} (StatId, Name, Description) VALUES (@StatId, @Name, @Description)"; + command.Parameters.AddWithValue("@StatId", sqlStat.StatId); + command.Parameters.AddWithValue("@Name", sqlStat.Name); + command.Parameters.AddWithValue("@Description", sqlStat.Description); + await command.ExecuteNonQueryAsync(); + return stats.Add(stat); + } + + public async Task UnregisterStat(string id) { + var matches = stats.Where(stat => stat.StatId == id).ToList(); + foreach (var stat in matches) stats.Remove(stat); + + var command = connection.CreateCommand(); + command.CommandText = $"DELETE FROM {table} WHERE StatId = @StatId"; + command.Parameters.AddWithValue("@StatId", id); + await command.ExecuteNonQueryAsync(); + + return await Task.FromResult(matches.Count > 0); + } +} \ No newline at end of file diff --git a/GangsTest/GangsTest.csproj b/GangsTest/GangsTest.csproj index 566c73f..ebb4894 100644 --- a/GangsTest/GangsTest.csproj +++ b/GangsTest/GangsTest.csproj @@ -10,15 +10,16 @@ - - - - - + + + + + - + + @@ -28,7 +29,8 @@ - + + \ No newline at end of file diff --git a/GangsTest/StatTests/StatManagerData.cs b/GangsTest/StatTests/StatManagerData.cs index b118804..d83d0f7 100644 --- a/GangsTest/StatTests/StatManagerData.cs +++ b/GangsTest/StatTests/StatManagerData.cs @@ -1,11 +1,15 @@ using System.Collections; using GangsAPI; using GangsImpl.Memory; +using GangsImpl.SQL; namespace GangsTest.StatTests; public class StatManagerData : IEnumerable { - private readonly IBehavior[] behaviors = [new MockStatManager()]; + private readonly IBehavior[] behaviors = [ + new MockStatManager(), + new SQLStatManager("Server=localhost;User=root;Database=gang", "gang_unit_test") + ]; public StatManagerData() { foreach (var behavior in behaviors) behavior.Start();