Example #1
0
        public async Task New_transformer_will_overwrite_index_tombstones()
        {
            using (var store = GetDocumentStore())
            {
                const string name            = "FooBar";
                var          userByNameIndex = new UserByNameIndex(name);
                userByNameIndex.Execute(store);

                store.DatabaseCommands.DeleteIndex(name);

                var usernameToUpperTransformer = new UsernameToUpperTransformer(name);
                usernameToUpperTransformer.Execute(store);

                var databaseStore =
                    await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase);

                TransactionOperationContext context;
                using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context))
                    using (var tx = context.OpenReadTransaction())

                    {
                        var metadata = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, name);
                        Assert.Equal(1, metadata.ChangeVector.Length); //sanity check

                        /*
                         * transformers and etags share the same tombstone,
                         * so if transformer created, then deleted, then index created under the same name as transformer, the change vector
                         * which represents history of the object will be preserved
                         */
                        Assert.Equal(3, metadata.ChangeVector[0].Etag);
                    }
            }
        }
Example #2
0
        public void Can_replicate_multiple_transformers()
        {
            using (var source = GetDocumentStore())
                using (var destination = GetDocumentStore())
                {
                    var usernameToUpperTransformer = new UsernameToUpperTransformer();
                    usernameToUpperTransformer.Execute(source);

                    var usernameToLowerTransformer = new UsernameToLowerTransformer();
                    usernameToLowerTransformer.Execute(source);

                    SetupReplication(source, destination);

                    var sw = Stopwatch.StartNew();
                    var transformerNames = new string[0];
                    var timeout          = Debugger.IsAttached ? 60 * 1000000 : 3000;
                    while (sw.ElapsedMilliseconds < timeout && transformerNames.Length != 2)
                    {
                        transformerNames = destination.DatabaseCommands.GetTransformers(0, 1024).Select(x => x.Name).ToArray();
                    }

                    Assert.NotNull(transformerNames); //precaution
                    Assert.Equal(2, transformerNames.Length);
                    Assert.True(transformerNames.Contains(usernameToUpperTransformer.TransformerName));
                    Assert.True(transformerNames.Contains(usernameToLowerTransformer.TransformerName));
                }
        }
Example #3
0
        public void Index_and_transformer_metadata_storage_should_enforce_name_uniqueness_for_writing_transformer_then_index()
        {
            using (var store = GetDocumentStore())
            {
                var usernameToUpperTransformer = new UsernameToUpperTransformer("FooBar");
                usernameToUpperTransformer.Execute(store);

                var userByNameIndex = new UserByNameIndex("FooBar");
                Assert.Throws <ErrorResponseException>(() => userByNameIndex.Execute(store));
            }
        }
Example #4
0
        public async Task Manually_removed_indexes_would_remove_metadata_on_startup()
        {
            var pathPrefix   = Guid.NewGuid().ToString();
            var databasePath = String.Empty;
            var indexesPath  = String.Empty;

            try
            {
                var userByAgeIndex             = new UserByAgeIndex();
                var userByNameIndex            = new UserByNameIndex();
                var usernameToUpperTransformer = new UsernameToUpperTransformer();


                DocumentDatabase databaseStore;
                using (var store = GetDocumentStore(path: pathPrefix))
                {
                    userByNameIndex.Execute(store);
                    userByAgeIndex.Execute(store);
                    usernameToUpperTransformer.Execute(store);
                    databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase);

                    TransactionOperationContext context;
                    using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context))
                        using (var tx = context.OpenReadTransaction())
                        {
                            Assert.NotNull(
                                databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByNameIndex.IndexName));
                            Assert.NotNull(
                                databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAgeIndex.IndexName));
                            Assert.NotNull(
                                databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, usernameToUpperTransformer.TransformerName));
                        }
                }

                indexesPath  = databaseStore.Configuration.Indexing.IndexStoragePath;
                databasePath = databaseStore.Configuration.Core.DataDirectory;
                foreach (var indexFolder in Directory.GetDirectories(indexesPath))
                {
                    IOExtensions.DeleteDirectory(indexFolder);
                }

                using (var store = GetDocumentStore(path: pathPrefix))
                {
                    databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase);

                    TransactionOperationContext context;
                    using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context))
                        using (var tx = context.OpenReadTransaction())
                        {
                            Assert.Null(
                                databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByNameIndex.IndexName));
                            Assert.Null(
                                databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAgeIndex.IndexName));
                            Assert.Null(
                                databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, usernameToUpperTransformer.TransformerName));
                        }
                }
            }
            finally
            {
                IOExtensions.DeleteDirectory(databasePath);
                IOExtensions.DeleteDirectory(indexesPath);
            }
        }