示例#1
0
 public StreamQueryContent(HttpRequestMessage req, QueryActions.DatabaseQueryOperation queryOp, IStorageActionsAccessor accessor, CancellationTokenSourceExtensions.CancellationTimeout timeout, Action <string> contentTypeSetter)
 {
     this.req                = req;
     this.queryOp            = queryOp;
     this.accessor           = accessor;
     _timeout                = timeout;
     outputContentTypeSetter = contentTypeSetter;
 }
示例#2
0
        public HttpResponseMessage SteamQueryGet(string id)
        {
            var cts     = new CancellationTokenSource();
            var timeout = cts.TimeoutAfter(DatabasesLandlord.SystemConfiguration.DatabaseOperationTimeout);
            var msg     = GetEmptyMessage();

            var index = id;
            var query = GetIndexQuery(int.MaxValue);

            if (string.IsNullOrEmpty(GetQueryStringValue("pageSize")))
            {
                query.PageSize = int.MaxValue;
            }
            var isHeadRequest = InnerRequest.Method == HttpMethods.Head;

            if (isHeadRequest)
            {
                query.PageSize = 0;
            }

            var accessor = Database.TransactionalStorage.CreateAccessor(); //accessor will be disposed in the StreamQueryContent.SerializeToStreamAsync!

            try
            {
                var queryOp = new QueryActions.DatabaseQueryOperation(Database, index, query, accessor, cts);
                queryOp.Init();

                msg.Content = new StreamQueryContent(InnerRequest, queryOp, accessor, timeout, mediaType => msg.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType)
                {
                    CharSet = "utf-8"
                });
                msg.Headers.Add("Raven-Result-Etag", queryOp.Header.ResultEtag.ToString());
                msg.Headers.Add("Raven-Index-Etag", queryOp.Header.IndexEtag.ToString());
                msg.Headers.Add("Raven-Is-Stale", queryOp.Header.IsStale ? "true" : "false");
                msg.Headers.Add("Raven-Index", queryOp.Header.Index);
                msg.Headers.Add("Raven-Total-Results", queryOp.Header.TotalResults.ToString(CultureInfo.InvariantCulture));
                msg.Headers.Add("Raven-Index-Timestamp", queryOp.Header.IndexTimestamp.GetDefaultRavenFormat());

                if (IsCsvDownloadRequest(InnerRequest))
                {
                    msg.Content.Headers.Add("Content-Disposition", "attachment; filename=export.csv");
                }
            }
            catch (OperationCanceledException e)
            {
                accessor.Dispose();
                throw new TimeoutException(string.Format("The query did not produce results in {0}", DatabasesLandlord.SystemConfiguration.DatabaseOperationTimeout), e);
            }
            catch (Exception)
            {
                accessor.Dispose();
                throw;
            }

            return(msg);
        }
示例#3
0
 public StreamQueryContent(HttpRequestMessage req, QueryActions.DatabaseQueryOperation queryOp, IStorageActionsAccessor accessor, CancellationTimeout timeout, Action <string> contentTypeSetter)
 {
     headers                 = CurrentOperationContext.Headers.Value;
     user                    = CurrentOperationContext.User.Value;
     this.req                = req;
     this.queryOp            = queryOp;
     this.accessor           = accessor;
     _timeout                = timeout;
     outputContentTypeSetter = contentTypeSetter;
 }
        public long GetDocumentCountForEntityNames(string query)
        {
            long localDocumentCount = 0;

            database.TransactionalStorage.Batch(actions =>
            {
                using (var internalCts = new CancellationTokenSource())
                    using (var linked = CancellationTokenSource.CreateLinkedTokenSource(database.WorkContext.CancellationToken, internalCts.Token))
                        using (var op = new QueryActions.DatabaseQueryOperation(database, Constants.DocumentsByEntityNameIndex, new IndexQuery
                        {
                            Query = query,
                            PageSize = int.MaxValue
                        }, actions, linked)
                        {
                            ShouldSkipDuplicateChecking = true
                        })
                        {
                            op.Init();
                            localDocumentCount = op.Header.TotalResults;
                        }
            });

            return(localDocumentCount);
        }
