Example #1
0
        // 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);
        }
Example #2
0
 public static DtoLikes Obtain()
 {
     if (!bag.TryTake(out var obj))
     {
         obj = new DtoLikes();
     }
     return(obj);
 }
Example #3
0
 // 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;
     }
 }
Example #4
0
        // 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);
        }
Example #5
0
        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);
        }
Example #6
0
 public static void Release(DtoLikes obj)
 {
     obj.Reset();
     bag.Add(obj);
 }