diff --git a/JsonFlatFileDataStore.Test/SingleItemTests.cs b/JsonFlatFileDataStore.Test/SingleItemTests.cs index 0828957..9bc7eb4 100644 --- a/JsonFlatFileDataStore.Test/SingleItemTests.cs +++ b/JsonFlatFileDataStore.Test/SingleItemTests.cs @@ -100,6 +100,41 @@ public void GetItem_Nullable_NotFound() UTHelpers.Down(newFilePath); } + [Fact] + public void GetRoot_Dynamic() + { + var pathToJson = UTHelpers.Up(); + + var store = new DataStore(pathToJson); + + // Get root + var root = store.GetRoot(); + + Assert.Equal(1, root.user[0].id); + Assert.Equal(2.1, root.myValue); + Assert.Equal("Carrillo", root.family[0].parents[0].name); + + UTHelpers.Down(pathToJson); + } + + [Fact] + public void GetRoot_Typed() + { + var pathToJson = UTHelpers.Up(); + + // Open database (create new if file doesn't exist) + var store = new DataStore(pathToJson); + + // Get root + var root = store.GetRoot<Store>(); + + Assert.Equal(1, root.User.First().Id); + Assert.Equal(2.1, root.MyValue); + Assert.Equal("Carrillo", root.Family.First().Parents.First().Name); + + UTHelpers.Down(pathToJson); + } + [Fact] public void NotFound_Exception() { diff --git a/JsonFlatFileDataStore.Test/TestModels.cs b/JsonFlatFileDataStore.Test/TestModels.cs index 1c36c5c..183de9a 100644 --- a/JsonFlatFileDataStore.Test/TestModels.cs +++ b/JsonFlatFileDataStore.Test/TestModels.cs @@ -163,4 +163,14 @@ public class World public float CameraRotationY { get; set; } } + + public class Store + { + public List<User> User { get; set; } + public List<Movie> Movies { get; set; } + public List<Family> Family { get; set; } + public List<World> Worlds { get; set; } + public Double MyValue { get; set; } + public List<Double> MyValues { get; set; } + } } \ No newline at end of file diff --git a/JsonFlatFileDataStore/DataStore.cs b/JsonFlatFileDataStore/DataStore.cs index 0432137..57d035a 100644 --- a/JsonFlatFileDataStore/DataStore.cs +++ b/JsonFlatFileDataStore/DataStore.cs @@ -438,6 +438,39 @@ private async Task<bool> InnerCommit(bool isOperationAsync, CommitAction commitA return actionSuccess; } + public dynamic GetRoot() + { + if (_reloadBeforeGetCollection) + { + _jsonData = JObject.Parse(ReadJsonFromFile(_filePath)); + } + + if (_jsonData == null) + return null; + + return SingleDynamicItemReadConverter(_jsonData); + } + + public T GetRoot<T>() + { + if (_reloadBeforeGetCollection) + { + _jsonData = JObject.Parse(ReadJsonFromFile(_filePath)); + } + + if (_jsonData == null) + { + if (Nullable.GetUnderlyingType(typeof(T)) != null) + { + return default(T); + } + + throw new KeyNotFoundException(); + } + + return _jsonData.ToObject<T>(); + } + private dynamic SingleDynamicItemReadConverter(JToken e) { switch (e) diff --git a/JsonFlatFileDataStore/IDataStore.cs b/JsonFlatFileDataStore/IDataStore.cs index ef8928b..283eaed 100644 --- a/JsonFlatFileDataStore/IDataStore.cs +++ b/JsonFlatFileDataStore/IDataStore.cs @@ -129,6 +129,19 @@ public interface IDataStore : IDisposable /// <param name="key">Item key</param> /// <returns>true if items found for deletion</returns> Task<bool> DeleteItemAsync(string key); + + /// <summary> + /// Get root item + /// </summary> + /// <returns>Dynamic item</returns> + dynamic GetRoot(); + + /// <summary> + /// Get root item + /// </summary> + /// <typeparam name="T">Item type</typeparam> + /// <returns>Typed item</returns> + T GetRoot<T>(); } public enum ValueType diff --git a/README.md b/README.md index aab7f92..6ed9a2c 100644 --- a/README.md +++ b/README.md @@ -456,6 +456,16 @@ var counter = store.GetItem<int>("counter"); var user = store.GetItem("myUser"); ``` +`GetRoot` will return the dynamic root object and `GetRoot<T>` will return the root object of type T. + +```csharp +var store = new DataStore(pathToJson); +// Dynamic data +var settingsDynamic = store.GetRoot(); +// Typed data +var settings = store.GetRoot<Settings>("myUser"); +``` + Typed data will throw `KeyNotFoundException` if key is not found. Dynamic data and nullable types will return null. ```csharp