public ActionResult Edit(int id, AirlineModel model) { // Begin tracking changes _db.BeginChangeTracking(); // Query must execute after call to BeginChangeTracking() var query = from p in _db.Query <Airline>() where p.Id == id select p; var airline = query.FirstOrDefault(); if (airline == null) { return(HttpNotFound()); } if (!ModelState.IsValid) { return(View(model)); } // Make changes to document(s) and submit them airline.Name = model.Name; airline.Callsign = model.Callsign; _db.SubmitChanges(); // Collect mutation state for queries on the next page view TempData["AirlineMutationState"] = _db.MutationState; return(RedirectToAction("Index")); }
public void SubmitChanges_WithConsistencyCheck_Succeeds() { var bucket = ClusterHelper.GetBucket("beer-sample"); var clusterVersion = VersionProvider.Current.GetVersion(bucket); if (clusterVersion < FeatureVersions.ReadYourOwnWrite) { Assert.Ignore("Cluster does not support RYOW, test skipped."); } var db = new BucketContext(bucket); // Make doc to test db.Save(new BeerFiltered { Name = "TestBeer", BreweryId = "TestBrewery", Type = "beer", Abv = 1, Updated = DateTime.Now }); db.BeginChangeTracking(); var beer = db.Query <BeerFiltered>() .ConsistentWith(db.MutationState) .First(p => p.Name == "TestBeer"); beer.Abv = 5; db.SubmitChanges(); }
public async Task <ResponseModel <Todo> > CreateOrUpdateTodoAsync(Todo entity) { try { if (entity == null) { CheckEntity(entity); } ResponseModel <Todo> response = new ResponseModel <Todo>(); if (entity.Id == null) { entity.Id = Guid.NewGuid().ToString(); entity.CreateDateTime = DateTime.Now; entity.PinnedDateTime = (entity.IsPinned ? DateTime.Now : (DateTime?)null); await todosBucket.InsertAsync(entity.Id, entity); var todoDocument = await todosBucket.GetDocumentAsync <Todo>(entity.Id); response.Entity = todoDocument.Content; } else { var context = new BucketContext(todosBucket); var category = context.Query <Todo>().FirstOrDefault(u => u.Id == entity.Id); if (category == null) { response.Code = 0x0005; response.Error = true; response.Message = "Yapılacak bilgileri eşleşmedi, lütfen tekrar deneyiniz."; } else { var todoDocument = await todosBucket.GetDocumentAsync <Todo>(entity.Id); todoDocument.Content.Title = entity.Title; todoDocument.Content.Content = entity.Content; todoDocument.Content.IsPinned = entity.IsPinned; todoDocument.Content.PinnedDateTime = (entity.IsPinned ? DateTime.Now : (DateTime?)null); todoDocument.Content.Alert = entity.Alert; todoDocument.Content.IsItDone = entity.IsItDone; await todosBucket.UpsertAsync(todoDocument.Document); context.SubmitChanges(); response.Entity = todoDocument.Content; } } return(response); } catch (Exception e) { return(ThrowingCatch(entity, e)); } }
public async Task <ResponseModel <User> > CreateOrUpdateUserAsync(User entity) { ResponseModel <User> response = new ResponseModel <User>(); try { if (entity == null) { CheckEntity(entity); } if (entity.Id == null) { entity.Id = Guid.NewGuid().ToString(); entity.CreateDateTime = DateTime.Now; entity.Password = Hasher.Hash(entity.Password); await usersBucket.InsertAsync(entity.Id, entity); var userDocument = await usersBucket.GetDocumentAsync <User>(entity.Id); response.Entity = userDocument.Content; } else { var context = new BucketContext(usersBucket); var user = context.Query <User>().FirstOrDefault(u => u.Id == entity.Id); if (user == null) { response.Code = 0x0003; response.Error = true; response.Message = "Kullanıcı bilgileri eşleşmedi, lütfen tekrar deneyiniz."; } else { var userDocument = await usersBucket.GetDocumentAsync <User>(entity.Id); userDocument.Content.NameSurname = entity.NameSurname; userDocument.Content.Username = entity.Username; userDocument.Content.Password = Hasher.Hash(entity.Password); await usersBucket.UpsertAsync(userDocument.Document); context.SubmitChanges(); response.Entity = userDocument.Content; } } return(response); } catch (Exception e) { return(ThrowingCatch(entity, e)); } }
public void SubmitChanges_ModifiedDoc_NoConsistencyCheck_DoesntPassCas() { //arrange var fakeResult = new Mock <IOperationResult <object> >(); fakeResult.Setup(m => m.Status).Returns(ResponseStatus.Success); fakeResult.Setup(m => m.Success).Returns(true); var bucket = new Mock <IBucket>(); bucket.Setup(x => x.Configuration).Returns(new ClientConfiguration().BucketConfigs.First().Value); bucket .Setup(x => x.Upsert(It.IsAny <string>(), It.IsAny <object>())) .Returns(fakeResult.Object); bucket .Setup(x => x.Upsert(It.IsAny <string>(), It.IsAny <object>(), It.IsAny <ulong>())) .Returns(fakeResult.Object); var ctx = new BucketContext(bucket.Object); ctx.BeginChangeTracking(); var metadata = new DocumentMetadata() { Cas = 100, Id = "Test" }; var beer = new Mock <Beer>(); beer.SetupAllProperties(); var trackedDoc = beer.As <ITrackedDocumentNode>(); trackedDoc.Setup(m => m.Metadata).Returns(metadata); trackedDoc.Setup(m => m.IsDeleted).Returns(false); trackedDoc.Setup(m => m.IsDirty).Returns(true); ((IChangeTrackableContext)ctx).Track(beer.Object); ((IChangeTrackableContext)ctx).Modified(beer.Object); //act ctx.SubmitChanges(new SaveOptions() { PerformConsistencyCheck = false }); //assert bucket.Verify(x => x.Upsert(It.IsAny <string>(), It.IsAny <object>()), Times.Once); bucket.Verify(x => x.Upsert(It.IsAny <string>(), It.IsAny <object>(), It.IsAny <ulong>()), Times.Never); }
public async Task <ResponseModel <Category> > CreateOrUpdateCategoryAsync(Category entity) { try { if (entity == null) { CheckEntity(entity); } ResponseModel <Category> response = new ResponseModel <Category>(); if (entity.Id == null) { entity.Id = Guid.NewGuid().ToString(); entity.CreateDateTime = DateTime.Now; entity.PinnedDateTime = (entity.IsPinned ? DateTime.Now : (DateTime?)null); await categoriesBucket.InsertAsync(entity.Id, entity); var categoryDocument = await categoriesBucket.GetDocumentAsync <Category>(entity.Id); response.Entity = categoryDocument.Content; } else { var context = new BucketContext(categoriesBucket); var category = context.Query <Category>().FirstOrDefault(u => u.Id == entity.Id); if (category == null) { response.Code = 0x0004; response.Error = true; response.Message = "Kategori bilgileri eşleşmedi, lütfen tekrar deneyiniz."; } else { var categoryDocument = await categoriesBucket.GetDocumentAsync <Category>(entity.Id); categoryDocument.Content.Name = entity.Name; categoryDocument.Content.IsPinned = entity.IsPinned; categoryDocument.Content.PinnedDateTime = (entity.IsPinned ? DateTime.Now : (DateTime?)null); await categoriesBucket.UpsertAsync(categoryDocument.Document); context.SubmitChanges(); response.Entity = categoryDocument.Content; } } return(response); } catch (Exception e) { return(ThrowingCatch(entity, e)); } }
public void SubmitChanges_WithConsistencyCheck_FailsOnCasMismatch() { var bucket = ClusterHelper.GetBucket("beer-sample"); var clusterVersion = VersionProvider.Current.GetVersion(bucket); if (clusterVersion < FeatureVersions.ReadYourOwnWrite) { Assert.Ignore("Cluster does not support RYOW, test skipped."); } var db = new BucketContext(bucket); // Make doc to test db.Save(new BeerFiltered { Name = "TestBeer", BreweryId = "TestBrewery", Type = "beer", Abv = 1, Updated = DateTime.Now }); db.BeginChangeTracking(); var beer = db.Query <BeerFiltered>() .ConsistentWith(db.MutationState) .First(p => p.Name == "TestBeer" && p.BreweryId == "TestBrewery"); // Alter document in separate context var db2 = new BucketContext(bucket); db2.Save(new BeerFiltered { Name = "TestBeer", BreweryId = "TestBrewery", Type = "beer", Abv = 2, Updated = DateTime.Now }); // Alter document in tracked context beer.Abv = 5; Assert.Throws <CouchbaseConsistencyException>(() => db.SubmitChanges()); }
public void SubmitChanges_WhenDocsAreModified_DocumentIsMutated() { var db = new BucketContext(ClusterHelper.GetBucket("beer-sample")); var query = from x in db.Query <Beer>() where x.Type == "beer" select x; db.BeginChangeTracking(); var beer = query.First(); beer.Abv = beer.Abv + 1; db.SubmitChanges(); var doc = ClusterHelper.GetBucket("beer-sample").GetDocument <Beer>(((ITrackedDocumentNode)beer).Metadata.Id); Assert.AreEqual(beer.Abv, doc.Content.Abv); }
public void SubmitChanges_ThenQuery_ReturnsChanges() { var bucket = ClusterHelper.GetBucket("beer-sample"); var clusterVersion = VersionProvider.Current.GetVersion(bucket); if (clusterVersion < FeatureVersions.ReadYourOwnWrite) { Assert.Ignore("Cluster does not support RYOW, test skipped."); } var db = new BucketContext(bucket); var testValue = new Random().Next(0, 100000); var testKey = "SubmitChanges_ThenQuery_ReturnsChanges_" + testValue; var testDocument = new Sample { Id = testKey, Value = testValue }; db.BeginChangeTracking(); db.Save(testDocument); db.SubmitChanges(); try { Assert.NotNull(db.MutationState); var result = db.Query <Sample>() .ConsistentWith(db.MutationState) .FirstOrDefault(p => p.Id == testKey); Assert.NotNull(result); Assert.AreEqual(testValue, result.Value); } finally { db.Remove(testDocument); } }
public ActionResult Delete(string id) { try { // TODO: Add delete logic here var contact = _bucketContext.Query <Contact>().FirstOrDefault(x => N1QlFunctions.Meta(x).Id == id); if (contact == null) { return(NotFound()); } contact.id = id; _bucketContext.Remove(contact); _bucketContext.SubmitChanges(); return(RedirectToAction(nameof(Index))); } catch (Exception e) { ModelState.AddModelError("error", e.Message); return(View()); } }
public void SubmitChanges_NewDoc_NoConsistencyCheck_UsesUpsert() { //arrange var fakeResult = new Mock <IOperationResult <object> >(); fakeResult.Setup(m => m.Status).Returns(ResponseStatus.Success); fakeResult.Setup(m => m.Success).Returns(true); var bucket = new Mock <IBucket>(); bucket.Setup(x => x.Configuration).Returns(new ClientConfiguration().BucketConfigs.First().Value); bucket .Setup(x => x.Upsert(It.IsAny <string>(), It.IsAny <object>())) .Returns(fakeResult.Object); bucket .Setup(x => x.Insert(It.IsAny <string>(), It.IsAny <object>())) .Returns(fakeResult.Object); var ctx = new BucketContext(bucket.Object); ctx.BeginChangeTracking(); var beer = new Beer() { Name = "Test" }; ctx.Save(beer); //act ctx.SubmitChanges(new SaveOptions() { PerformConsistencyCheck = false }); //assert bucket.Verify(x => x.Upsert(It.IsAny <string>(), It.IsAny <object>()), Times.Once); bucket.Verify(x => x.Insert(It.IsAny <string>(), It.IsAny <object>()), Times.Never); }
public void SubmitChanges_WhenCalled_DoesNotClearTrackedList() { //arrange var bucket = new Mock <IBucket>(); bucket.Setup(x => x.Configuration).Returns(new ClientConfiguration().BucketConfigs.First().Value); var ctx = new BucketContext(bucket.Object); ctx.BeginChangeTracking(); var beer = new Beer { Name = "doc1" //key field }; ctx.Save(beer); //act ctx.SubmitChanges(); //assert Assert.AreEqual(1, ctx.TrackedCount); }
public void SubmitChanges_Removes_Document_From_Modified_List() { //arrange var bucket = new Mock <IBucket>(); bucket.Setup(x => x.Configuration).Returns(new ClientConfiguration().BucketConfigs.First().Value); var ctx = new BucketContext(bucket.Object); ctx.BeginChangeTracking(); var beer = new Beer { Name = "doc1" //key field }; ctx.Save(beer); //act ctx.SubmitChanges(); //assert Assert.AreEqual(0, ctx.ModifiedCount); }
public void SubmitChanges_WhenCalled_DoesNotClearTrackedList() { //arrange var bucket = new Mock<IBucket>(); bucket.Setup(x => x.Configuration).Returns(new ClientConfiguration().BucketConfigs.First().Value); var ctx = new BucketContext(bucket.Object); ctx.BeginChangeTracking(); var beer = new Beer { Name = "doc1" //key field }; ctx.Save(beer); //act ctx.SubmitChanges(); //assert Assert.AreEqual(1, ctx.TrackedCount); }
public void SubmitChanges_Removes_Document_From_Modified_List() { //arrange var bucket = new Mock<IBucket>(); bucket.Setup(x => x.Configuration).Returns(new ClientConfiguration().BucketConfigs.First().Value); var ctx = new BucketContext(bucket.Object); ctx.BeginChangeTracking(); var beer = new Beer { Name = "doc1" //key field }; ctx.Save(beer); //act ctx.SubmitChanges(); //assert Assert.AreEqual(0, ctx.ModifiedCount); }
public void SubmitChanges_ThenQuery_ReturnsChanges() { var bucket = ClusterHelper.GetBucket("beer-sample"); var clusterVersion = VersionProvider.Current.GetVersion(bucket); if (clusterVersion < FeatureVersions.ReadYourOwnWrite) { Assert.Ignore("Cluster does not support RYOW, test skipped."); } var db = new BucketContext(bucket); var testValue = new Random().Next(0, 100000); var testKey = "SubmitChanges_ThenQuery_ReturnsChanges_" + testValue; var testDocument = new Sample { Id = testKey, Value = testValue }; db.BeginChangeTracking(); db.Save(testDocument); db.SubmitChanges(); try { Assert.NotNull(db.MutationState); var result = db.Query<Sample>() .ConsistentWith(db.MutationState) .FirstOrDefault(p => p.Id == testKey); Assert.NotNull(result); Assert.AreEqual(testValue, result.Value); } finally { db.Remove(testDocument); } }
public void SubmitChanges_WhenDocsAreModified_DocumentIsMutated() { var db = new BucketContext(ClusterHelper.GetBucket("beer-sample")); var query = from x in db.Query<Beer>() where x.Type == "beer" select x; db.BeginChangeTracking(); var beer = query.First(); beer.Abv = beer.Abv+1; db.SubmitChanges(); var doc = ClusterHelper.GetBucket("beer-sample").GetDocument<Beer>(((ITrackedDocumentNode) beer).Metadata.Id); Assert.AreEqual(beer.Abv, doc.Content.Abv); }