public RevisionList GetAllDocumentRevisions(string docId, bool onlyCurrent) { var retVal = default(RevisionList); WithC4Document(docId, null, false, false, doc => { using (var enumerator = new CBForestHistoryEnumerator(doc, onlyCurrent, false)) { retVal = new RevisionList(enumerator.Select(x => new RevisionInternal(x.GetDocument(), false)).ToList()); } }); return(retVal); }
public IList <RevisionInternal> GetRevisionHistory(RevisionInternal rev, ICollection <string> ancestorRevIds) { var history = new List <RevisionInternal>(); WithC4Document(rev.GetDocId(), rev.GetRevId(), false, false, doc => { var enumerator = new CBForestHistoryEnumerator(doc, false); foreach (var next in enumerator) { if (ancestorRevIds != null && ancestorRevIds.Contains((string)next.SelectedRev.revID)) { break; } var newRev = new RevisionInternal(next.GetDocument(), false); newRev.SetMissing(!Native.c4doc_hasRevisionBody(next.GetDocument())); history.Add(newRev); } }); return(history); }
public IEnumerable<QueryRow> GetAllDocs(QueryOptions options) { var remainingIDs = default(List<string>); var enumerator = GetDocEnumerator(options, out remainingIDs); var current = 0; foreach(var next in enumerator) { if (current++ >= options.Limit) { yield break; } var sequenceNumber = 0L; var docID = next.CurrentDocID; remainingIDs.Remove(docID); var value = default(IDictionary<string, object>); if (next.Exists) { sequenceNumber = (long)next.SelectedRev.sequence; var conflicts = default(IList<string>); if (options.AllDocsMode >= AllDocsMode.ShowConflicts && next.IsConflicted) { SelectCurrentRevision(next); using (var innerEnumerator = new CBForestHistoryEnumerator(next, true, false)) { conflicts = innerEnumerator.Select(x => (string)x.SelectedRev.revID).ToList(); } if (conflicts.Count == 1) { conflicts = null; } } bool valid = conflicts != null || options.AllDocsMode != AllDocsMode.OnlyConflicts; if (!valid) { continue; } value = new NonNullDictionary<string, object> { { "rev", next.CurrentRevID }, { "deleted", next.IsDeleted ? (object)true : null }, { "_conflicts", conflicts } }; } var row = new QueryRow(value == null ? null : docID, sequenceNumber, docID, value, value == null ? null : new RevisionInternal(next, options.IncludeDocs), null); if (options.Filter == null || options.Filter(row)) { yield return row; } } foreach (var docId in remainingIDs) { var value = GetAllDocsEntry(docId); var row = new QueryRow(value != null ? docId as string : null, 0, docId, value, null, null); if (options.Filter == null || options.Filter(row)) { yield return row; } } }
public RevisionList ChangesSince(Int64 lastSequence, ChangesOptions options, RevisionFilter filter) { // http://wiki.apache.org/couchdb/HTTP_database_API#Changes // Translate options to ForestDB: if (options.Descending) { // https://github.com/couchbase/couchbase-lite-ios/issues/641 throw new CouchbaseLiteException(StatusCode.NotImplemented); } var forestOps = C4EnumeratorOptions.DEFAULT; forestOps.flags |= C4EnumeratorFlags.IncludeDeleted | C4EnumeratorFlags.IncludeNonConflicted; if (options.IncludeDocs || options.IncludeConflicts || filter != null) { forestOps.flags |= C4EnumeratorFlags.IncludeBodies; } var changes = new RevisionList(); var e = new CBForestDocEnumerator(Forest, lastSequence, forestOps); foreach (var next in e) { var doc = next.Document; var revs = default(IEnumerable<RevisionInternal>); if (options.IncludeConflicts) { using (var enumerator = new CBForestHistoryEnumerator(doc, true, false)) { var includeBody = forestOps.flags.HasFlag(C4EnumeratorFlags.IncludeBodies); revs = enumerator.Select(x => new RevisionInternal(x.Document, includeBody)).ToList(); } } else { revs = new List<RevisionInternal> { new RevisionInternal(doc, forestOps.flags.HasFlag(C4EnumeratorFlags.IncludeBodies)) }; } foreach (var rev in revs) { Debug.Assert(rev != null); if (filter == null || filter(rev)) { if (!options.IncludeDocs) { rev.SetBody(null); } if(filter == null || filter(rev)) { changes.Add(rev); } } } } if (options.SortBySequence) { changes.SortBySequence(!options.Descending); changes.Limit(options.Limit); } return changes; }
public IList<RevisionInternal> GetRevisionHistory(RevisionInternal rev, ICollection<string> ancestorRevIds) { var history = new List<RevisionInternal>(); WithC4Document(rev.GetDocId(), rev.GetRevId(), false, false, doc => { var enumerator = new CBForestHistoryEnumerator(doc, false); foreach(var next in enumerator) { if(ancestorRevIds != null && ancestorRevIds.Contains((string)next.Document->selectedRev.revID)) { break; } var newRev = new RevisionInternal(next.Document, false); newRev.SetMissing(!Native.c4doc_hasRevisionBody(next.Document)); history.Add(newRev); } }); return history; }
public RevisionList GetAllDocumentRevisions(string docId, bool onlyCurrent) { var retVal = default(RevisionList); WithC4Document(docId, null, false, false, doc => { using(var enumerator = new CBForestHistoryEnumerator(doc, onlyCurrent, false)) { retVal = new RevisionList(enumerator.Select(x => new RevisionInternal(x.Document, false)).ToList()); } }); return retVal; }
public IEnumerable <QueryRow> GetAllDocs(QueryOptions options) { var remainingIDs = default(List <string>); var enumerator = GetDocEnumerator(options, out remainingIDs); var current = 0; foreach (var next in enumerator) { if (current++ >= options.Limit) { yield break; } var sequenceNumber = 0L; var docID = next.CurrentDocID; remainingIDs.Remove(docID); var value = default(IDictionary <string, object>); if (next.Exists) { sequenceNumber = (long)next.SelectedRev.sequence; var conflicts = default(IList <string>); if (options.AllDocsMode >= AllDocsMode.ShowConflicts && next.IsConflicted) { SelectCurrentRevision(next); LoadRevisionBody(next); using (var innerEnumerator = new CBForestHistoryEnumerator(next, true, false)) { conflicts = innerEnumerator.Select(x => (string)x.SelectedRev.revID).ToList(); } if (conflicts.Count == 1) { conflicts = null; } } bool valid = conflicts != null || options.AllDocsMode != AllDocsMode.OnlyConflicts; if (!valid) { continue; } value = new NonNullDictionary <string, object> { { "rev", next.CurrentRevID }, { "deleted", next.IsDeleted ? (object)true : null }, { "_conflicts", conflicts } }; } var row = new QueryRow(value == null ? null : docID, sequenceNumber, docID, value, value == null ? null : new RevisionInternal(next, options.IncludeDocs), null); if (options.Filter == null || options.Filter(row)) { yield return(row); } } foreach (var docId in remainingIDs) { var value = GetAllDocsEntry(docId); var row = new QueryRow(value != null ? docId as string : null, 0, docId, value, null, null); if (options.Filter == null || options.Filter(row)) { yield return(row); } } }
public RevisionList ChangesSince(Int64 lastSequence, ChangesOptions options, RevisionFilter filter) { // http://wiki.apache.org/couchdb/HTTP_database_API#Changes // Translate options to ForestDB: if (options.Descending) { // https://github.com/couchbase/couchbase-lite-ios/issues/641 throw new CouchbaseLiteException(StatusCode.NotImplemented); } var forestOps = C4EnumeratorOptions.DEFAULT; forestOps.flags |= C4EnumeratorFlags.IncludeDeleted | C4EnumeratorFlags.IncludeNonConflicted; if (options.IncludeDocs || options.IncludeConflicts || filter != null) { forestOps.flags |= C4EnumeratorFlags.IncludeBodies; } var changes = new RevisionList(); var e = new CBForestDocEnumerator(Forest, lastSequence, forestOps); foreach (var next in e) { var revs = default(IEnumerable <RevisionInternal>); if (options.IncludeConflicts) { using (var enumerator = new CBForestHistoryEnumerator(next.GetDocument(), true, false)) { var includeBody = forestOps.flags.HasFlag(C4EnumeratorFlags.IncludeBodies); revs = enumerator.Select(x => new RevisionInternal(x.GetDocument(), includeBody)).ToList(); } } else { revs = new List <RevisionInternal> { new RevisionInternal(next.GetDocument(), forestOps.flags.HasFlag(C4EnumeratorFlags.IncludeBodies)) }; } foreach (var rev in revs) { Debug.Assert(rev != null); if (filter == null || filter(rev)) { if (!options.IncludeDocs) { rev.SetBody(null); } if (filter == null || filter(rev)) { changes.Add(rev); } } } } if (options.SortBySequence) { changes.SortBySequence(!options.Descending); changes.Limit(options.Limit); } return(changes); }
public IList<RevisionID> GetRevisionHistory(RevisionInternal rev, ICollection<RevisionID> ancestorRevIds) { var history = new List<RevisionID>(); WithC4Document(rev.DocID, rev.RevID, false, false, doc => { var enumerator = new CBForestHistoryEnumerator(doc, false); foreach(var next in enumerator) { var revId = next.SelectedRev.revID.AsRevID(); history.Add(revId); if(ancestorRevIds != null && ancestorRevIds.Contains(revId)) { break; } } }); return history; }
public RevisionList GetAllDocumentRevisions(string docId, bool onlyCurrent, bool includeDeleted) { var retVal = default(RevisionList); WithC4Document(docId, null, false, false, doc => { using(var enumerator = new CBForestHistoryEnumerator(doc, onlyCurrent, false)) { var expression = includeDeleted ? enumerator.Select (x => new ForestRevisionInternal (x.GetDocument (), false)) : enumerator.Where (x => !x.SelectedRev.IsDeleted).Select (x => new ForestRevisionInternal (x.GetDocument (), false)); retVal = new RevisionList(expression.Cast<RevisionInternal>().ToList()); } }); return retVal; }