예제 #1
0
        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"));
        }
예제 #2
0
        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();
        }
예제 #3
0
        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));
            }
        }
예제 #4
0
        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));
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
        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));
            }
        }
예제 #7
0
        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());
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
            }
        }
예제 #10
0
 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());
     }
 }
예제 #11
0
        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);
        }
예제 #12
0
        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);
        }
예제 #13
0
        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);
        }