using System; using System.Collections.Generic; using System.IO; using Newtonsoft.Json; using Serilog; using SyncEngine.Configuration; namespace SyncEngine.Access { /// /// Fallback: view SQL exported manually from Access into config/access-views.json. /// internal sealed class AccessViewConfigLoader { private readonly SyncOptions _options; private readonly ILogger _logger; public AccessViewConfigLoader(SyncOptions options, ILogger logger) { _options = options; _logger = logger; } public bool TryLoadQueries(IList queries) { var path = Path.Combine(_options.ConfigDirectory, "access-views.json"); if (!File.Exists(path)) { return false; } try { var map = JsonConvert.DeserializeObject>(File.ReadAllText(path)); if (map == null || map.Count == 0) { return false; } foreach (var entry in map) { var query = new AccessQuerySchema { Name = entry.Key, SqlText = entry.Value ?? "" }; AccessSchemaReader.ClassifyQuery(query); queries.Add(query); } _logger.Information( "Loaded {Count} Access queries from {Path} ({Provision} marked for SQL Server views)", queries.Count, path, CountProvisionable(queries)); return queries.Count > 0; } catch (Exception ex) { _logger.Warning("Could not load {Path} ({Message})", path, ex.Message); return false; } } private static int CountProvisionable(IList queries) { var count = 0; foreach (var query in queries) { if (query.ShouldProvision) { count++; } } return count; } } }