public override void Respond(HttpListenerContext context) { var match = urlMatcher.Match(context.Request.Url.LocalPath); var docId = match.Groups[1].Value; switch (context.Request.HttpMethod) { case "GET": context.Response.Headers["Content-Type"] = "application/json; charset=utf-8"; var doc = Database.Get(docId,GetRequestTransaction(context)); if (doc == null) { context.SetStatusToNotFound(); return; } if (context.MatchEtag(doc.Etag)) { context.SetStatusToNotModified(); return; } context.WriteData(doc.Data, doc.Metadata, doc.Etag); break; case "DELETE": Database.Delete(docId, context.GetEtag(), GetRequestTransaction(context)); context.SetStatusToDeleted(); break; case "PUT": Put(context, docId); break; case "PATCH": var patchDoc = context.ReadJsonArray(); var patchResult = Database.ApplyPatch(docId, context.GetEtag(), patchDoc, GetRequestTransaction(context)); switch (patchResult) { case PatchResult.DocumentDoesNotExists: context.SetStatusToNotFound(); break; case PatchResult.Patched: context.WriteJson(new {patched = true}); break; default: throw new ArgumentOutOfRangeException("Value " + patchResult + " is not understood"); } break; } }
public override void Respond(HttpListenerContext context) { var itemsToLoad = context.ReadJsonArray(); var results = new JArray(); Database.TransactionalStorage.Batch(actions => { foreach (JToken item in itemsToLoad) { var documentByKey = actions.DocumentByKey(item.Value<string>(), GetRequestTransaction(context)); if (documentByKey == null) continue; results.Add(documentByKey.ToJson()); } actions.Commit(); }); context.WriteJson(results); }
private void Batch(HttpListenerContext context) { var jsonCommandArray = context.ReadJsonArray(); var commands = new List<ICommandData>(); foreach (JObject jsonCommand in jsonCommandArray) { var key = jsonCommand["key"]; switch (jsonCommand["method"].Value<string>()) { case "PUT": commands.Add(new PutCommandData { Key = key.Value<string>(), Etag = GetEtagFromCommand(jsonCommand), Document = jsonCommand["document"] as JObject, Metadata = jsonCommand["@metadata"] as JObject, TransactionInformation = GetRequestTransaction(context) }); break; case "DELETE": commands.Add(new DeleteCommandData { Key = key.Value<string>(), Etag = GetEtagFromCommand(jsonCommand), TransactionInformation = GetRequestTransaction(context) }); continue; default: throw new ArgumentException("Batching only supports PUT and DELETE."); } } var batchResult = Database.Batch(commands); context.WriteJson(batchResult); }