예제 #1
0
        public void parses_the_field()
        {
            var settings = new SchemaMetadataSettings
            {
                Path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Clarify", "Metadata", SchemaMetadataSettings.FileName)
            };

            var visitors = new List <IXElementVisitor> {
                new ParseTables(), new ParseFields()
            };
            var service  = new XElementService(visitors);
            var services = new InMemoryServiceLocator();

            services.Add <IXElementService>(service);
            services.Add <IXElementSerializer>(new XElementSerializer());

            var cache = new SchemaMetadataCache(settings, new NulloLogger(), service, services);

            // Other tables shouldn't exist but will never be null
            cache.MetadataFor("test").ShouldNotBeNull();

            var table = cache.MetadataFor("case");

            // Other fields shouldn't exist but will also never be null
            table.MetadataFor("test").ShouldNotBeNull();
            var field = table.MetadataFor("creation_time");

            field.IsDateOnlyField().ShouldBeTrue();
        }
예제 #2
0
 public SchemaMetadataCache(SchemaMetadataSettings settings, ILogger logger, IXElementService elements, IServiceLocator services)
 {
     _settings = settings;
     _logger   = logger;
     _elements = elements;
     _services = services;
     _metadata = new Lazy <List <TableSchemaMetadata> >(parseMetadata);
     _lock     = new object();
 }
예제 #3
0
        public void race_condition()
        {
            var settings = new SchemaMetadataSettings
            {
                Path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Clarify", "Metadata", SchemaMetadataSettings.FileName)
            };

            var visitors = new List <IXElementVisitor> {
                new ParseTables(), new ParseFields()
            };
            var service  = new XElementService(visitors);
            var services = new InMemoryServiceLocator();

            services.Add <IXElementService>(service);
            services.Add <IXElementSerializer>(new XElementSerializer());

            var cache = new SchemaMetadataCache(settings, new NulloLogger(), service, services);

            // Other tables shouldn't exist but will never be null
            cache.MetadataFor("test").ShouldNotBeNull();

            const string targetTable = "TEST_TABLE";
            var          actions     = new List <Action>();
            var          cleanups    = new List <Action>();

            for (var i = 0; i < 500; i++)
            {
                var thread = new Thread(() =>
                {
                    cache.MetadataFor("case1");
                    cache.MetadataFor("case1");
                    cache.MetadataFor(targetTable);
                    cache.MetadataFor(targetTable);
                    cache.MetadataFor(targetTable);
                    cache.MetadataFor(targetTable);
                });

                actions.Add(() =>
                {
                    Thread.Sleep(50);
                    thread.Start();
                });

                cleanups.Add(() => thread.Join());
            }

            Parallel.Invoke(actions.ToArray());

            cleanups.Each(callback => callback());

            cache.MetadataFor(targetTable).ShouldNotBeNull();
        }