Example #1
0
        private static IRouteResponse ImportEntity(EntityData entity)
        {
            IRouteResponse resp = RouteResponse.OK();

            // Evil!
            // Lock the whole process in case another async call fails and the client calls abort which gets
            // processed and then more import calls are received.
            lock (schemaLocker)
            {
                // We assume there's data!
                using (var tconn = OpenConnection())
                {
                    CheckForTable(tconn, entity.StoreName);

                    // Somewhat annoyingly we actually have to check all the records for any new field.
                    entity.StoreData.ForEach(d =>
                    {
                        foreach (var prop in d.Properties())
                        {
                            CheckForField(tconn, entity.StoreName, prop.Name);
                        }
                    });
                }
            }

            var tinfo       = transactions[entity.UserId];
            var transaction = tinfo.t;
            var conn        = tinfo.c;

            try
            {
                Interlocked.Increment(ref tinfo.transactionCount);
                Console.WriteLine($"{tinfo.transactionCount} {tinfo.rollbackCount} {tinfo.c.State}");

                for (int n = 0; n < entity.StoreData.Count && Interlocked.Read(ref tinfo.rollbackCount) == 0; ++n)
                {
                    lock (schemaLocker)
                    {
                        InsertRecord(conn, transaction, entity.UserId, entity.StoreName, entity.StoreData[n]);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                resp = RouteResponse.ServerError(new { Error = ex.Message });
            }
            finally
            {
                Interlocked.Decrement(ref tinfo.transactionCount);
            }


            return(resp);
        }
Example #2
0
        protected virtual void ProcessContext(HttpListenerContext context)
        {
            IRouteResponse resp = RouteResponse.BadRequest();

            try
            {
                var verb = context.Request.HttpMethod;
                var path = context.Request.RawUrl.LeftOf('?');
                Console.WriteLine($"{verb}: {path}");
                var route = router.GetRoute(verb, path);

                if (route != null)
                {
                    if (!route.AuthenticationRequired || AuthenticationService.Authenticated)
                    {
                        // We expect JSON data packets or URL data
                        string       data     = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding).ReadToEnd();
                        Type         dataType = route.DataType;
                        IRequestData packet   = CreateRequestPacket(context, data, dataType);
                        resp = route.Invoke(packet);

                        if (resp.ContentType == "text/html")
                        {
                            byte[] pageData = Encoding.ASCII.GetBytes(resp.PageText);
                            ContentResponder(context, pageData, resp.ContentType);
                        }
                        else
                        {
                            JsonResponder(context, resp);
                        }
                    }
                    else
                    {
                        NotAuthorized(context);
                    }
                }
                else if (verb == "GET" && webAppPath != null && TryFilePath(path, out byte[] data, out string contentType))