45 lines
1.3 KiB
C#
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();
|
|
}
|
|
}
|