Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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);
                    }
                }
            }
        }