public DataEngine(ITracer tracer, string instanceName, int maxConcurrency, IStorageDriver storageDriver, DataContainerDescriptor containerDescriptor) { if (tracer == null) { throw new ArgumentNullException("tracer"); } if (maxConcurrency <= 0 || maxConcurrency > 10000) { throw new ArgumentOutOfRangeException("maxConcurrency"); } if (storageDriver == null) { throw new ArgumentNullException("storageDriver"); } if (containerDescriptor == null) { throw new ArgumentNullException("containerDescriptor"); } m_tracer = tracer; m_containerDescriptor = containerDescriptor; m_maxConcurrency = maxConcurrency; m_parsedRequestCache = new ParsedRequestCache(instanceName); m_storageDriver = storageDriver; m_parser = new QueryParser(containerDescriptor, maxConcurrency); m_activeProcessors = new ConcurrentDictionary <RequestExecutionContext, Task>(m_maxConcurrency, m_maxConcurrency); m_utcLastUsedAt = DateTime.UtcNow; }
private void ReadRequest(RequestExecutionContext context) { Serializer.MergeWithLengthPrefix(context.RequestMessage.Stream, context.Request, PrefixStyle.Base128); if (context.Request.PrepareOnly) { // prevent any ambiguities context.Request.ReturnDataset = false; } if (context.Request.HaveParameters) { context.ParsedRequest.HaveParametersDataInput = true; Serializer.MergeWithLengthPrefix(context.RequestMessage.Stream, context.RequestParameters, PrefixStyle.Base128); ReadParametersDataInput(context); } if (context.Request.HaveRequestBulk) { context.ParsedRequest.IsBulk = true; Serializer.MergeWithLengthPrefix(context.RequestMessage.Stream, context.RequestBulk, PrefixStyle.Base128); // after this point in stream, bulk input data will be read by instance of InputDataStreamEnumerator // e.g. we're not yet done reading the request stream here } if (m_tracer.IsInfoEnabled) { var cmdText = context.Request.CommandText; if (string.IsNullOrEmpty(cmdText) && context.Request.HaveRequestBulk) { cmdText = string.Format("Bulk {0} with {2} items on {1}", context.RequestBulk.DbStatementType, context.RequestBulk.EntityName, context.RequestBulk.InputItemsCount); } m_tracer.Info("Received command: " + cmdText); } // bring up cache record var cacheKey = ParsedRequestCache.GetRequestHash(context.Request, context.RequestBulk, context.RequestParameters); var cacheInfo = m_parsedRequestCache.AddOrGetExisting(cacheKey, context.Request.HaveParameters); context.AttachCachedInfo(cacheInfo); // populate cache record if (!cacheInfo.HaveRequestHeaders) { lock (cacheInfo) { cacheInfo.CheckIsError(); if (!cacheInfo.HaveRequestHeaders) { cacheInfo.ReadRequestHeaders(context.Request, context.RequestParameters, context.RequestBulk, context.ParsedRequest); } } } }