示例#5
0
        public Task <HttpResponseMessage> Exploration()
        {
            var linq       = GetQueryStringValue("linq");
            var collection = GetQueryStringValue("collection");
            int timeoutSeconds;

            if (int.TryParse(GetQueryStringValue("timeoutSeconds"), out timeoutSeconds) == false)
            {
                timeoutSeconds = 60;
            }
            int pageSize;

            if (int.TryParse(GetQueryStringValue("pageSize"), out pageSize) == false)
            {
                pageSize = 100000;
            }

            var hash            = Encryptor.Current.Hash.Compute16(Encoding.UTF8.GetBytes(linq));
            var sourceHashed    = MonoHttpUtility.UrlEncode(Convert.ToBase64String(hash));
            var transformerName = Constants.TemporaryTransformerPrefix + sourceHashed;

            var transformerDefinition = Database.IndexDefinitionStorage.GetTransformerDefinition(transformerName);

            if (transformerDefinition == null)
            {
                transformerDefinition = new TransformerDefinition
                {
                    Name             = transformerName,
                    Temporary        = true,
                    TransformResults = linq
                };
                Database.Transformers.PutTransform(transformerName, transformerDefinition);
            }

            var msg = GetEmptyMessage();

            using (var cts = new CancellationTokenSource())
            {
                var timeout    = cts.TimeoutAfter(TimeSpan.FromSeconds(timeoutSeconds));
                var indexQuery = new IndexQuery
                {
                    PageSize           = pageSize,
                    Start              = 0,
                    Query              = "Tag:" + collection,
                    ResultsTransformer = transformerName
                };

                var accessor = Database.TransactionalStorage.CreateAccessor(); //accessor will be disposed in the StreamQueryContent.SerializeToStreamAsync!

                try
                {
                    var queryOp = new QueryActions.DatabaseQueryOperation(Database, "Raven/DocumentsByEntityName", indexQuery, accessor, cts);
                    queryOp.Init();

                    msg.Content = new StreamQueryContent(InnerRequest, queryOp, accessor, timeout, mediaType => msg.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType)
                    {
                        CharSet = "utf-8"
                    },
                                                         o =>
                    {
                        if (o.Count == 2 &&
                            o.ContainsKey(Constants.DocumentIdFieldName) &&
                            o.ContainsKey(Constants.Metadata))
                        {
                            // this is the raw value out of the server, we don't want to get that
                            var doc = queryOp.DocRetriever.Load(o.Value <string>(Constants.DocumentIdFieldName));
                            var djo = doc as IDynamicJsonObject;
                            if (djo != null)
                            {
                                return(djo.Inner);
                            }
                        }
                        return(o);
                    });
                    msg.Headers.Add("Raven-Result-Etag", queryOp.Header.ResultEtag.ToString());
                    msg.Headers.Add("Raven-Index-Etag", queryOp.Header.IndexEtag.ToString());
                    msg.Headers.Add("Raven-Is-Stale", queryOp.Header.IsStale ? "true" : "false");
                    msg.Headers.Add("Raven-Index", queryOp.Header.Index);
                    msg.Headers.Add("Raven-Total-Results", queryOp.Header.TotalResults.ToString(CultureInfo.InvariantCulture));
                    msg.Headers.Add("Raven-Index-Timestamp", queryOp.Header.IndexTimestamp.GetDefaultRavenFormat());

                    if (IsCsvDownloadRequest(InnerRequest))
                    {
                        msg.Content.Headers.Add("Content-Disposition", "attachment; filename=export.csv");
                    }
                }
                catch (Exception)
                {
                    accessor.Dispose();
                    throw;
                }

                return(new CompletedTask <HttpResponseMessage>(msg));
            }
        }