Compare commits

...

7 Commits

Author SHA1 Message Date
Dawid Bepierszcz
86e3f69989 Fixed migrations 2025-10-17 01:52:43 +02:00
Dawid Bepierszcz
4d19ac4d77 Delete CS2-SimpleAdmin/Database/Migration.cs 2025-10-17 01:50:52 +02:00
Dawid Bepierszcz
503d2f63c3 Fixed migrations 2025-10-17 01:50:22 +02:00
Dawid Bepierszcz
cb1bf60060 Delete CS2-SimpleAdmin/Database/Migrations/Mysql directory 2025-10-17 01:49:31 +02:00
Dawid Bepierszcz
3a57371be9 Updated StatusBlocker 2025-10-16 03:04:13 +02:00
Dawid Bepierszcz
63ca44bb78 Delete Modules/CS2-SimpleAdmin_StealthModule/METAMOD PLUGIN/StatusBlocker-v1.0.3-linux.tar.gz 2025-10-16 03:03:48 +02:00
Dawid Bepierszcz
3270403ea1 Delete Modules/CS2-SimpleAdmin_StealthModule/METAMOD PLUGIN/StatusBlocker-v1.0.3-windows.tar.gz 2025-10-16 03:03:40 +02:00
11 changed files with 145 additions and 134 deletions

View File

@@ -1,94 +1,105 @@
using System.Data.Common; using System.Data.Common;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace CS2_SimpleAdmin.Database; namespace CS2_SimpleAdmin.Database;
public class Migration(string migrationsPath) public class Migration(string migrationsPath)
{ {
/// <summary> /// <summary>
/// Executes all migration scripts found in the configured migrations path that have not been applied yet. /// Executes all migration scripts found in the configured migrations path that have not been applied yet.
/// Creates a migration tracking table if it does not exist. /// Creates a migration tracking table if it does not exist.
/// Applies migration scripts in filename order and logs successes or failures. /// Applies migration scripts in filename order and logs successes or failures.
/// </summary> /// </summary>
public async Task ExecuteMigrationsAsync() public async Task ExecuteMigrationsAsync()
{ {
if (CS2_SimpleAdmin.DatabaseProvider == null) return; if (CS2_SimpleAdmin.DatabaseProvider == null) return;
var files = Directory.GetFiles(migrationsPath, "*.sql").OrderBy(f => f).ToList(); var files = Directory.GetFiles(migrationsPath, "*.sql").OrderBy(f => f).ToList();
if (files.Count == 0) return; if (files.Count == 0) return;
await using var connection = await CS2_SimpleAdmin.DatabaseProvider.CreateConnectionAsync(); await using var connection = await CS2_SimpleAdmin.DatabaseProvider.CreateConnectionAsync();
await using (var cmd = connection.CreateCommand())
await using (var cmd = connection.CreateCommand()) {
{ if (migrationsPath.Contains("sqlite", StringComparison.CurrentCultureIgnoreCase))
cmd.CommandText = """ {
CREATE TABLE IF NOT EXISTS sa_migrations ( cmd.CommandText = """
id INTEGER PRIMARY KEY AUTOINCREMENT, CREATE TABLE IF NOT EXISTS sa_migrations (
version TEXT NOT NULL id INTEGER PRIMARY KEY AUTOINCREMENT,
); version TEXT NOT NULL
);
""";
""";
await cmd.ExecuteNonQueryAsync(); }
} else
{
var lastAppliedVersion = await GetLastAppliedVersionAsync(connection); cmd.CommandText = """
CREATE TABLE IF NOT EXISTS sa_migrations (
foreach (var file in files) id INT PRIMARY KEY AUTO_INCREMENT,
{ version VARCHAR(128) NOT NULL
var version = Path.GetFileNameWithoutExtension(file); );
if (string.Compare(version, lastAppliedVersion, StringComparison.OrdinalIgnoreCase) <= 0) """;
continue; }
try await cmd.ExecuteNonQueryAsync();
{ }
var sqlScript = await File.ReadAllTextAsync(file);
var lastAppliedVersion = await GetLastAppliedVersionAsync(connection);
await using (var cmdMigration = connection.CreateCommand())
{ foreach (var file in files)
cmdMigration.CommandText = sqlScript; {
await cmdMigration.ExecuteNonQueryAsync(); var version = Path.GetFileNameWithoutExtension(file);
} if (string.Compare(version, lastAppliedVersion, StringComparison.OrdinalIgnoreCase) <= 0)
continue;
await UpdateLastAppliedVersionAsync(connection, version);
try
CS2_SimpleAdmin._logger?.LogInformation($"Migration \"{version}\" successfully applied."); {
} var sqlScript = await File.ReadAllTextAsync(file);
catch (Exception ex)
{ await using (var cmdMigration = connection.CreateCommand())
CS2_SimpleAdmin._logger?.LogError(ex, $"Error applying migration \"{version}\"."); {
break; cmdMigration.CommandText = sqlScript;
} await cmdMigration.ExecuteNonQueryAsync();
} }
}
await UpdateLastAppliedVersionAsync(connection, version);
/// <summary>
/// Retrieves the version string of the last applied migration from the database. CS2_SimpleAdmin._logger?.LogInformation($"Migration \"{version}\" successfully applied.");
/// </summary> }
/// <param name="connection">The open database connection.</param> catch (Exception ex)
/// <returns>The version string of the last applied migration, or empty string if none.</returns> {
private static async Task<string> GetLastAppliedVersionAsync(DbConnection connection) CS2_SimpleAdmin._logger?.LogError(ex, $"Error applying migration \"{version}\".");
{ break;
await using var cmd = connection.CreateCommand(); }
cmd.CommandText = "SELECT version FROM sa_migrations ORDER BY id DESC LIMIT 1;"; }
var result = await cmd.ExecuteScalarAsync(); }
return result?.ToString() ?? string.Empty;
} /// <summary>
/// Retrieves the version string of the last applied migration from the database.
/// <summary> /// </summary>
/// Inserts a record tracking the successful application of a migration version. /// <param name="connection">The open database connection.</param>
/// </summary> /// <returns>The version string of the last applied migration, or empty string if none.</returns>
/// <param name="connection">The open database connection.</param> private static async Task<string> GetLastAppliedVersionAsync(DbConnection connection)
/// <param name="version">The version string of the migration applied.</param> {
private static async Task UpdateLastAppliedVersionAsync(DbConnection connection, string version) await using var cmd = connection.CreateCommand();
{ cmd.CommandText = "SELECT version FROM sa_migrations ORDER BY id DESC LIMIT 1;";
await using var cmd = connection.CreateCommand(); var result = await cmd.ExecuteScalarAsync();
cmd.CommandText = "INSERT INTO sa_migrations (version) VALUES (@Version);"; return result?.ToString() ?? string.Empty;
}
var param = cmd.CreateParameter();
param.ParameterName = "@Version"; /// <summary>
param.Value = version; /// Inserts a record tracking the successful application of a migration version.
cmd.Parameters.Add(param); /// </summary>
/// <param name="connection">The open database connection.</param>
await cmd.ExecuteNonQueryAsync(); /// <param name="version">The version string of the migration applied.</param>
} private static async Task UpdateLastAppliedVersionAsync(DbConnection connection, string version)
} {
await using var cmd = connection.CreateCommand();
cmd.CommandText = "INSERT INTO sa_migrations (version) VALUES (@Version);";
var param = cmd.CreateParameter();
param.ParameterName = "@Version";
param.Value = version;
cmd.Parameters.Add(param);
await cmd.ExecuteNonQueryAsync();
}
}

