diff --git a/SzCli/Logger.cs b/SzCli/Logger.cs index 5a483e9..0719f40 100644 --- a/SzCli/Logger.cs +++ b/SzCli/Logger.cs @@ -1,13 +1,25 @@ using SzCore; +using SzCore.Defaults; namespace SzCli; -public class Logger(ISzFileManager fileManager) : ISzLogger +public class Logger : ISzLogger { + private DefaultLocalFileManager _fileManager; public bool LogToFile { get; set; } = true; - public string LogFilePath { get; set; } = Path.Combine(fileManager.DataPath, "log.txt"); + public string LogFilePath { get; set; } public int LogFileMaxLines { get; set; } = 100; + public Logger(DefaultLocalFileManager fm) + { + _fileManager = fm; + LogFilePath = Path.Combine(_fileManager.DataPath, "log.txt"); + AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => + { + LogError($"[EXCEPTION] {eventArgs.Exception}"); + }; + } + public void Log(string text) { Console.WriteLine($"{DateTime.UtcNow} : [SZ LOG] {text}"); diff --git a/SzCli/Program.cs b/SzCli/Program.cs index dc9cf40..6539f5b 100644 --- a/SzCli/Program.cs +++ b/SzCli/Program.cs @@ -27,12 +27,4 @@ public class Program // _logger.Log(loadedDataset?.DataObjects["test"].Fields["value"].Value ?? "Could not get value of test.value"); } -} - -public class WeirdThing -{ - public void Yuh() - { - SZ.Logger.Log("Service test success"); - } } \ No newline at end of file diff --git a/SzCore/Defaults/DefaultLocalFileManager.cs b/SzCore/Defaults/DefaultLocalFileManager.cs index 073f724..e4459be 100644 --- a/SzCore/Defaults/DefaultLocalFileManager.cs +++ b/SzCore/Defaults/DefaultLocalFileManager.cs @@ -2,21 +2,16 @@ namespace SzCore.Defaults; public class DefaultLocalFileManager : ISzFileManager { - public string DataPath - { - get - { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data"); - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } - - return path; - } - } - + public string DataPath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data"); public string DatasetsPath => Path.Combine(DataPath, "datasets"); + public string TemplatesPath => Path.Combine(DataPath, "templates"); + + public DefaultLocalFileManager() + { + Directory.CreateDirectory(DataPath); + Directory.CreateDirectory(DatasetsPath); + Directory.CreateDirectory(TemplatesPath); + } public bool SaveFile(string path, string fileContent) { diff --git a/SzCore/ISzDatabaseHandler.cs b/SzCore/ISzDatabaseHandler.cs new file mode 100644 index 0000000..235e141 --- /dev/null +++ b/SzCore/ISzDatabaseHandler.cs @@ -0,0 +1,6 @@ +namespace SzCore; + +public interface ISzDatabaseHandler +{ + +} \ No newline at end of file diff --git a/SzCore/ISzFileManager.cs b/SzCore/ISzFileManager.cs index 47bfe2d..bdba2af 100644 --- a/SzCore/ISzFileManager.cs +++ b/SzCore/ISzFileManager.cs @@ -6,6 +6,7 @@ public interface ISzFileManager { public string DataPath {get;} public string DatasetsPath {get;} + public string TemplatesPath {get;} public bool SaveFile(string path, string fileContent); public string? LoadFile(string path); diff --git a/SzCore/SZ.cs b/SzCore/SZ.cs index 1ffcac2..3b732b9 100644 --- a/SzCore/SZ.cs +++ b/SzCore/SZ.cs @@ -32,8 +32,8 @@ public static class SZ } } - private static Dictionary _services = []; - private static List _protectedServices = []; + private static readonly Dictionary _services = []; + private static readonly List _protectedServices = []; /// /// Initalizes the SZ singleton in SzCore diff --git a/SzCore/SzCore.csproj b/SzCore/SzCore.csproj index bb23fb7..f46f471 100644 --- a/SzCore/SzCore.csproj +++ b/SzCore/SzCore.csproj @@ -1,9 +1,12 @@ - + net8.0 enable enable - + + + + diff --git a/SzCore/SzDataHandler.cs b/SzCore/SzDataHandler.cs index cfd1e95..2e5f106 100644 --- a/SzCore/SzDataHandler.cs +++ b/SzCore/SzDataHandler.cs @@ -1,6 +1,85 @@ +using SzCore.DataObjects; + namespace SzCore; public class SzDataHandler { + private Dictionary _loadedDatasets = []; + public SzDataHandler(){} + + public bool SaveDataset(SzDataset dataset) + { + var datasetPath = Path.Combine(SZ.LocalFileManager.DatasetsPath, dataset.Id, "dataset.json"); + try + { + return SZ.LocalFileManager.SaveFile(datasetPath, SZ.SzParser.SerializeDatasetToJson(dataset)); + } + catch (Exception e) + { + SZ.Logger.LogError("Error saving dataset: " + e.Message); + return false; + } + } + + public SzDataset? LoadDataset(string datasetId) + { + if (_loadedDatasets.TryGetValue(datasetId, out SzDataset? value)) + { + if (value is not null) return value; + } + + var datasetPath = Path.Combine(SZ.LocalFileManager.DataPath, "datasets", datasetId, "dataset.json"); + + var json = SZ.LocalFileManager.LoadFile(datasetPath); + if (json is null) + { + SZ.Logger.LogWarning($"Could not load dataset with ID '{datasetId}'"); + return null; + } + + var parsedDataset = SZ.SzParser.DeserializeDataset(json); + if (parsedDataset is null) + { + SZ.Logger.LogWarning($"Could not load dataset with ID '{datasetId}'"); + return null; + } + + _loadedDatasets.Add(parsedDataset.Id, parsedDataset); + return parsedDataset; + } + + // The client should periodically call this to free memory, probably + private void ClearLoadedDatasets() + { + _loadedDatasets.Clear(); + } + + // Only use this for test purposes, we probably don't want to load all datasets to memory in production + private void LoadAllDatasets() + { + ClearLoadedDatasets(); + if (!Directory.Exists(SZ.LocalFileManager.DatasetsPath)) + { + throw new Exception("Could not load datasets, the datase directory does not exist."); + } + + foreach (var dir in Directory.GetDirectories(SZ.LocalFileManager.DatasetsPath)) + { + var datasetFilePath = Path.Combine(dir, "dataset.json"); + if (!File.Exists(datasetFilePath)) continue; + + var datasetJson = SZ.LocalFileManager.LoadFile(datasetFilePath); + if (datasetJson == null) continue; + + var parsedDataset = SZ.SzParser.DeserializeDataset(datasetJson); + if (parsedDataset == null) + { + SZ.Logger.LogWarning($"Parse error: Could not parse file {datasetFilePath} as an SzDataset"); + continue; + } + + _loadedDatasets.Add(parsedDataset.Id, parsedDataset); + } + } } \ No newline at end of file diff --git a/SzCore/SzParser.cs b/SzCore/SzParser.cs index a6f9de7..364eeab 100644 --- a/SzCore/SzParser.cs +++ b/SzCore/SzParser.cs @@ -34,26 +34,5 @@ public class SzParser return null; } } - - public bool SaveDataset(SzDataset dataset) - { - var datasetPath = Path.Combine(SZ.LocalFileManager.DatasetsPath, dataset.Id, "dataset.json"); - try - { - return SZ.LocalFileManager.SaveFile(datasetPath, SerializeDatasetToJson(dataset)); - } - catch (Exception e) - { - SZ.Logger.LogError("Error saving dataset: " + e.Message); - return false; - } - } - - public SzDataset? LoadDataset(string datasetId) - { - var datasetPath = Path.Combine(SZ.LocalFileManager.DataPath, "datasets", datasetId, "dataset.json"); - var json = SZ.LocalFileManager.LoadFile(datasetPath); - return json is null ? null : DeserializeDataset(json); - } }