Example #1
0
        public Task DeleteByIndexAsync(string indexName, IndexQuery queryToDelete, bool allowStale)
        {
            string path    = queryToDelete.GetIndexQueryUrl(url, indexName, "bulk_docs") + "&allowStale=" + allowStale;
            var    request = jsonRequestFactory.CreateHttpJsonRequest(this, path, "DELETE", credentials, convention);

            request.AddOperationHeaders(OperationsHeaders);
            return(request.ReadResponseStringAsync()
                   .ContinueWith(task =>
            {
                var aggregateException = task.Exception;
                if (aggregateException == null)
                {
                    return task;
                }
                var e = aggregateException.ExtractSingleInnerException() as WebException;
                if (e == null)
                {
                    return task;
                }
                var httpWebResponse = e.Response as HttpWebResponse;
                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.NotFound)
                {
                    throw new InvalidOperationException("There is no index named: " + indexName, e);
                }
                return task;
            }).Unwrap());
        }
        public override HttpRequestMessage CreateRequest(ServerNode node, out string url)
        {
            var notNullOptions = Options ?? new QueryOperationOptions();
            var u = $"{node.Url}/databases/{node.Database}";

            url = $"{QueryToDelete.GetIndexQueryUrl(u, IndexName, "queries")}&allowStale=" +
                  $"{notNullOptions.AllowStale}&details={notNullOptions.RetrieveDetails}";

            if (notNullOptions.MaxOpsPerSecond != null)
            {
                url += "&maxOpsPerSec=" + notNullOptions.StaleTimeout;
            }
            if (notNullOptions.StaleTimeout != null)
            {
                url += "&staleTimeout=" + notNullOptions.StaleTimeout;
            }

            IsReadRequest = false;
            var request = new HttpRequestMessage
            {
                Method = HttpMethod.Delete,
            };

            return(request);
        }
        public override HttpRequestMessage CreateRequest(ServerNode node, out string url)
        {
            var notNullOptions = Options ?? new QueryOperationOptions();
            var u = $"{node.Url}/databases/{node.Database}";

            url = $"{QueryToUpdate.GetIndexQueryUrl(u, IndexName, "queries")}&allowStale=" +
                  $"{notNullOptions.AllowStale}&maxOpsPerSec={notNullOptions.MaxOpsPerSecond}&details={notNullOptions.RetrieveDetails}";

            if (notNullOptions.StaleTimeout != null)
            {
                url += "&staleTimeout=" + notNullOptions.StaleTimeout;
            }

            var request = new HttpRequestMessage
            {
                Method  = HttpMethods.Patch,
                Content = new BlittableJsonContent(stream =>
                {
                    Context.Write(stream, Script);
                })
            };

            IsReadRequest = false;
            return(request);
        }
Example #4
0
        /// <summary>
        /// Begins the async query.
        /// </summary>
        /// <param name="index">The index.</param>
        /// <param name="query">The query.</param>
        /// <param name="includes">The include paths</param>
        /// <returns></returns>
        public Task <QueryResult> QueryAsync(string index, IndexQuery query, string[] includes)
        {
            EnsureIsNotNullOrEmpty(index, "index");
            var path = query.GetIndexQueryUrl(url, index, "indexes");

            if (includes != null && includes.Length > 0)
            {
                path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
            }
            var request = jsonRequestFactory.CreateHttpJsonRequest(this, path, "GET", credentials, convention);

            return(request.ReadResponseStringAsync()
                   .ContinueWith(task => AttemptToProcessResponse(() =>
            {
                RavenJObject json;
                using (var reader = new JsonTextReader(new StringReader(task.Result)))
                    json = (RavenJObject)RavenJToken.ReadFrom(reader);

                return new QueryResult
                {
                    IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
                    IndexTimestamp = json.Value <DateTime>("IndexTimestamp"),
                    IndexEtag = new Guid(request.ResponseHeaders["ETag"].First()),
                    Results = ((RavenJArray)json["Results"]).Cast <RavenJObject>().ToList(),
                    TotalResults = Convert.ToInt32(json["TotalResults"].ToString()),
                    SkippedResults = Convert.ToInt32(json["SkippedResults"].ToString()),
                    Includes = ((RavenJArray)json["Includes"]).Cast <RavenJObject>().ToList(),
                };
            })));
        }