View File

@@ -36,6 +36,7 @@ CREATE TABLE IF NOT EXISTS `sa_admins` (
`flags` TEXT NULL, `flags` TEXT NULL,
`immunity` int(11) NOT NULL DEFAULT 0, `immunity` int(11) NOT NULL DEFAULT 0,
`server_id` INT NULL, `server_id` INT NULL,
`ends` timestamp NULL, `ends` timestamp NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)

View File

@@ -20,7 +20,6 @@ CREATE TABLE IF NOT EXISTS `sa_groups_servers` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE `sa_admins` ADD `group_id` INT NULL AFTER `created`; ALTER TABLE `sa_admins` ADD `group_id` INT NULL AFTER `created`;
ALTER TABLE `sa_groups_flags` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE CASCADE; ALTER TABLE `sa_groups_flags` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE CASCADE;
ALTER TABLE `sa_groups_servers` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE CASCADE; ALTER TABLE `sa_groups_servers` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE CASCADE;
ALTER TABLE `sa_admins` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE SET NULL; ALTER TABLE `sa_admins` ADD FOREIGN KEY (`group_id`) REFERENCES `sa_groups`(`id`) ON DELETE SET NULL;

View File

@@ -1 +1 @@
ALTER TABLE `sa_servers` ADD `rcon_password` varchar(128) NULL AFTER `hostname`; ALTER TABLE `sa_servers` ADD `rcon_password` varchar(128) NULL AFTER `hostname`;

View File

