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); }
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))