using System; using System.Collections.Generic; using System.IO; using NLog; namespace DataModel.Process { public class QueryRepository { /// /// Repository name /// public string Name { get; } /// /// Repository base directory /// public string BaseDirectory { get; } /// /// In memory cache /// private static readonly Dictionary cache = new Dictionary(); /// /// Shared logger instance /// private static readonly Logger logger = LogManager.GetCurrentClassLogger(); /// /// Constructor /// /// Repository name /// Repository base directory public QueryRepository(string name, string baseDirectory) { Name = name; BaseDirectory = baseDirectory; if (!Directory.Exists(baseDirectory)) { Directory.CreateDirectory(baseDirectory); } logger.Info($"Query repository '{name}' initialized at base directory '{baseDirectory}'."); } /// /// Gets query SQL /// /// Name of query to get SQL for /// Query SQL public string GetQuery(string queryName) { string querySource = string.Empty; if (!cache.TryGetValue(queryName, out querySource)) { //Check if file exists string fullPath = Path.Combine(BaseDirectory, $"{queryName}.sql"); if (!File.Exists(fullPath)) { throw new Exception($"Cannot retreive query '{queryName}': '{fullPath}' does not exist"); } //Read file querySource = File.ReadAllText(fullPath); querySource = querySource.Replace("PRODDTA", "PRODDTA"); querySource = querySource.Replace("ARCDTAPD", "ARCDTAPD"); File.WriteAllText(fullPath, querySource); //Cache source cache.Add(queryName, querySource); } return querySource; } /// /// Sets querie's SQL /// /// Name of query to set SQL for /// SQL to set for query public void SetQuery(string queryName, string querySource) { logger.Info($"[{Name}] setting SQL for query '{queryName}'."); //Update cache cache[queryName] = querySource; //Write source to file string fullPath = Path.Combine(BaseDirectory, $"{queryName}.sql"); File.WriteAllText(fullPath, querySource); } /// /// Indexer override /// /// Name of query /// SQL for query public string this[string queryName] { get => GetQuery(queryName); set => SetQuery(queryName, value); } } }