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); }
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(); } }
internal QueryTaggerInterceptor(ISqlTagger sqlTagger, TaggingOptions options, Action <string> sqlWriter) : this(sqlTagger, options) { _sqlWriter = sqlWriter ?? throw new ArgumentNullException(nameof(sqlWriter)); }
public QueryTaggerInterceptor(ISqlTagger sqlTagger, TaggingOptions options = null) { _sqlTagger = sqlTagger ?? throw new ArgumentNullException(nameof(sqlTagger)); _options = options ?? new TaggingOptions(); TagWith.IsInitialized = true; }
public static void Initialize <TTagger>(TaggingOptions options = null) where TTagger : ISqlTagger, new() { DbInterception.Add(new QueryTaggerInterceptor(new TTagger(), options ?? new TaggingOptions())); IsInitialized = true; }
internal QueryTaggerInterceptor(ISqlTagger sqlTagger, TaggingOptions options, Action <string> sqlWriter) : this(sqlTagger, options) { _sqlWriter = sqlWriter; }
public QueryTaggerInterceptor(ISqlTagger sqlTagger, TaggingOptions options) : this(sqlTagger) { _options = options; }