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());
}
}