using System.Reflection; using System.Text; using Omika.Data.HfSql.Metadata; using Omika.Data.HfSql.Protection; namespace HfSqlModelAudit; /// /// Audite les modèles physiques HFSQL (Batik / Omika) déclarés dans l'assembly /// Omika.Data. Lit par réflexion l'attribut de /// chaque type des namespaces Omika.Data.HfSql.Models.Batik et /// Omika.Data.HfSql.Models.Omika. /// /// Génère deux rapports : /// docs/diagnostics/hfsql-model-audit.csv /// docs/diagnostics/hfsql-model-audit.md /// /// Aucune connexion n'est ouverte et aucun secret n'est manipulé. /// public static class Program { private const string BatikNamespace = "Omika.Data.HfSql.Models.Batik"; private const string OmikaNamespace = "Omika.Data.HfSql.Models.Omika"; private sealed record ModelInfo( string Schema, string LogicalName, string DiskName, string Groups, string SchemaVersions); public static int Main(string[] args) { var outputDir = args.Length > 0 ? args[0] : @"D:\Avalonia\Omika\docs\diagnostics"; Directory.CreateDirectory(outputDir); var assembly = typeof(HfsqlFilePasswordDeriver).Assembly; var models = LoadModels(assembly); var batik = models.Where(m => m.Schema == "Batik").OrderBy(m => m.LogicalName).ToList(); var omika = models.Where(m => m.Schema == "Omika").OrderBy(m => m.LogicalName).ToList(); WriteCsv(Path.Combine(outputDir, "hfsql-model-audit.csv"), models); WriteMarkdown(Path.Combine(outputDir, "hfsql-model-audit.md"), batik, omika); Console.WriteLine($"Batik : {batik.Count} tables"); Console.WriteLine($"Omika : {omika.Count} tables"); Console.WriteLine($"Total : {models.Count} tables"); Console.WriteLine("Rapports générés dans " + outputDir); return 0; } private static List LoadModels(Assembly assembly) { var result = new List(); foreach (var type in assembly.GetTypes()) { string schema; if (type.Namespace == BatikNamespace) schema = "Batik"; else if (type.Namespace == OmikaNamespace) schema = "Omika"; else continue; var attr = type.GetCustomAttribute(); if (attr is null) continue; result.Add(new ModelInfo( schema, attr.TableName, attr.DiskName ?? "", string.Join(",", attr.Groups), string.Join(",", attr.SchemaVersions))); } return result; } private static void WriteCsv(string path, List models) { var sb = new StringBuilder(); sb.AppendLine("Schema,Table,DiskName,Groups,SchemaVersions"); foreach (var m in models.OrderBy(m => m.Schema).ThenBy(m => m.LogicalName)) { sb.AppendLine($"{m.Schema},{m.LogicalName},{m.DiskName},{m.Groups},{m.SchemaVersions}"); } File.WriteAllText(path, sb.ToString()); } private static void WriteMarkdown(string path, List batik, List omika) { var sb = new StringBuilder(); sb.AppendLine("# Audit des modèles physiques HFSQL"); sb.AppendLine(); sb.AppendLine("Généré par `tools/HfSqlModelAudit` à partir de l'assembly `Omika.Data`."); sb.AppendLine(); sb.AppendLine("## Batik"); sb.AppendLine(); sb.AppendLine($"**{batik.Count} tables**"); sb.AppendLine(); sb.AppendLine("| Table | DiskName | Groups |"); sb.AppendLine("|---|---|---|"); foreach (var m in batik) { sb.AppendLine($"| {m.LogicalName} | {m.DiskName} | {m.Groups} |"); } sb.AppendLine(); sb.AppendLine("## Omika"); sb.AppendLine(); sb.AppendLine($"**{omika.Count} tables**"); sb.AppendLine(); sb.AppendLine("| Table | DiskName | Groups |"); sb.AppendLine("|---|---|---|"); foreach (var m in omika) { sb.AppendLine($"| {m.LogicalName} | {m.DiskName} | {m.Groups} |"); } sb.AppendLine(); File.WriteAllText(path, sb.ToString()); } }