public void TestSaveAndRemoveItem()
        {
            var repository = new SqlRewriteDbRepository(new SqlConnection(Settings.Default.ConnectionString));
            var item       = new SqlRewriteRule
            {
                Id                     = 0, // This will cause insertion
                DatabaseRegEx          = ".*",
                QueryMatchRegEx        = "SELECT @@VERSION",
                QueryReplacementString = "SELECT DBDATE()",
                RegExOptions           = 0
            };

            repository.SaveSqlRewriteRule(item);
            try
            {
                Assert.AreNotEqual(0, item.Id);
                var items = repository.LoadSqlRewriteRules();
                ItemExists(items, item);
                repository.RemoveSqlRewriteRule(item.Id);
                items = repository.LoadSqlRewriteRules();
                Assert.ThrowsException <Exception>(() => { ItemExists(items, item); });
            }
            finally
            {
                try
                {
                    repository.RemoveSqlRewriteRule(item.Id);
                }
                catch (Exception)
                {
                    // Ignore exceptions trying to remove to cleanup
                }
            }
        }
コード例 #2
0
        public void TestBasicSqlRewriteRuleService()
        {
            using var conn = new SqlConnection(Settings.Default.ConnectionString);
            var repo = new SqlRewriteDbRepository(conn);
            var rule = new SqlRewriteRule
            {
                DatabaseRegEx = ".*", QueryMatchRegEx = Stm, QueryReplacementString = "SELECT GETDATE()"
            };

            repo.SaveSqlRewriteRule(rule);
            using var service = new SqlRewriteRuleService(repo, true);
            using var con     = new SqlConnection(Settings.Default.ConnectionString);
            con.Open();
            using var cmd = new SqlCommand(Stm, con);
            var version = cmd.ExecuteScalar().ToString();

            Assert.IsFalse(version.Contains("Microsoft"));
            service.RemoveRule(rule.Id);
            service.RefreshRulesFromRepository();
            using var con2 = new SqlConnection(Settings.Default.ConnectionString);
            con2.Open();
            using var cmd2 = new SqlCommand(Stm, con2);
            version        = cmd2.ExecuteScalar().ToString();
            Assert.IsTrue(version.Contains("Microsoft"));
        }
コード例 #3
0
        public void TestStoredProcRewrite()
        {
            SqlCommandInterceptor.Enabled = true;
            var rules = new SqlRewriteRule[1];

            rules[0] = new SqlRewriteRule
            {
                DatabaseRegEx          = ".*",
                QueryMatchRegEx        = Stm,
                QueryReplacementString = "sp_getsqlqueueversion"
            };
            SqlCommandRegExProcessor.SqlRewriteRules = rules;
            using var con = new SqlConnection(Settings.Default.ConnectionString);
            con.Open();
            using var cmd   = new SqlCommand(Stm, con);
            cmd.CommandType = CommandType.StoredProcedure;
            try
            {
                cmd.ExecuteScalar();
                throw new Exception("Expecting exception missing parameter executing stored proc");
            }
            catch (SqlException e)
            {
                if (!e.Message.Contains("parameter"))
                {
                    throw;
                }
            }
        }
