Пример #1
0
        public string GetTaggedSqlQuery(string sql, TaggingOptions options)
        {
            var indexOfTagConstant = sql.IndexOf(
                TagWithExtensions.TagMarker, StringComparison.Ordinal
                );

            if (indexOfTagConstant == -1)
            {
                return(sql);
            }

            var predicateStartIndex = indexOfTagConstant - 2;
            var startOfTagIndex     = predicateStartIndex + TagWithExtensions.TagMarker.Length + 8;

            var predicateEndIndex = sql.IndexOf("'", startOfTagIndex, StringComparison.Ordinal);
            var endOfTagIndex     = predicateEndIndex - 1; // Remove the final single quote

            var tag = sql.Substring(startOfTagIndex, endOfTagIndex - startOfTagIndex + 1);

            const string startingAnd   = "AND (";
            var          startsWithAnd = StringIsAtIndex(sql, predicateStartIndex - 5, startingAnd);
            const string endingAnd     = ") AND";
            var          endsWithAnd   = StringIsAtIndex(sql, endOfTagIndex + 2, endingAnd);

            string finalSql;

            if (startsWithAnd)
            {
                // Predicate pattern: ... AND (N'__tag' = N'mytag')
                finalSql = sql.Substring(0, indexOfTagConstant - 8)
                           + sql.Substring(endOfTagIndex + 3);
            }
            else if (endsWithAnd)
            {
                // Predicate pattern: (N'__tag' = N'mytag') AND ...
                finalSql = sql.Substring(0, indexOfTagConstant - 3)
                           + sql.Substring(endOfTagIndex + 8);
            }
            else
            {
                // It is the only predicate, so remove the whole "Where" section

                // In some cases the predicate can be wrapped with parentheses even if it's the only predicate left in
                // the query
                var hasParens  = StringIsAtIndex(sql, predicateStartIndex - 1, "(");
                var startIndex = indexOfTagConstant - (hasParens ? 9 : 8);
                var endIndex   = predicateEndIndex + (hasParens ? 2 : 1);
                finalSql = sql.Substring(0, startIndex) + sql.Substring(endIndex);
            }

            finalSql = AddTagToQuery(finalSql, tag, options);
            return(finalSql);
        }
Пример #2
0
        private string AddTagToQuery(string sql, string tag, TaggingOptions options)
        {
            switch (options.TagMode)
            {
            case TagMode.Prefix:
                return(AddPrefixToQuery(sql, tag));

            case TagMode.Infix:
                return(AddInfixToQuery(sql, tag));

            default:
                throw new NotSupportedException();
            }
        }
Пример #3
0
 internal QueryTaggerInterceptor(ISqlTagger sqlTagger, TaggingOptions options, Action <string> sqlWriter) : this(sqlTagger, options)
 {
     _sqlWriter = sqlWriter ?? throw new ArgumentNullException(nameof(sqlWriter));
 }
Пример #4
0
 public QueryTaggerInterceptor(ISqlTagger sqlTagger, TaggingOptions options = null)
 {
     _sqlTagger            = sqlTagger ?? throw new ArgumentNullException(nameof(sqlTagger));
     _options              = options ?? new TaggingOptions();
     TagWith.IsInitialized = true;
 }
Пример #5
0
 public static void Initialize <TTagger>(TaggingOptions options = null) where TTagger : ISqlTagger, new()
 {
     DbInterception.Add(new QueryTaggerInterceptor(new TTagger(), options ?? new TaggingOptions()));
     IsInitialized = true;
 }
Пример #6
0
 internal QueryTaggerInterceptor(ISqlTagger sqlTagger, TaggingOptions options, Action <string> sqlWriter) : this(sqlTagger, options)
 {
     _sqlWriter = sqlWriter;
 }
Пример #7
0
 public QueryTaggerInterceptor(ISqlTagger sqlTagger, TaggingOptions options) : this(sqlTagger)
 {
     _options = options;
 }