Example #5
0
        private QueryResult DirectQuery(string index, IndexQuery query, string operationUrl)
        {
            string path    = query.GetIndexQueryUrl(operationUrl, index, "indexes");
            var    request = HttpJsonRequest.CreateHttpJsonRequest(this, path, "GET", credentials);

            request.AddOperationHeaders(OperationsHeaders);
            var    serializer = convention.CreateSerializer();
            JToken json;

            try
            {
                using (var reader = new JsonTextReader(new StringReader(request.ReadResponseString())))
                    json = (JToken)serializer.Deserialize(reader);
            }
            catch (WebException e)
            {
                var httpWebResponse = e.Response as HttpWebResponse;
                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.NotFound)
                {
                    throw new InvalidOperationException("There is no index named: " + index);
                }
                throw;
            }
            return(new QueryResult
            {
                IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
                Results = json["Results"].Children().Cast <JObject>().ToArray(),
                TotalResults = Convert.ToInt32(json["TotalResults"].ToString())
            });
        }
Example #6
0
        /// <summary>
        /// Begins the async query.
        /// </summary>
        /// <param name="index">The index.</param>
        /// <param name="query">The query.</param>
        /// <param name="includes">The include paths</param>
        public Task <QueryResult> QueryAsync(string index, IndexQuery query, string[] includes)
        {
            EnsureIsNotNullOrEmpty(index, "index");
            var path = query.GetIndexQueryUrl(url, index, "indexes");

            if (includes != null && includes.Length > 0)
            {
                path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
            }
            var request = HttpJsonRequest.CreateHttpJsonRequest(this, path, "GET", credentials, convention);

            return(Task.Factory.FromAsync <string>(request.BeginReadResponseString, request.EndReadResponseString, null)
                   .ContinueWith(task =>
            {
                JToken json;
                using (var reader = new JsonTextReader(new StringReader(task.Result)))
                    json = (JToken)convention.CreateSerializer().Deserialize(reader);

                return new QueryResult
                {
                    IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
                    IndexTimestamp = json.Value <DateTime>("IndexTimestamp"),
                    IndexEtag = new Guid(request.ResponseHeaders["ETag"]),
                    Results = json["Results"].Children().Cast <JObject>().ToList(),
                    TotalResults = Convert.ToInt32(json["TotalResults"].ToString()),
                    IndexName = json.Value <string>("IndexName"),
                    SkippedResults = Convert.ToInt32(json["SkippedResults"].ToString())
                };
            }));
        }
Example #7
0
        /// <summary>
        /// Begins the async query.
        /// </summary>
        /// <param name="index">The index.</param>
        /// <param name="query">The query.</param>
        /// <param name="includes">The include paths</param>
        /// <returns></returns>
        public Task <QueryResult> QueryAsync(string index, IndexQuery query, string[] includes)
        {
            EnsureIsNotNullOrEmpty(index, "index");
            var path = query.GetIndexQueryUrl(url, index, "indexes");

            if (includes != null && includes.Length > 0)
            {
                path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
            }
            var request = jsonRequestFactory.CreateHttpJsonRequest(this, path.NoCache(), "GET", credentials, convention);

            return(request.ReadResponseJsonAsync()
                   .ContinueWith(task => AttemptToProcessResponse(() => SerializationHelper.ToQueryResult((RavenJObject)task.Result, request.ResponseHeaders["ETag"].First()))));
        }
Example #8
0
        /// <summary>
        /// Begins the async query.
        /// </summary>
        /// <param name="index">The index.</param>
        /// <param name="query">The query.</param>
        /// <param name="includes">The include paths</param>
        public Task <QueryResult> QueryAsync(string index, IndexQuery query, string[] includes)
        {
            EnsureIsNotNullOrEmpty(index, "index");
            var path = query.GetIndexQueryUrl(url, index, "indexes");

            if (includes != null && includes.Length > 0)
            {
                path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
            }
            var request = jsonRequestFactory.CreateHttpJsonRequest(this, path, "GET", credentials, convention);

            return(request.ReadResponseJsonAsync()
                   .ContinueWith(task =>
            {
                RavenJObject json;
                try
                {
                    json = (RavenJObject)task.Result;
                }
                catch (AggregateException e)
                {
                    var we = e.ExtractSingleInnerException() as WebException;
                    if (we != null)
                    {
                        var httpWebResponse = we.Response as HttpWebResponse;
                        if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.NotFound)
                        {
                            var text = new StreamReader(httpWebResponse.GetResponseStreamWithHttpDecompression()).ReadToEnd();
                            if (text.Contains("maxQueryString"))
                            {
                                throw new InvalidOperationException(text, e);
                            }
                            throw new InvalidOperationException("There is no index named: " + index);
                        }
                    }
                    throw;
                }

                return new QueryResult
                {
                    IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
                    IndexTimestamp = json.Value <DateTime>("IndexTimestamp"),
                    IndexEtag = new Guid(request.ResponseHeaders["ETag"]),
                    Results = ((RavenJArray)json["Results"]).Cast <RavenJObject>().ToList(),
                    TotalResults = Convert.ToInt32(json["TotalResults"].ToString()),
                    IndexName = json.Value <string>("IndexName"),
                    SkippedResults = Convert.ToInt32(json["SkippedResults"].ToString())
                };
            }));
        }
