本文整理汇总了C#中Couchbase.Lite.Internal.RevisionInternal.GetDocId方法的典型用法代码示例。如果您正苦于以下问题:C# RevisionInternal.GetDocId方法的具体用法?C# RevisionInternal.GetDocId怎么用?C# RevisionInternal.GetDocId使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Couchbase.Lite.Internal.RevisionInternal
的用法示例。
在下文中一共展示了RevisionInternal.GetDocId方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: TestForceInsertEmptyHistory
public void TestForceInsertEmptyHistory()
{
var rev = new RevisionInternal("FakeDocId", "1-abcd", false);
var revProperties = new Dictionary<string, object>();
revProperties.Put("_id", rev.GetDocId());
revProperties.Put("_rev", rev.GetRevId());
revProperties["message"] = "hi";
rev.SetProperties(revProperties);
IList<string> revHistory = null;
database.ForceInsert(rev, revHistory, null);
}
示例2: TestForceInsertEmptyHistory
/// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception>
public virtual void TestForceInsertEmptyHistory()
{
IList<string> revHistory = null;
RevisionInternal rev = new RevisionInternal("FakeDocId", "1-tango", false, database
);
IDictionary<string, object> revProperties = new Dictionary<string, object>();
revProperties.Put("_id", rev.GetDocId());
revProperties.Put("_rev", rev.GetRevId());
revProperties.Put("message", "hi");
rev.SetProperties(revProperties);
database.ForceInsert(rev, revHistory, null);
}
示例3: Winner
internal RevisionInternal Winner(Int64 docNumericID, String oldWinningRevID, Boolean oldWinnerWasDeletion, RevisionInternal newRev)
{
if (oldWinningRevID == null)
{
return newRev;
}
var newRevID = newRev.GetRevId();
if (!newRev.IsDeleted())
{
if (oldWinnerWasDeletion || RevisionInternal.CBLCompareRevIDs(newRevID, oldWinningRevID) > 0)
{
return newRev;
}
}
else
{
// this is now the winning live revision
if (oldWinnerWasDeletion)
{
if (RevisionInternal.CBLCompareRevIDs(newRevID, oldWinningRevID) > 0)
{
return newRev;
}
}
else
{
// doc still deleted, but this beats previous deletion rev
// Doc was alive. How does this deletion affect the winning rev ID?
var outIsDeleted = new AList<bool>();
var outIsConflict = new AList<bool>();
var winningRevID = WinningRevIDOfDoc(docNumericID, outIsDeleted, outIsConflict);
if (!winningRevID.Equals(oldWinningRevID))
{
if (winningRevID.Equals(newRev.GetRevId()))
{
return newRev;
}
else
{
var deleted = false;
var winningRev = new RevisionInternal(newRev.GetDocId(), winningRevID, deleted, this);
return winningRev;
}
}
}
}
return null;
}
示例4: GetRevisionSequence
public long GetRevisionSequence(RevisionInternal rev)
{
var retVal = 0L;
WithC4Document(rev.GetDocId(), rev.GetRevId(), false, false, doc => retVal = (long)doc->selectedRev.sequence);
return retVal;
}
示例5: PutRevision
/// <summary>Stores a new (or initial) revision of a document.</summary>
/// <remarks>
/// Stores a new (or initial) revision of a document.
/// This is what's invoked by a PUT or POST. As with those, the previous revision ID must be supplied when necessary and the call will fail if it doesn't match.
/// </remarks>
/// <param name="oldRev">The revision to add. If the docID is null, a new UUID will be assigned. Its revID must be null. It must have a JSON body.
/// </param>
/// <param name="prevRevId">The ID of the revision to replace (same as the "?rev=" parameter to a PUT), or null if this is a new document.
/// </param>
/// <param name="allowConflict">If false, an error status 409 will be returned if the insertion would create a conflict, i.e. if the previous revision already has a child.
/// </param>
/// <param name="resultStatus">On return, an HTTP status code indicating success or failure.
/// </param>
/// <returns>A new RevisionInternal with the docID, revID and sequence filled in (but no body).
/// </returns>
/// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception>
internal RevisionInternal PutRevision(RevisionInternal oldRev, String prevRevId, Boolean allowConflict, Status resultStatus)
{
// prevRevId is the rev ID being replaced, or nil if an insert
var docId = oldRev.GetDocId();
var deleted = oldRev.IsDeleted();
if ((oldRev == null) || ((prevRevId != null) && (docId == null)) || (deleted && (docId == null)) || ((docId != null) && !IsValidDocumentId(docId)))
{
throw new CouchbaseLiteException(StatusCode.BadRequest);
}
BeginTransaction();
Cursor cursor = null;
var inConflict = false;
RevisionInternal winningRev = null;
RevisionInternal newRev = null;
// PART I: In which are performed lookups and validations prior to the insert...
var docNumericID = (docId != null) ? GetDocNumericID(docId) : 0;
var parentSequence = 0L;
string oldWinningRevID = null;
try
{
var oldWinnerWasDeletion = false;
var wasConflicted = false;
if (docNumericID > 0)
{
var outIsDeleted = new AList<bool>();
var outIsConflict = new AList<bool>();
try
{
oldWinningRevID = WinningRevIDOfDoc(docNumericID, outIsDeleted, outIsConflict);
oldWinnerWasDeletion |= outIsDeleted.Count > 0;
wasConflicted |= outIsConflict.Count > 0;
}
catch (Exception e)
{
Sharpen.Runtime.PrintStackTrace(e);
}
}
if (prevRevId != null)
{
// Replacing: make sure given prevRevID is current & find its sequence number:
if (docNumericID <= 0)
{
var msg = string.Format("No existing revision found with doc id: {0}", docId);
throw new CouchbaseLiteException(msg, StatusCode.NotFound);
}
parentSequence = GetSequenceOfDocument(docNumericID, prevRevId, !allowConflict);
if (parentSequence == 0)
{
// Not found: either a 404 or a 409, depending on whether there is any current revision
if (!allowConflict && ExistsDocumentWithIDAndRev(docId, null))
{
var msg = string.Format("Conflicts not allowed and there is already an existing doc with id: {0}", docId);
throw new CouchbaseLiteException(msg, StatusCode.Conflict);
}
else
{
var msg = string.Format("No existing revision found with doc id: {0}", docId);
throw new CouchbaseLiteException(msg, StatusCode.NotFound);
}
}
if (_validations != null && _validations.Count > 0)
{
// Fetch the previous revision and validate the new one against it:
var oldRevCopy = oldRev.CopyWithDocID(oldRev.GetDocId(), null);
var prevRev = new RevisionInternal(docId, prevRevId, false, this);
ValidateRevision(oldRevCopy, prevRev, prevRevId);
}
}
else
{
// Inserting first revision.
if (deleted && (docId != null))
{
// Didn't specify a revision to delete: 404 or a 409, depending
if (ExistsDocumentWithIDAndRev(docId, null))
{
throw new CouchbaseLiteException(StatusCode.Conflict);
}
else
{
throw new CouchbaseLiteException(StatusCode.NotFound);
//.........这里部分代码省略.........
示例6: LoadRevisionBody
//Doesn't handle CouchbaseLiteException
internal RevisionInternal LoadRevisionBody(RevisionInternal rev)
{
if (rev.GetSequence() > 0) {
var props = rev.GetProperties();
if (props != null && props.GetCast<string>("_rev") != null && props.GetCast<string>("_id") != null) {
return rev;
}
}
Debug.Assert(rev.GetDocId() != null && rev.GetRevId() != null);
Storage.LoadRevisionBody(rev);
return rev;
}
示例7: TransformRevision
internal RevisionInternal TransformRevision(RevisionInternal rev)
{
if (RevisionBodyTransformationFunction != null) {
try {
var generation = rev.GetGeneration();
var xformed = RevisionBodyTransformationFunction(rev);
if (xformed == null) {
return null;
}
if (xformed != rev) {
Debug.Assert((xformed.GetDocId().Equals(rev.GetDocId())));
Debug.Assert((xformed.GetRevId().Equals(rev.GetRevId())));
Debug.Assert((xformed.GetProperties().Get("_revisions").Equals(rev.GetProperties().Get("_revisions"))));
if (xformed.GetProperties().ContainsKey("_attachments")) {
// Insert 'revpos' properties into any attachments added by the callback:
var mx = new RevisionInternal(xformed.GetProperties());
xformed = mx;
mx.MutateAttachments((name, info) =>
{
if (info.Get("revpos") != null) {
return info;
}
if (info.Get("data") == null) {
throw new InvalidOperationException("Transformer added attachment without adding data");
}
var newInfo = new Dictionary<string, object>(info);
newInfo["revpos"] = generation;
return newInfo;
});
}
}
} catch (Exception e) {
Log.W(TAG, String.Format("Exception transforming a revision of doc '{0}'", rev.GetDocId()), e);
}
}
return rev;
}
示例8: FindCommonAncestor
public string FindCommonAncestor(RevisionInternal rev, IEnumerable<string> revIds)
{
var generation = RevisionInternal.GenerationFromRevID(rev.GetRevId());
var revIdArray = revIds == null ? null : revIds.ToList();
if (generation <= 1 || revIdArray == null || revIdArray.Count == 0) {
return null;
}
revIdArray.Sort(RevisionInternal.CBLCompareRevIDs);
var commonAncestor = default(string);
WithC4Document(rev.GetDocId(), null, false, false, doc =>
{
foreach(var possibleRevId in revIds) {
if(RevisionInternal.GenerationFromRevID(possibleRevId) <= generation &&
Native.c4doc_selectRevision(doc, possibleRevId, false, null)) {
commonAncestor = possibleRevId;
return;
}
}
});
return commonAncestor;
}
示例9: ProcessAttachmentsForRevision
internal bool ProcessAttachmentsForRevision(RevisionInternal rev, string prevRevId, Status status)
{
if (status == null) {
status = new Status();
}
status.Code = StatusCode.Ok;
var revAttachments = rev.GetAttachments();
if (revAttachments == null) {
return true; // no-op: no attachments
}
// Deletions can't have attachments:
if (rev.IsDeleted() || revAttachments.Count == 0) {
var body = rev.GetProperties();
body.Remove("_attachments");
rev.SetProperties(body);
return true;
}
int generation = RevisionInternal.GenerationFromRevID(prevRevId) + 1;
IDictionary<string, object> parentAttachments = null;
return rev.MutateAttachments((name, attachInfo) =>
{
AttachmentInternal attachment = null;
try {
attachment = new AttachmentInternal(name, attachInfo);
} catch(CouchbaseLiteException e) {
return null;
}
if(attachment.EncodedContent != null) {
// If there's inline attachment data, decode and store it:
BlobKey blobKey = new BlobKey();
if(!Attachments.StoreBlob(attachment.EncodedContent.ToArray(), blobKey)) {
status.Code = StatusCode.AttachmentError;
return null;
}
attachment.BlobKey = blobKey;
} else if(attachInfo.GetCast<bool>("follows")) {
// "follows" means the uploader provided the attachment in a separate MIME part.
// This means it's already been registered in _pendingAttachmentsByDigest;
// I just need to look it up by its "digest" property and install it into the store:
InstallAttachment(attachment, attachInfo);
} else if(attachInfo.GetCast<bool>("stub")) {
// "stub" on an incoming revision means the attachment is the same as in the parent.
if(parentAttachments == null && prevRevId != null) {
parentAttachments = GetAttachmentsFromDoc(rev.GetDocId(), prevRevId, status);
if(parentAttachments == null) {
if(status.Code == StatusCode.Ok || status.Code == StatusCode.NotFound) {
status.Code = StatusCode.BadAttachment;
}
return null;
}
}
var parentAttachment = parentAttachments == null ? null : parentAttachments.Get(name).AsDictionary<string, object>();
if(parentAttachment == null) {
status.Code = StatusCode.BadAttachment;
return null;
}
return parentAttachment;
}
// Set or validate the revpos:
if(attachment.RevPos == 0) {
attachment.RevPos = generation;
} else if(attachment.RevPos >= generation) {
status.Code = StatusCode.BadAttachment;
return null;
}
Debug.Assert(attachment.IsValid);
return attachment.AsStubDictionary();
});
}
示例10: VerifyHistory
private void VerifyHistory(Database db, RevisionInternal rev, IList<string> history)
{
var gotRev = db.GetDocument(rev.GetDocId(), null,
true);
Assert.AreEqual(rev, gotRev);
AssertPropertiesAreEqual(rev.GetProperties(), gotRev.GetProperties());
var revHistory = db.Storage.GetRevisionHistory(gotRev, null);
Assert.AreEqual(history.Count, revHistory.Count);
for (int i = 0; i < history.Count; i++)
{
RevisionInternal hrev = revHistory[i];
Assert.AreEqual(rev.GetDocId(), hrev.GetDocId());
Assert.AreEqual(history[i], hrev.GetRevId());
Assert.IsFalse(rev.IsDeleted());
}
}
示例11: PutLocalRevision
internal RevisionInternal PutLocalRevision(RevisionInternal revision, string prevRevID)
{
var docID = revision.GetDocId();
if (!docID.StartsWith ("_local/", StringComparison.InvariantCultureIgnoreCase))
{
throw new CouchbaseLiteException(StatusCode.BadRequest);
}
if (!revision.IsDeleted())
{
// PUT:
string newRevID;
var json = EncodeDocumentJSON(revision);
if (prevRevID != null)
{
var generation = RevisionInternal.GenerationFromRevID(prevRevID);
if (generation == 0)
{
throw new CouchbaseLiteException(StatusCode.BadRequest);
}
newRevID = Sharpen.Extensions.ToString(++generation) + "-local";
var values = new ContentValues();
values["revid"] = newRevID;
values["json"] = json;
var whereArgs = new [] { docID, prevRevID };
try
{
var rowsUpdated = StorageEngine.Update("localdocs", values, "docid=? AND revid=?", whereArgs);
if (rowsUpdated == 0)
{
throw new CouchbaseLiteException(StatusCode.Conflict);
}
}
catch (SQLException e)
{
throw new CouchbaseLiteException(e, StatusCode.InternalServerError);
}
}
else
{
newRevID = "1-local";
var values = new ContentValues();
values["docid"] = docID;
values["revid"] = newRevID;
values["json"] = json;
try
{
StorageEngine.InsertWithOnConflict("localdocs", null, values, ConflictResolutionStrategy.Ignore);
}
catch (SQLException e)
{
throw new CouchbaseLiteException(e, StatusCode.InternalServerError);
}
}
return revision.CopyWithDocID(docID, newRevID);
}
else
{
// DELETE:
DeleteLocalDocument(docID, prevRevID);
return revision;
}
}
示例12: TestLocalDocs
public void TestLocalDocs()
{
//create a document
var documentProperties = new Dictionary<string, object>();
documentProperties["_id"] = "_local/doc1";
documentProperties["foo"] = 1;
documentProperties["bar"] = false;
var body = new Body(documentProperties);
var rev1 = new RevisionInternal(body);
rev1 = database.Storage.PutLocalRevision(rev1, null, true);
Log.V(Tag, "Created " + rev1);
Assert.AreEqual("_local/doc1", rev1.GetDocId());
Assert.IsTrue(rev1.GetRevId().StartsWith("1-"));
//read it back
var readRev = database.Storage.GetLocalDocument(rev1.GetDocId(), null);
Assert.IsNotNull(readRev);
var readRevProps = readRev.GetProperties();
Assert.AreEqual(rev1.GetDocId(), readRevProps.Get("_id"));
Assert.AreEqual(rev1.GetRevId(), readRevProps.Get("_rev"));
AssertPropertiesAreEqual(UserProperties(readRevProps),
UserProperties(body.GetProperties()));
//now update it
documentProperties = (Dictionary<string, object>)readRev.GetProperties();
documentProperties["status"] = "updated!";
body = new Body(documentProperties);
var rev2 = new RevisionInternal(body);
var rev2input = rev2;
rev2 = database.Storage.PutLocalRevision(rev2, rev1.GetRevId(), true);
Log.V(Tag, "Updated " + rev1);
Assert.AreEqual(rev1.GetDocId(), rev2.GetDocId());
Assert.IsTrue(rev2.GetRevId().StartsWith("2-"));
//read it back
readRev = database.Storage.GetLocalDocument(rev2.GetDocId(), null);
Assert.IsNotNull(readRev);
AssertPropertiesAreEqual(UserProperties(readRev.GetProperties()),
UserProperties(body.GetProperties()));
// Try to update the first rev, which should fail:
var gotException = false;
try
{
database.Storage.PutLocalRevision(rev2input, rev1.GetRevId(), true);
}
catch (CouchbaseLiteException e)
{
Assert.AreEqual(StatusCode.Conflict, e.CBLStatus.Code);
gotException = true;
}
Assert.IsTrue(gotException);
// Delete it:
var revD = new RevisionInternal(rev2.GetDocId(), null, true);
gotException = false;
try
{
var revResult = database.Storage.PutLocalRevision(revD, null, true);
Assert.IsNull(revResult);
}
catch (CouchbaseLiteException e)
{
Assert.AreEqual(StatusCode.Conflict, e.CBLStatus.Code);
gotException = true;
}
Assert.IsTrue(gotException);
revD = database.Storage.PutLocalRevision(revD, rev2.GetRevId(), true);
// Delete nonexistent doc:
gotException = false;
var revFake = new RevisionInternal("_local/fake", null, true);
try
{
database.Storage.PutLocalRevision(revFake, null, true);
}
catch (CouchbaseLiteException e)
{
Assert.AreEqual(StatusCode.NotFound, e.CBLStatus.Code);
gotException = true;
}
Assert.IsTrue(gotException);
// Read it back (should fail):
readRev = database.Storage.GetLocalDocument(revD.GetDocId(), null);
Assert.IsNull(readRev);
}
开发者ID:transformersprimeabcxyz,项目名称:_TO-DO-couchbase-lite-net-couchbase,代码行数:87,代码来源:LocalDocsTest.cs
示例13: TestRevTreeChangeNotification
public void TestRevTreeChangeNotification()
{
const string DOCUMENT_ID = "MyDocId";
var rev = new RevisionInternal(DOCUMENT_ID, "1-abcd", false);
var revProperties = new Dictionary<string, object>();
revProperties["_id"] = rev.GetDocId();
revProperties["_rev"] = rev.GetRevId();
revProperties["message"] = "hi";
rev.SetProperties(revProperties);
var revHistory = new List<string>();
revHistory.Add(rev.GetRevId());
EventHandler<DatabaseChangeEventArgs> handler = (sender, e) =>
{
var changes = e.Changes.ToList();
Assert.AreEqual(1, changes.Count);
var change = changes[0];
Assert.AreEqual(DOCUMENT_ID, change.DocumentId);
Assert.AreEqual(rev.GetRevId(), change.RevisionId);
Assert.IsTrue(change.IsCurrentRevision);
Assert.IsFalse(change.IsConflict);
var current = database.GetDocument(change.DocumentId).CurrentRevision;
Assert.AreEqual(rev.GetRevId(), current.Id);
};
database.Changed += handler;
database.ForceInsert(rev, revHistory, null);
database.Changed -= handler;
// add two more revisions to the document
var rev3 = new RevisionInternal(DOCUMENT_ID, "3-abcd", false);
var rev3Properties = new Dictionary<string, object>();
rev3Properties["_id"] = rev3.GetDocId();
rev3Properties["_rev"] = rev3.GetRevId();
rev3Properties["message"] = "hi again";
rev3.SetProperties(rev3Properties);
var rev3History = new List<string>();
rev3History.Add(rev3.GetRevId());
rev3History.Add("2-abcd");
rev3History.Add(rev.GetRevId());
handler = (sender, e) =>
{
var changes = e.Changes.ToList();
Assert.AreEqual(1, changes.Count);
var change = changes[0];
Assert.AreEqual(DOCUMENT_ID, change.DocumentId);
Assert.AreEqual(rev3.GetRevId(), change.RevisionId);
Assert.IsTrue(change.IsCurrentRevision);
Assert.IsFalse(change.IsConflict);
var doc = database.GetDocument(change.DocumentId);
Assert.AreEqual(rev3.GetRevId(), doc.CurrentRevisionId);
try
{
Assert.AreEqual(3, doc.RevisionHistory.ToList().Count);
}
catch (CouchbaseLiteException)
{
Assert.Fail();
}
};
database.Changed += handler;
database.ForceInsert(rev3, rev3History, null);
database.Changed -= handler;
// add a conflicting revision, with the same history length as the last revision we
// inserted. Since this new revision's revID has a higher ASCII sort, it should become the
// new winning revision.
var conflictRev = new RevisionInternal(DOCUMENT_ID, "3-bcde", false);
var conflictProperties = new Dictionary<string, object>();
conflictProperties["_id"] = conflictRev.GetDocId();
conflictProperties["_rev"] = conflictRev.GetRevId();
conflictProperties["message"] = "winner";
conflictRev.SetProperties(conflictProperties);
var conflictRevHistory = new List<string>();
conflictRevHistory.Add(conflictRev.GetRevId());
conflictRevHistory.Add("2-abcd");
conflictRevHistory.Add(rev.GetRevId());
handler = (sender, e) =>
{
var changes = e.Changes.ToList();
Assert.AreEqual(1, changes.Count);
var change = changes[0];
Assert.AreEqual(DOCUMENT_ID, change.DocumentId);
Assert.AreEqual(conflictRev.GetRevId(), change.RevisionId);
Assert.IsTrue(change.IsCurrentRevision);
Assert.IsFalse(change.IsConflict);
var doc = database.GetDocument(change.DocumentId);
Assert.AreEqual(rev3.GetRevId(), doc.CurrentRevisionId);
try
{
//.........这里部分代码省略.........
示例14: TestLocalDocs
/// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception>
public virtual void TestLocalDocs()
{
//create a document
IDictionary<string, object> documentProperties = new Dictionary<string, object>();
documentProperties.Put("_id", "_local/doc1");
documentProperties.Put("foo", 1);
documentProperties.Put("bar", false);
Body body = new Body(documentProperties);
RevisionInternal rev1 = new RevisionInternal(body, database);
Status status = new Status();
rev1 = database.PutLocalRevision(rev1, null);
Log.V(Tag, "Created " + rev1);
NUnit.Framework.Assert.AreEqual("_local/doc1", rev1.GetDocId());
NUnit.Framework.Assert.IsTrue(rev1.GetRevId().StartsWith("1-"));
//read it back
RevisionInternal readRev = database.GetLocalDocument(rev1.GetDocId(), null);
NUnit.Framework.Assert.IsNotNull(readRev);
IDictionary<string, object> readRevProps = readRev.GetProperties();
NUnit.Framework.Assert.AreEqual(rev1.GetDocId(), readRev.GetProperties().Get("_id"
));
NUnit.Framework.Assert.AreEqual(rev1.GetRevId(), readRev.GetProperties().Get("_rev"
));
NUnit.Framework.Assert.AreEqual(UserProperties(readRevProps), UserProperties(body
.GetProperties()));
//now update it
documentProperties = readRev.GetProperties();
documentProperties.Put("status", "updated!");
body = new Body(documentProperties);
RevisionInternal rev2 = new RevisionInternal(body, database);
RevisionInternal rev2input = rev2;
rev2 = database.PutLocalRevision(rev2, rev1.GetRevId());
Log.V(Tag, "Updated " + rev1);
NUnit.Framework.Assert.AreEqual(rev1.GetDocId(), rev2.GetDocId());
NUnit.Framework.Assert.IsTrue(rev2.GetRevId().StartsWith("2-"));
//read it back
readRev = database.GetLocalDocument(rev2.GetDocId(), null);
NUnit.Framework.Assert.IsNotNull(readRev);
NUnit.Framework.Assert.AreEqual(UserProperties(readRev.GetProperties()), UserProperties
(body.GetProperties()));
// Try to update the first rev, which should fail:
bool gotException = false;
try
{
database.PutLocalRevision(rev2input, rev1.GetRevId());
}
catch (CouchbaseLiteException e)
{
NUnit.Framework.Assert.AreEqual(Status.Conflict, e.GetCBLStatus().GetCode());
gotException = true;
}
NUnit.Framework.Assert.IsTrue(gotException);
// Delete it:
RevisionInternal revD = new RevisionInternal(rev2.GetDocId(), null, true, database
);
gotException = false;
try
{
RevisionInternal revResult = database.PutLocalRevision(revD, null);
NUnit.Framework.Assert.IsNull(revResult);
}
catch (CouchbaseLiteException e)
{
NUnit.Framework.Assert.AreEqual(Status.Conflict, e.GetCBLStatus().GetCode());
gotException = true;
}
NUnit.Framework.Assert.IsTrue(gotException);
revD = database.PutLocalRevision(revD, rev2.GetRevId());
// Delete nonexistent doc:
gotException = false;
RevisionInternal revFake = new RevisionInternal("_local/fake", null, true, database
);
try
{
database.PutLocalRevision(revFake, null);
}
catch (CouchbaseLiteException e)
{
NUnit.Framework.Assert.AreEqual(Status.NotFound, e.GetCBLStatus().GetCode());
gotException = true;
}
NUnit.Framework.Assert.IsTrue(gotException);
// Read it back (should fail):
readRev = database.GetLocalDocument(revD.GetDocId(), null);
NUnit.Framework.Assert.IsNull(readRev);
}
开发者ID:transformersprimeabcxyz,项目名称:_TO-DO-couchbase-lite-net-couchbase,代码行数:86,代码来源:LocalDocsTest.cs
示例15: PutLocalRevision
public RevisionInternal PutLocalRevision(RevisionInternal revision, string prevRevId, bool obeyMVCC)
{
var docId = revision.GetDocId();
if (!docId.StartsWith("_local/")) {
throw new CouchbaseLiteException("Local revision IDs must start with _local/", StatusCode.BadId);
}
if (revision.IsDeleted()) {
DeleteLocalRevision(docId, prevRevId, obeyMVCC);
return revision;
}
var result = default(RevisionInternal);
RunInTransaction(() =>
{
var json = Manager.GetObjectMapper().WriteValueAsString(revision.GetProperties(), true);
WithC4Raw(docId, "_local", doc =>
{
var generation = RevisionInternal.GenerationFromRevID(prevRevId);
if(obeyMVCC) {
if(prevRevId != null) {
if(prevRevId != (doc != null ? (string)doc->meta : null)) {
throw new CouchbaseLiteException(StatusCode.Conflict);
}
if(generation == 0) {
throw new CouchbaseLiteException(StatusCode.BadId);
}
} else if(doc != null) {
throw new CouchbaseLiteException(StatusCode.Conflict);
}
}
var newRevId = String.Format("{0}-local", ++generation);
ForestDBBridge.Check(err => Native.c4raw_put(Forest, "_local", docId, newRevId, json, err));
result = revision.CopyWithDocID(docId, newRevId);
});
return true;
});
return result;
}