internal static void Test_Scenario(StructuredQuery structuredQuery, Action invalidationCallback, bool expectInvalidation)
        {
            CachingQuerySqlBuilder  cachingQuerySqlBuilder;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            IQuerySqlBuilder        querySqlBuilder;
            QuerySettings           settings;
            QueryBuild           queryBuild;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            settings   = new QuerySettings( );
            queryBuild = new QueryBuild( );

            var cacheInvalidators = new CacheInvalidatorFactory( ).CacheInvalidatorsList_TestOnly;

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(It.IsAny <StructuredQuery>( ), settings))
            .Returns <StructuredQuery, QuerySettings>((sq, qs) =>
            {
                QuerySqlBuilder.IdentifyCacheDependencies(sq, settings);
                return(queryBuild);
            })
            .Verifiable( );
            querySqlBuilder        = mockQuerySqlBuilder.Object;
            cachingQuerySqlBuilder = new CachingQuerySqlBuilder(querySqlBuilder, userRuleSetProvider);

            try
            {
                // Add current cache invalidator to global factory
                cacheInvalidators.Add(cachingQuerySqlBuilder.CacheInvalidator);

                using (var scope = Factory.Current.BeginLifetimeScope(cb =>
                {
                    cb.Register(c => cachingQuerySqlBuilder).As <ICacheService>( );
                }))
                    using (Factory.SetCurrentScope(scope))
                    {
                        // Run first time
                        cachingQuerySqlBuilder.BuildSql(structuredQuery.DeepCopy( ), settings);

                        // Perform potential invalidation task
                        using (new SecurityBypassContext( ))
                        {
                            invalidationCallback( );
                        }

                        // Run second time
                        cachingQuerySqlBuilder.BuildSql(structuredQuery.DeepCopy( ), settings);
                    }

                int times = expectInvalidation ? 2 : 1;
                mockQuerySqlBuilder.Verify(x => x.BuildSql(It.IsAny <StructuredQuery>( ), settings), Times.Exactly(times));
                mockQuerySqlBuilder.VerifyAll( );
            }
            finally
            {
                // Restore cache invalidators
                cacheInvalidators.Remove(cachingQuerySqlBuilder.CacheInvalidator);
            }
        }
예제 #2
0
        /// <summary>
        /// Actually build the SQL
        /// </summary>
        private QueryBuild BuildQueryImpl(StructuredQuery query, QuerySettings settings)
        {
            // Unless otherwise specified, use the cache provider for creating inner security queries as well.
            if (settings.SecurityQueryRunner == null)
            {
                settings.SecurityQueryRunner = this;
            }

            return(QuerySqlBuilder.BuildSql(query, settings));
        }
예제 #3
0
        public override DataTable QueryDbConfigExist(IDictionary <string, string> dicQuery)
        {
            //查询并返回结果
            var querySqlBuilder = new QuerySqlBuilder(DataAccess);

            querySqlBuilder.Sql(
                @"SELECT 1 FROM WH_BD_DB_CONFIG A
                WHERE 1=1
                AND A.DB_CONFIG_CODE = @DB_CONFIG_CODE
            ");
            querySqlBuilder.Sql("DB_CONFIG_ID", "AND A.DB_CONFIG_ID <> @DB_CONFIG_ID");
            querySqlBuilder.Sql("DB_CONFIG_CODE", ""); //此处必须添加
            return(querySqlBuilder.Query(dicQuery));
        }