// synchronously process the request from requestBuffer, and return statusCode public int Process(HttpCtx ctx, int dummy) { var startTime = Stats.Watch.Elapsed; // path sanity check foreach (var query in ctx.Params) { var value = query.Value; if (value.IsEmpty) { return(400); } if (query.Key != "query_id") { // all other parameters are invalid return(400); } } // parse Json and process dto var buffer = ctx.Buffer; var start = ctx.RequestBodyStart; var dto = DtoLikes.Obtain(); int statusCode = 400; try { if (DtoLikes.Parse(buffer, start, dto, store)) { // update the likes in the storage statusCode = store.VerifyNewLikes(dto); if (statusCode == 202) { ctx.PostAction = () => { store.PostNewLikes(dto); DtoLikes.Release(dto); } } ; } } catch (Exception) { // fall through } if (ctx.PostAction == null) { DtoLikes.Release(dto); } var stopTime = Stats.Watch.Elapsed; ctx.ContextType = "PostLikes"; // return the result return(statusCode); }
public static DtoLikes Obtain() { if (!bag.TryTake(out var obj)) { obj = new DtoLikes(); } return(obj); }
// post-processing, serialized public void PostNewLikes(DtoLikes dtoLikes) { for (int i = 0; i < dtoLikes.likes.Count; i++) { var dtoLike = dtoLikes.likes[i]; var id = dtoLike.liker; var acct = Accounts[id]; var like = new Like { id = dtoLike.likee, ts = dtoLike.ts }; addLike(id, ref acct, like); Accounts[id] = acct; } }
// pre-validation public int VerifyNewLikes(DtoLikes dtoLikes) { bool lockTaken = false; try { updateLock.Enter(ref lockTaken); if (!verifyLikes(dtoLikes.likes)) { return(400); } } finally { if (lockTaken) { updateLock.Exit(); } } return(202); }
public static bool Parse(byte[] buffer, int start, DtoLikes dto, Storage store) { JsonReader reader = new JsonReader(buffer, start); if (reader.ReadIsNull() || !reader.ReadIsBeginObject()) { return(false); } if (!reader.ReadPropertyNameSegmentRaw().EqualTo(s_likes)) { return(false); } // read array members if (!reader.ReadIsBeginArray()) { return(false); } while (true) { var like = new DtoLike(); // read array of DtoLike objects if (!reader.ReadIsBeginObject()) { break; } // like properties while (true) { var prop = reader.ReadPropertyNameSegmentRaw(); if (prop[0] == (byte)'t') // ts { if (reader.GetCurrentJsonToken() != JsonToken.Number) { return(false); } like.ts = Like.ExtToIntTS(reader.ReadInt32()); } else if (prop[prop.Count - 1] == (byte)'e') // likee { if (reader.GetCurrentJsonToken() != JsonToken.Number) { return(false); } if (!Mapper.ExtIdToIntId(reader.ReadInt32(), out like.likee)) { return(false); } } else if (prop[prop.Count - 1] == (byte)'r') // liker { if (reader.GetCurrentJsonToken() != JsonToken.Number) { return(false); } if (!Mapper.ExtIdToIntId(reader.ReadInt32(), out like.liker)) { return(false); } } else { return(false); } if (!reader.ReadIsValueSeparator()) { break; } } if (!reader.ReadIsEndObject()) { return(false); } // add the like if (like.likee > 0 && like.liker > 0) { dto.likes.Add(like); } else { return(false); } if (!reader.ReadIsValueSeparator()) { break; } } if (!reader.ReadIsEndArray()) { return(false); } if (!reader.ReadIsEndObject()) { return(false); } return(true); }
public static void Release(DtoLikes obj) { obj.Reset(); bag.Add(obj); }