Example #9
0
        public override HttpRequestMessage CreateRequest(ServerNode node, out string url)
        {
            var method = (IndexQuery.Query == null || IndexQuery.Query.Length <= Convention.MaxLengthOfQueryUsingGetUrl)
                ? HttpMethod.Get : HttpMethod.Post;

            var request = new HttpRequestMessage
            {
                Method = method
            };

            if (method == HttpMethod.Post)
            {
                request.Content = new BlittableJsonContent(stream =>
                {
                    using (var writer = new BlittableJsonTextWriter(Context, stream))
                    {
                        writer.WriteStartObject();
                        writer.WritePropertyName("Query");
                        writer.WriteString(IndexQuery.Query);
                        writer.WriteEndObject();
                    }
                });
            }

            var indexQueryUrl = IndexQuery.GetIndexQueryUrl(Index, "queries", includeQuery: method == HttpMethod.Get);

            EnsureIsNotNullOrEmpty(indexQueryUrl, "index");

            var pathBuilder = new StringBuilder(indexQueryUrl);

            if (MetadataOnly)
            {
                pathBuilder.Append("&metadata-only=true");
            }
            if (IndexEntriesOnly)
            {
                pathBuilder.Append("&debug=entries");
            }
            if (Includes != null && Includes.Count > 0)
            {
                pathBuilder.Append("&").Append(string.Join("&", Includes.Select(x => "include=" + x).ToArray()));
            }

            url = $"{node.Url}/databases/{node.Database}/" + pathBuilder;
            return(request);
        }
        public IAsyncResult BeginQuery(string index, IndexQuery query, AsyncCallback callback, object state)
        {
            EnsureIsNotNullOrEmpty(index, "index");
            string path    = query.GetIndexQueryUrl(url, index, "indexes");
            var    request = HttpJsonRequest.CreateHttpJsonRequest(this, path, "GET", credentials);

            var asyncCallback = callback;

            if (callback != null)
            {
                asyncCallback = ar => callback(new UserAsyncData(request, ar));
            }

            var asyncResult = request.BeginReadResponseString(asyncCallback, state);

            return(new UserAsyncData(request, asyncResult));
        }
Example #11
0
        private QueryResult DirectQuery(string index, IndexQuery query, string operationUrl, string[] includes)
        {
            string path = query.GetIndexQueryUrl(operationUrl, index, "indexes");

            if (includes != null && includes.Length > 0)
            {
                path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
            }
            var request = jsonRequestFactory.CreateHttpJsonRequest(this, path, "GET", credentials, convention);

            request.AddOperationHeaders(OperationsHeaders);
            var    serializer = convention.CreateSerializer();
            JToken json;

            try
            {
                using (var reader = new JsonTextReader(new StringReader(request.ReadResponseString())))
                    json = (JToken)serializer.Deserialize(reader);
            }
            catch (WebException e)
            {
                var httpWebResponse = e.Response as HttpWebResponse;
                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.NotFound)
                {
                    throw new InvalidOperationException("There is no index named: " + index);
                }
                throw;
            }
            return(new QueryResult
            {
                IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
                IndexTimestamp = json.Value <DateTime>("IndexTimestamp"),
                IndexEtag = new Guid(request.ResponseHeaders["ETag"]),
                Results = json["Results"].Children().Cast <JObject>().ToList(),
                Includes = json["Includes"].Children().Cast <JObject>().ToList(),
                TotalResults = Convert.ToInt32(json["TotalResults"].ToString()),
                IndexName = json.Value <string>("IndexName"),
                SkippedResults = Convert.ToInt32(json["SkippedResults"].ToString()),
            });
        }
Example #12
0
        private static IndexQuery EncodeAndDecodeIndexQuery(IndexQuery query)
        {
            string indexQueryUrl = query.GetIndexQueryUrl(Some.String(), Some.String(), Some.String());

            // indexQueryUrl is in the form "/path?querystring#anchor"

            string indexQueryQuerystring = indexQueryUrl.Substring(indexQueryUrl.IndexOf("?") + 1);

            int indexOfPoint = indexQueryQuerystring.IndexOf('#');

            if (indexOfPoint != -1)
            {
                indexQueryQuerystring = indexQueryQuerystring.Substring(0, indexOfPoint);
            }

            IHttpRequest request = MockRepository.GenerateStub <IHttpRequest>();
            IHttpContext context = MockRepository.GenerateMock <IHttpContext>();

            context.Stub(c => c.Request).Return(request);
            request.Stub(r => r.QueryString).Return(HttpUtility.ParseQueryString(indexQueryQuerystring));

            return(context.GetIndexQueryFromHttpContext(1024));
        }
