Raven.Database.DocumentDatabase.ApplyPatch C# (CSharp) Method

ApplyPatch() public method

public ApplyPatch ( string docId, System.Guid etag, PatchRequest patchDoc, Raven.Abstractions.Data.TransactionInformation transactionInformation ) : PatchResult
docId string
etag System.Guid
patchDoc PatchRequest
transactionInformation Raven.Abstractions.Data.TransactionInformation
return PatchResult
		public PatchResult ApplyPatch(string docId, Guid? etag, PatchRequest[] patchDoc, TransactionInformation transactionInformation)
		{
			var result = PatchResult.Patched;
			bool shouldRetry = false;
			int retries = 128;
			do
			{
				TransactionalStorage.Batch(actions =>
				{
					var doc = actions.Documents.DocumentByKey(docId, transactionInformation);
					if (doc == null)
					{
						result = PatchResult.DocumentDoesNotExists;
					}
					else if (etag != null && doc.Etag != etag.Value)
					{
						Debug.Assert(doc.Etag != null);
						throw new ConcurrencyException("Could not patch document '" + docId + "' because non current etag was used")
						{
							ActualETag = doc.Etag.Value,
							ExpectedETag = etag.Value,
						};
					}
					else
					{
						var jsonDoc = doc.ToJson();
						new JsonPatcher(jsonDoc).Apply(patchDoc);
						try
						{
							Put(doc.Key, doc.Etag, jsonDoc, jsonDoc.Value<RavenJObject>("@metadata"), transactionInformation);
						}
						catch (ConcurrencyException)
						{
							if(retries-- > 0)
							{
								shouldRetry = true;
								return;
							}
							throw;
						}
						result = PatchResult.Patched;
					}
					if (shouldRetry == false)
						workContext.ShouldNotifyAboutWork();
				});

			} while (shouldRetry);
			return result;
		}

Usage Example

 public JArray UpdateByIndex(string indexName, IndexQuery queryToUpdate, PatchRequest[] patchRequests, bool allowStale)
 {
     return(PerformBulkOperation(indexName, queryToUpdate, allowStale, (docId, tx) =>
     {
         var patchResult = database.ApplyPatch(docId, null, patchRequests, tx);
         return new { Document = docId, Result = patchResult };
     }));
 }