using MySql.Data.MySqlClient; namespace HikvisionAttendanceService.Data; internal sealed class MySqlHrmsDbConnectionFactory : IHrmsDbConnectionFactory { private readonly HikvisionAttendanceWindowsService.HikvisionServiceConfig _config; public MySqlHrmsDbConnectionFactory(HikvisionAttendanceWindowsService.HikvisionServiceConfig config) { _config = config; } public string BuildConnectionStringMasked() { if (TryBuildConnectionString(out var cs, out _)) { var b = new MySqlConnectionStringBuilder(cs); b.Password = "***"; return b.ConnectionString; } return "(invalid)"; } public bool TryBuildConnectionString(out string connectionString, out string error) { connectionString = ""; error = ""; if (!string.IsNullOrWhiteSpace(_config.DbConnectionString)) { connectionString = _config.DbConnectionString.Trim(); return true; } if (string.IsNullOrWhiteSpace(_config.DbHost) || string.IsNullOrWhiteSpace(_config.DbUsername) || string.IsNullOrWhiteSpace(_config.DbName)) { error = "DbHost/DbUsername/DbName are required when DbConnectionString is empty."; return false; } var b = new MySqlConnectionStringBuilder { Server = _config.DbHost.Trim(), Port = (uint)(_config.DbPort > 0 ? _config.DbPort : 3306), Database = _config.DbName.Trim(), UserID = _config.DbUsername.Trim(), Password = _config.DbPassword ?? "", DefaultCommandTimeout = 30 }; connectionString = b.ConnectionString; return true; } }