Example #13
0
 public void DeleteByIndex(string indexName, IndexQuery queryToDelete, bool allowStale)
 {
     ExecuteWithReplication <object>(operationUrl =>
     {
         string path = queryToDelete.GetIndexQueryUrl(operationUrl, indexName, "bulk_docs") + "&allowStale=" + allowStale;
         var request = HttpJsonRequest.CreateHttpJsonRequest(this, path, "DELETE", credentials);
         request.AddOperationHeaders(OperationsHeaders);
         try
         {
             request.ReadResponseString();
         }
         catch (WebException e)
         {
             var httpWebResponse = e.Response as HttpWebResponse;
             if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.NotFound)
             {
                 throw new InvalidOperationException("There is no index named: " + indexName);
             }
             throw;
         }
         return(null);
     });
 }
Example #14
0
 public void UpdateByIndex(string indexName, IndexQuery queryToUpdate, PatchRequest[] patchRequests, bool allowStale)
 {
     ExecuteWithReplication <object>(operationUrl =>
     {
         string path = queryToUpdate.GetIndexQueryUrl(operationUrl, indexName, "bulk_docs") + "&allowStale=" + allowStale;
         var request = HttpJsonRequest.CreateHttpJsonRequest(this, path, "PATCH", credentials);
         request.AddOperationHeaders(OperationsHeaders);
         request.Write(new JArray(patchRequests.Select(x => x.ToJson())).ToString(Formatting.Indented));
         try
         {
             request.ReadResponseString();
         }
         catch (WebException e)
         {
             var httpWebResponse = e.Response as HttpWebResponse;
             if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.NotFound)
             {
                 throw new InvalidOperationException("There is no index named: " + indexName);
             }
             throw;
         }
         return(null);
     });
 }
Example #15
0
		/// <summary>
		/// Begins the async query.
		/// </summary>
		/// <param name="index">The index.</param>
		/// <param name="query">The query.</param>
		/// <param name="includes">The include paths</param>
		public Task<QueryResult> QueryAsync(string index, IndexQuery query, string[] includes)
		{
			EnsureIsNotNullOrEmpty(index, "index");
			var path = query.GetIndexQueryUrl(url, index, "indexes");
			if (includes != null && includes.Length > 0)
			{
				path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
			}
			var request = HttpJsonRequest.CreateHttpJsonRequest(this, path, "GET", credentials, convention);

			return Task.Factory.FromAsync<string>(request.BeginReadResponseString, request.EndReadResponseString, null)
				.ContinueWith(task =>
				{
					JToken json;
					using (var reader = new JsonTextReader(new StringReader(task.Result)))
						json = (JToken)convention.CreateSerializer().Deserialize(reader);

					return new QueryResult
					{
						IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
						IndexTimestamp = json.Value<DateTime>("IndexTimestamp"),
						IndexEtag = new Guid(request.ResponseHeaders["ETag"]),
						Results = json["Results"].Children().Cast<JObject>().ToList(),
						TotalResults = Convert.ToInt32(json["TotalResults"].ToString()),
						IndexName = json.Value<string>("IndexName"),
						SkippedResults = Convert.ToInt32(json["SkippedResults"].ToString())
					};
				});

		}
Example #16
0
		private static IndexQuery EncodeAndDecodeIndexQuery(IndexQuery query)
		{
			string indexQueryUrl = query.GetIndexQueryUrl(Some.String(), Some.String(), Some.String());

			// indexQueryUrl is in the form "/path?querystring#anchor"

			string indexQueryQuerystring = indexQueryUrl.Substring(indexQueryUrl.IndexOf('?') + 1);

			int indexOfPoint = indexQueryQuerystring.IndexOf('#');
			if (indexOfPoint != -1)
			{
				indexQueryQuerystring = indexQueryQuerystring.Substring(0, indexOfPoint);
			}

			IHttpRequest request = MockRepository.GenerateStub<IHttpRequest>();
			IHttpContext context = MockRepository.GenerateMock<IHttpContext>();
			context.Stub(c => c.Request).Return(request);
			request.Stub(r => r.QueryString).Return(HttpUtility.ParseQueryString(indexQueryQuerystring));

			return context.GetIndexQueryFromHttpContext(1024);
		}
Example #17
0
        public void Query(string index, IndexQuery query, string[] includes, CallbackFunction.Load<QueryResult> callback)
        {
            string path = query.GetIndexQueryUrl(string.Empty, index, "indexes");
            if (includes != null && includes.Length > 0)
            {
                path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
            }

            HttpJsonRequest request;
            this.CreateContext(new Uri(string.Format("{0}/{1}?", this.DatabaseAddress, path)), RequestMethod.GET, out request);

            request.HttpWebRequest.BeginGetResponse((result) => Query_Callback(request, result, callback), request);
        }