コード例 #4
0
        public void SaveSqlRewriteRule(SqlRewriteRule rule)
        {
            using var saveSqlRewriteRule = new SqlCommand(@"
                MERGE SqlRewriteRegistry AS t
                USING (
                    SELECT @ID, @DatabaseRegEx, @QueryMatchRegEx, @QueryReplacementString, @RegExOptions
                ) AS src (ID, DatabaseRegEx, QueryMatchRegEx, QueryReplacementString, RegExOptions)
                ON (t.ID = src.ID)
                WHEN MATCHED THEN
                    UPDATE SET 
                        t.DatabaseRegEx = src.DatabaseRegEx,
                        t.QueryMatchRegEx = src.QueryMatchRegEx,
                        t.QueryReplacementString = src.QueryReplacementString,
                        t.RegExOptions = src.RegExOptions
                WHEN NOT MATCHED THEN
                    INSERT (DatabaseRegEx, QueryMatchRegEx, QueryReplacementString, RegExOptions)
                    VALUES (src.DatabaseRegEx, src.QueryMatchRegEx, src.QueryReplacementString, src.RegExOptions)
                OUTPUT Inserted.ID;", _sqlConnection);
            saveSqlRewriteRule.Parameters.AddRange(new[]
            {
                new SqlParameter("@ID", rule.Id),
                new SqlParameter("@DatabaseRegEx", rule.DatabaseRegEx),
                new SqlParameter("@QueryMatchRegEx", rule.QueryMatchRegEx),
                new SqlParameter("@QueryReplacementString", rule.QueryReplacementString),
                new SqlParameter("@RegExOptions", rule.RegExOptions)
            });
            var result = saveSqlRewriteRule.ExecuteScalar();

            if (result is DBNull)
            {
                throw new SqlRewriteRuleDbRepositoryException("Call to saveSqlRewriteRule.ExecuteScalar() should always return a non-null value");
            }
            rule.Id = (int)result;
        }
コード例 #5
0
        private static void Main()
        {
            Console.TreatControlCAsInput = true;

            using var repo = new SqlRewriteDbRepository(Settings.Default.ConnectionString);
            repo.RemoveAllSqlRewriteRules();
            var lastRefreshFromRepo = DateTime.Now;

            using var svc = new SqlRewriteRuleService(repo, true)
                  {
                      AutoRefreshRulesAndSettingsEnabled = true
                  };
            svc.AutoRefreshEvent += () => lastRefreshFromRepo = DateTime.Now;

            using var conn = new SqlConnection(Settings.Default.ConnectionString);
            conn.Open();

            SqlRewriteRule rule  = null;
            var            input = "";

            do
            {
                Console.Clear();
                if (input != "")
                {
                    rule ??= new SqlRewriteRule()
                    {
                        DatabaseRegEx   = ".*",
                        QueryMatchRegEx = "SELECT @@VERSION"
                    };
                    rule.QueryReplacementString = $"{input} /*x*/";
                    repo.SaveSqlRewriteRule(rule);
                }

                PrintCurrentRuleSet(repo);

                using var cmd = CreateSqlCommand(conn);
                Console.WriteLine($"Current datetime: {DateTime.Now}");
                Console.WriteLine($"Last refresh from repository: {lastRefreshFromRepo}");
                Console.WriteLine($"Auto-refresh interval (milliseconds): {svc.AutoRefreshTimerInterval}");
                Console.WriteLine($"Query:\r\n{cmd.CommandText}\r\n");
                Console.WriteLine($"Result:\r\n{cmd.ExecuteScalar()}\r\n");
                Console.WriteLine("Press Enter to continue, enter a replacement SQL and press Enter or press Ctrl-C to finish execution");
                input = "";
                do
                {
                    var keyPressed = Console.ReadKey();
                    if (keyPressed.Key == ConsoleKey.C && keyPressed.Modifiers == ConsoleModifiers.Control)
                    {
                        return;
                    }
                    if (keyPressed.Key == ConsoleKey.Enter)
                    {
                        break;
                    }
                    input += keyPressed.KeyChar;
                } while (true);
                Console.WriteLine();
            } while (true);
        }
 private static void ItemExists(IEnumerable <SqlRewriteRule> items, SqlRewriteRule item)
 {
     foreach (var loadedItem in items)
     {
         if (loadedItem.Id != item.Id)
         {
             continue;
         }
         Assert.AreEqual(item.Id, loadedItem.Id);
         Assert.AreEqual(item.DatabaseRegEx, loadedItem.DatabaseRegEx);
         Assert.AreEqual(item.QueryMatchRegEx, loadedItem.QueryMatchRegEx);
         Assert.AreEqual(item.QueryReplacementString, loadedItem.QueryReplacementString);
         Assert.AreEqual(item.RegExOptions, loadedItem.RegExOptions);
         return;
     }
     throw new Exception("Item doesn't exist");
 }
コード例 #7
0
        public void TestCompleteRewrite()
        {
            SqlCommandInterceptor.Enabled = true;
            var rules = new SqlRewriteRule[1];

            rules[0] = new SqlRewriteRule();
            rules[0].DatabaseRegEx                   = ".*";
            rules[0].QueryMatchRegEx                 = $"(.*){Stm}(.*)";
            rules[0].QueryReplacementString          = $"$1SELECT GETDATE()$2\r\n{SqlCommandRegExProcessor.RegReplacementIndicator}";
            SqlCommandRegExProcessor.SqlRewriteRules = rules;
            using var con = new SqlConnection(Settings.Default.ConnectionString);
            con.Open();
            using var cmd = new SqlCommand(Stm, con);
            Assert.IsTrue(cmd.CommandText.EndsWith(SqlCommandRegExProcessor.RegReplacementIndicator), $"SQL should end with {SqlCommandRegExProcessor.RegReplacementIndicator}");
            var version = cmd.ExecuteScalar().ToString();

            Assert.IsFalse(version.Contains("Microsoft"));
        }
コード例 #8
0
        public void TestBadRegEx()
        {
            SqlCommandInterceptor.Enabled = true;
            var rules = new SqlRewriteRule[1];

            rules[0] = new SqlRewriteRule();
            Assert.ThrowsException <ArgumentException>(() =>
            {
                rules[0].DatabaseRegEx = ".(*"; // Bad regex
            });
            SqlCommandRegExProcessor.SqlRewriteRules = rules;
            using var con = new SqlConnection(Settings.Default.ConnectionString);
            con.Open();
            using var cmd = new SqlCommand(Stm, con);
            var version = cmd.ExecuteScalar().ToString();

            Assert.IsTrue(version.Contains("Microsoft"));
        }
コード例 #9
0
        public IEnumerable <SqlRewriteRule> LoadSqlRewriteRules()
        {
            var result = new List <SqlRewriteRule>();

            using var loadSqlRewriteRules = new SqlCommand(@"
                SELECT ID, DatabaseRegEx, QueryMatchRegEx, QueryReplacementString, RegExOptions
                FROM SqlRewriteRegistry", _sqlConnection);
            using var resultSet           = loadSqlRewriteRules.ExecuteReader();
            while (resultSet.Read())
            {
                var item = new SqlRewriteRule
                {
                    Id                     = (int)resultSet[0],
                    DatabaseRegEx          = (string)resultSet[1],
                    QueryMatchRegEx        = (string)resultSet[2],
                    QueryReplacementString = (string)resultSet[3],
                    RegExOptions           = (RegexOptions)resultSet[4]
                };
                result.Add(item);
            }

            return(result);
        }