public static async Task <JToken> GetData(string path) { var convTokenPath = FlatJsonPath.ConvertUriPathToTokenPath(path); return(await Task.Run(() => { var db = DatabaseAccessService.OpenOrCreateDefault(); var store = db.GetCollection <JsonObjectStoreContainer>(DatabaseAccessService.GetDataStoreKey(0)); var rootObjectContainer = store.FindAll().FirstOrDefault(); var unflattenedJObj = new FlatJsonObject(rootObjectContainer.FlattenedJObject).Unflatten(); return unflattenedJObj.SelectToken(convTokenPath); })); }
public async Task DeleteData(DynDatabaseRequest request) { var domain = DbService.GetDomainPath(request.DatabaseId); var dataPath = new FlatJsonPath(request.Path); await Task.Run(() => { // Get existing data var existingData = DbService.Store.GetKeys(domain) .Where(x => x.StartsWith(dataPath.TokenPrefix, StringComparison.Ordinal)); // Remove existing data foreach (var key in existingData) { DbService.Store.Delete(domain, key); } }); }
public static async Task DeleteData(string path) { var convTokenPath = FlatJsonPath.ConvertUriPathToTokenPath(path); await Task.Run(() => { var db = DatabaseAccessService.OpenOrCreateDefault(); var store = db.GetCollection <JsonObjectStoreContainer>(DatabaseAccessService.GetDataStoreKey(0)); var rootObjectContainer = store.FindAll().FirstOrDefault(); using (var trans = db.BeginTrans()) { var flattenedJObj = new FlatJsonObject(rootObjectContainer.FlattenedJObject); flattenedJObj.RemoveNode(convTokenPath); // Update and store rootObjectContainer.FlattenedJObject = flattenedJObj; store.Update(rootObjectContainer); trans.Commit(); } }); }
public async Task <JToken> GetData(DynDatabaseRequest request, bool shallow = false) { var domain = DbService.GetDomainPath(request.DatabaseId); var dataPath = new FlatJsonPath(request.Path); return(await Task.Run(() => { if (!DbService.Store.Exists(domain)) { return null; // 404 - There's no data container } // Unflatten and retrieve JSON object var flatJsonDict = new Dictionary <string, string>(); // Use an optimization to only fetch requested keys foreach (var key in DbService.Store.GetKeysEnumerable(domain).Where(x => x.StartsWith(dataPath.TokenPrefix, StringComparison.Ordinal) || x.StartsWith(dataPath.ArrayPrefix, StringComparison.Ordinal))) { var val = DbService.Store.Get(domain, key); flatJsonDict.Add(key, val); } var unflattenedJObj = new FlatJsonObject(flatJsonDict).Unflatten(); if (shallow) { var resultObject = unflattenedJObj.SelectToken(dataPath.TokenPath); if (resultObject is JArray) { return new JArray(resultObject.Children().Select(c => new JValue(c ?? false))); } if (resultObject is JObject) { var filteredProps = (resultObject as JObject).Properties().Select(p => new JProperty(p.Name, (p.Children().FirstOrDefault() is JObject ? true : p.Value) ?? false)); return new JObject(filteredProps); } return null; } return unflattenedJObj.SelectToken(dataPath.TokenPath); })); }
public async Task <string> PlaceData(JObject dataBundle, DynDatabaseRequest request, NodeDataOvewriteMode overwriteMode, bool shouldRespond = true) { var realmDomain = DbService.GetDomainPath(request.DatabaseId); string responseResult = null; // Optionally used to return a result var dataPath = new FlatJsonPath(request.Path); var resultData = string.Empty; await Task.Run(() => { // Parse server values if (dataBundle.Children().Count() == 1 && dataBundle.First is JProperty && (dataBundle.First as JProperty).Name == ServerValueProvider.ServerValueKeyName) { var serverValueToken = ((JProperty)dataBundle.First).Value; var serverValueName = serverValueToken is JValue ? (serverValueToken as JValue).Value as string : null; var resultValue = ServerValueProvider.GetValue(serverValueName); // Now adjust path // Get the last segment, then remove it var lastSegment = dataPath.Segments.Last(); dataPath.Segments.RemoveAt(dataPath.Segments.Count - 1); dataBundle = new JObject(new JProperty(lastSegment, resultValue)); } // Put in the new data switch (overwriteMode) { case NodeDataOvewriteMode.Update: { // Flatten input bundle var flattenedBundle = new FlatJsonObject(dataBundle, dataPath.TokenPrefix); // Merge input bundle foreach (var kvp in flattenedBundle.Dictionary) { DbService.Store.Set(realmDomain, kvp.Key, kvp.Value); } resultData = dataBundle.ToString(); } break; case NodeDataOvewriteMode.Put: { // Flatten input bundle var dataTokenPrefix = dataPath.TokenPrefix; // Get existing data var flattenedBundle = new FlatJsonObject(dataBundle, dataTokenPrefix); var existingData = DbService.Store.GetKeys(realmDomain) .Where(x => x.StartsWith(dataTokenPrefix, StringComparison.Ordinal)); // Remove existing data foreach (var key in existingData) { DbService.Store.Delete(realmDomain, key); } // Add input bundle foreach (var kvp in flattenedBundle.Dictionary) { DbService.Store.Set(realmDomain, kvp.Key, kvp.Value); } resultData = dataBundle.ToString(); } break; case NodeDataOvewriteMode.Push: { // Use the Firebase Push ID algorithm var pushId = PushIdGenerator.GeneratePushId(); // Create flattened bundle with pushId added to prefix dataPath.Segments.Add(pushId); // Flatten input bundle var flattenedBundle = new FlatJsonObject(dataBundle, dataPath.TokenPrefix); // Merge input bundle foreach (var kvp in flattenedBundle.Dictionary) { DbService.Store.Set(realmDomain, kvp.Key, kvp.Value); } var pushResultBundle = new JObject(new JProperty("name", pushId)); resultData = pushResultBundle.ToString(); } break; } // If response is requested, return the result data if (shouldRespond) { responseResult = resultData; } }); return(responseResult); }
public static async Task <string> PlaceData(JObject dataBundleRoot, string path, NodeDataOvewriteMode ovewriteMode) { string result = null; // Optionally used to return a result var convTokenPath = FlatJsonPath.ConvertUriPathToTokenPath(path); var convTokenPrfx = FlatJsonPath.ConvertUriPathToTokenPrefix(path); await Task.Run(() => { var db = DatabaseAccessService.OpenOrCreateDefault(); var store = db.GetCollection <JsonObjectStoreContainer>(DatabaseAccessService.GetDataStoreKey(0)); if (store.Count() == 0) { using (var trans = db.BeginTrans()) { var newRoot = new JObject(); store.Insert(new JsonObjectStoreContainer { ContainerId = Guid.NewGuid(), FlattenedJObject = new FlatJsonObject() }); trans.Commit(); } } var rootObjectContainer = store.FindAll().FirstOrDefault(); var flattenedRootObject = new FlatJsonObject(rootObjectContainer.FlattenedJObject); //var rootObjectJ = JsonFlattener.UnflattenJObject(flattenedRootObject); using (var trans = db.BeginTrans()) { // Put in the new data switch (ovewriteMode) { case NodeDataOvewriteMode.Update: { // Flatten input bundle var flattenedBundle = new FlatJsonObject(dataBundleRoot, convTokenPrfx); flattenedRootObject.Merge(flattenedBundle); } break; case NodeDataOvewriteMode.Put: { // Flatten input bundle var flattenedBundle = new FlatJsonObject(dataBundleRoot, convTokenPrfx); // Remove existing data flattenedRootObject.RemoveNode(convTokenPath); // Add new data flattenedRootObject.Merge(flattenedBundle); } break; case NodeDataOvewriteMode.Push: { // Use the Firebase Push ID algorithm var pushId = PushIdGenerator.GeneratePushId(); // Create flattened bundle with pushId added to prefix convTokenPrfx = FlatJsonPath.AppendToTokenPrefix(convTokenPrfx, pushId); // Flatten input bundle var flattenedBundle = new FlatJsonObject(dataBundleRoot, convTokenPrfx); flattenedRootObject.Merge(flattenedBundle); result = pushId; } break; } // Update and store rootObjectContainer.FlattenedJObject = flattenedRootObject; store.Update(rootObjectContainer); trans.Commit(); } // Data was written }); return(result); }