@@ -1,13 +1,13 @@
DELETE FROM `sa_players_ips` DELETE FROM `sa_players_ips`
WHERE `id` NOT IN ( WHERE `id` NOT IN (
SELECT * FROM ( SELECT * FROM (
SELECT MIN(`id`) SELECT MIN(`id`)
FROM `sa_players_ips` FROM `sa_players_ips`
GROUP BY `steamid` GROUP BY `steamid`
) AS `keep_ids` ) AS `keep_ids`
); );
DELETE FROM sa_players_ips WHERE INET_ATON(address) IS NULL AND address IS NOT NULL; DELETE FROM sa_players_ips WHERE INET_ATON(address) IS NULL AND address IS NOT NULL;
UPDATE `sa_players_ips` SET `address` = INET_ATON(address); UPDATE `sa_players_ips` SET `address` = INET_ATON(address);
ALTER TABLE `sa_players_ips` CHANGE `address` `address` INT UNSIGNED NOT NULL; ALTER TABLE `sa_players_ips` CHANGE `address` `address` INT UNSIGNED NOT NULL;
ALTER TABLE `sa_players_ips` ADD INDEX (used_at DESC); ALTER TABLE `sa_players_ips` ADD INDEX (used_at DESC);
ALTER TABLE `sa_players_ips` ADD `name` VARCHAR(64) NULL DEFAULT NULL AFTER `steamid`; ALTER TABLE `sa_players_ips` ADD `name` VARCHAR(64) NULL DEFAULT NULL AFTER `steamid`;

View File

@@ -1,3 +1,3 @@
ALTER TABLE sa_mutes ADD INDEX (player_steamid, status, ends); ALTER TABLE sa_mutes ADD INDEX (player_steamid, status, ends);
ALTER TABLE sa_mutes ADD INDEX(player_steamid, status, server_id, duration); ALTER TABLE sa_mutes ADD INDEX(player_steamid, status, server_id, duration);
ALTER TABLE sa_mutes ADD INDEX(player_steamid, type); ALTER TABLE sa_mutes ADD INDEX(player_steamid, type);

View File

@@ -1,23 +1,23 @@
ALTER TABLE `sa_bans` CHANGE `player_steamid` `player_steamid` BIGINT NULL DEFAULT NULL; ALTER TABLE `sa_bans` CHANGE `player_steamid` `player_steamid` BIGINT NULL DEFAULT NULL;
UPDATE `sa_bans` UPDATE `sa_bans`
SET admin_steamid = '0' SET admin_steamid = '0'
WHERE admin_steamid NOT REGEXP '^[0-9]+$'; WHERE admin_steamid NOT REGEXP '^[0-9]+$';
ALTER TABLE `sa_bans` CHANGE `admin_steamid` `admin_steamid` BIGINT NOT NULL; ALTER TABLE `sa_bans` CHANGE `admin_steamid` `admin_steamid` BIGINT NOT NULL;
ALTER TABLE `sa_mutes` CHANGE `player_steamid` `player_steamid` BIGINT NULL DEFAULT NULL; ALTER TABLE `sa_mutes` CHANGE `player_steamid` `player_steamid` BIGINT NULL DEFAULT NULL;
UPDATE `sa_mutes` UPDATE `sa_mutes`
SET admin_steamid = '0' SET admin_steamid = '0'
WHERE admin_steamid NOT REGEXP '^[0-9]+$'; WHERE admin_steamid NOT REGEXP '^[0-9]+$';
ALTER TABLE `sa_mutes` CHANGE `admin_steamid` `admin_steamid` BIGINT NOT NULL; ALTER TABLE `sa_mutes` CHANGE `admin_steamid` `admin_steamid` BIGINT NOT NULL;
ALTER TABLE `sa_warns` CHANGE `player_steamid` `player_steamid` BIGINT NULL DEFAULT NULL; ALTER TABLE `sa_warns` CHANGE `player_steamid` `player_steamid` BIGINT NULL DEFAULT NULL;
UPDATE `sa_warns` UPDATE `sa_warns`
SET admin_steamid = '0' SET admin_steamid = '0'
WHERE admin_steamid NOT REGEXP '^[0-9]+$'; WHERE admin_steamid NOT REGEXP '^[0-9]+$';
ALTER TABLE `sa_warns` CHANGE `admin_steamid` `admin_steamid` BIGINT NOT NULL; ALTER TABLE `sa_warns` CHANGE `admin_steamid` `admin_steamid` BIGINT NOT NULL;
UPDATE `sa_admins` UPDATE `sa_admins`
SET player_steamid = '0' SET player_steamid = '0'
WHERE player_steamid NOT REGEXP '^[0-9]+$'; WHERE player_steamid NOT REGEXP '^[0-9]+$';
ALTER TABLE `sa_admins` CHANGE `player_steamid` `player_steamid` BIGINT NULL DEFAULT NULL; ALTER TABLE `sa_admins` CHANGE `player_steamid` `player_steamid` BIGINT NULL DEFAULT NULL;