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