Files
SQLLint/SQLLinter/Infrastructure/Parser/SqlStreamReaderBuilder.cs

45 lines
1.3 KiB
C#

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(@"\$\((?<placeholder>[^)]+)\)", 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();
}
}