using SQLLinter.Infrastructure.Interfaces; using System.Text; using System.Text.RegularExpressions; namespace SQLLinter.Infrastructure.Parser; public class SqlStreamReaderBuilder : ISqlStreamReaderBuilder { private static readonly Regex _placeholderRegex = new Regex(@"\$\((?[^)]+)\)", RegexOptions.Compiled); public StreamReader CreateReader(Stream sqlFileStream) { var sqlText = new StreamReader(sqlFileStream); sqlFileStream.Seek(0, SeekOrigin.Begin); var sql = ReplaceSqlPlaceholders(sqlText.ReadToEnd()); return new StreamReader(new MemoryStream(sqlText.CurrentEncoding.GetBytes(sql))); } private string ReplaceSqlPlaceholders(string sql) { var matches = _placeholderRegex.Matches(sql); if (matches.Count == 0) { return sql; } var newSql = new StringBuilder(); var i = 0; foreach (Match match in matches) { var placeholder = match.Groups["placeholder"].Value; var replacement = match.Value; newSql.Append(sql.Substring(i, match.Index - i)); newSql.Append(replacement); i = match.Index + match.Length; } newSql.Append(sql.Substring(i)); return newSql.ToString(); } }