using System.Text; namespace Sonex.Data.Database; public sealed class DbClientSessionInfo { public string ApplicationName { get; set; } = string.Empty; public string ApplicationVersion { get; set; } = string.Empty; public string InstanceId { get; set; } = string.Empty; public string? OsVersion { get; set; } public string? OsVersionNumber { get; set; } public string? OsProductName { get; set; } public string? OsDisplayVersion { get; set; } public string BuildDatabaseApplicationName() { var parts = new List(4); AddPart(parts, ApplicationName, 20); AddPart(parts, ApplicationVersion, 18); AddPart(parts, InstanceId, 12); AddPart(parts, OsVersion, 18); var value = string.Join('|', parts); return value.Length <= 63 ? value : value[..63]; } private static void AddPart(List parts, string? value, int maxLength) { var normalized = Normalize(value, maxLength); if (!string.IsNullOrWhiteSpace(normalized)) parts.Add(normalized); } private static string Normalize(string? value, int maxLength) { if (string.IsNullOrWhiteSpace(value)) return string.Empty; var builder = new StringBuilder(value.Length); foreach (var ch in value) { if (ch < 32 || ch > 126 || ch == '|') continue; builder.Append(ch == ' ' ? '-' : ch); } var result = builder.ToString(); return result.Length <= maxLength ? result : result[..maxLength]; } }