// Apply the options in the URL query to the specified revision and create a new revision object private static RevisionInternal ApplyOptions(DocumentContentOptions options, RevisionInternal rev, ICouchbaseListenerContext context, Database db, Status outStatus) { if ((options & (DocumentContentOptions.IncludeRevs | DocumentContentOptions.IncludeRevsInfo | DocumentContentOptions.IncludeConflicts | DocumentContentOptions.IncludeAttachments | DocumentContentOptions.IncludeLocalSeq)) != 0) { var dst = rev.GetProperties(); if (options.HasFlag(DocumentContentOptions.IncludeLocalSeq)) { dst["_local_seq"] = rev.GetSequence(); } if (options.HasFlag(DocumentContentOptions.IncludeRevs)) { dst["_revisions"] = db.GetRevisionHistoryDict(rev); } if (options.HasFlag(DocumentContentOptions.IncludeRevsInfo)) { dst["_revs_info"] = db.GetRevisionHistory(rev).Select(x => { string status = "available"; if (x.IsDeleted()) { status = "deleted"; } else if (x.IsMissing()) { status = "missing"; } return(new Dictionary <string, object> { { "rev", x.GetRevId() }, { "status", status } }); }); } if (options.HasFlag(DocumentContentOptions.IncludeConflicts)) { RevisionList revs = db.GetAllRevisionsOfDocumentID(rev.GetDocId(), true); if (revs.Count > 1) { dst["_conflicts"] = revs.Select(x => { return(x.Equals(rev) || x.IsDeleted() ? null : x.GetRevId()); }); } } RevisionInternal nuRev = new RevisionInternal(dst); if (options.HasFlag(DocumentContentOptions.IncludeAttachments)) { bool attEncodingInfo = context.GetQueryParam <bool>("att_encoding_info", bool.TryParse, false); if (!db.ExpandAttachments(nuRev, 0, false, !attEncodingInfo, outStatus)) { return(null); } } rev = nuRev; } return(rev); }
// Apply the options in the URL query to the specified revision and create a new revision object internal static RevisionInternal ApplyOptions(DocumentContentOptions options, RevisionInternal rev, ICouchbaseListenerContext context, Database db, Status outStatus) { if ((options & (DocumentContentOptions.IncludeRevs | DocumentContentOptions.IncludeRevsInfo | DocumentContentOptions.IncludeConflicts | DocumentContentOptions.IncludeAttachments | DocumentContentOptions.IncludeLocalSeq) | DocumentContentOptions.IncludeExpiration) != 0) { var dst = rev.GetProperties(); if (options.HasFlag(DocumentContentOptions.IncludeLocalSeq)) { dst["_local_seq"] = rev.Sequence; } if (options.HasFlag(DocumentContentOptions.IncludeRevs)) { var revs = db.GetRevisionHistory(rev, null); dst["_revisions"] = TreeRevisionID.MakeRevisionHistoryDict(revs); } if (options.HasFlag(DocumentContentOptions.IncludeRevsInfo)) { dst["_revs_info"] = db.GetRevisionHistory(rev, null).Select(x => { string status = "available"; var ancestor = db.GetDocument(rev.DocID, x, true); if (ancestor.Deleted) { status = "deleted"; } else if (ancestor.Missing) { status = "missing"; } return(new Dictionary <string, object> { { "rev", x.ToString() }, { "status", status } }); }); } if (options.HasFlag(DocumentContentOptions.IncludeConflicts)) { RevisionList revs = db.Storage.GetAllDocumentRevisions(rev.DocID, true); if (revs.Count > 1) { dst["_conflicts"] = revs.Select(x => { return(x.Equals(rev) || x.Deleted ? null : x.RevID.ToString()); }); } } if (options.HasFlag(DocumentContentOptions.IncludeExpiration)) { var expirationTime = db.Storage?.GetDocumentExpiration(rev.DocID); if (expirationTime.HasValue) { dst["_exp"] = expirationTime; } } RevisionInternal nuRev = new RevisionInternal(dst); if (options.HasFlag(DocumentContentOptions.IncludeAttachments)) { bool attEncodingInfo = context != null && context.GetQueryParam <bool>("att_encoding_info", bool.TryParse, false); db.ExpandAttachments(nuRev, 0, false, !attEncodingInfo); } rev = nuRev; } return(rev); }