chore: initial git load of code space

This commit is contained in:
Thom Lamb
2026-05-12 08:52:33 -05:00
parent 9abada692f
commit 5e467bcc9c
384 changed files with 65960 additions and 2 deletions
@@ -0,0 +1,124 @@
using System.Text;
namespace Strata.SqlTools.SqlServer.Exceptions;
/// <summary>
/// Exception thrown when SQL parsing fails.
/// Provides detailed context about the parse failure including position and surrounding text.
/// </summary>
public class SqlParseException : Exception
{
/// <summary>
/// Gets the position in the SQL string where the parse error occurred.
/// </summary>
public int Position { get; }
/// <summary>
/// Gets the SQL statement that failed to parse.
/// </summary>
public string Sql { get; }
/// <summary>
/// Gets the text near the error position (up to 40 characters).
/// </summary>
public string NearText { get; }
/// <summary>
/// Initializes a new instance of the <see cref="SqlParseException"/> class.
/// </summary>
/// <param name="message">The error message describing the parse failure.</param>
/// <param name="sql">The SQL statement that failed to parse.</param>
/// <param name="position">The position in the SQL where the error occurred.</param>
/// <example>
/// <code>
/// throw new SqlParseException(
/// "Unexpected token 'FROM'",
/// "SELECT * FRM users",
/// 10
/// );
/// // Message will include:
/// // - Error description
/// // - Position: 10
/// // - Near: "* FRM users"
/// // - Full SQL statement
/// </code>
/// </example>
public SqlParseException(string message, string sql, int position)
: base(FormatMessage(message, sql, position))
{
Position = position;
Sql = sql ?? string.Empty;
NearText = ExtractNearText(sql, position);
}
/// <summary>
/// Initializes a new instance of the <see cref="SqlParseException"/> class with an inner exception.
/// </summary>
/// <param name="message">The error message describing the parse failure.</param>
/// <param name="sql">The SQL statement that failed to parse.</param>
/// <param name="position">The position in the SQL where the error occurred.</param>
/// <param name="innerException">The exception that caused this parse failure.</param>
public SqlParseException(string message, string sql, int position, Exception innerException)
: base(FormatMessage(message, sql, position), innerException)
{
Position = position;
Sql = sql ?? string.Empty;
NearText = ExtractNearText(sql, position);
}
private static string FormatMessage(string message, string sql, int position)
{
if (string.IsNullOrEmpty(sql))
{
return $"{message}\nSQL statement is empty or null.";
}
var nearText = ExtractNearText(sql, position);
var sb = new StringBuilder();
sb.AppendLine(message);
sb.AppendLine($"Position: {position}");
sb.AppendLine($"Near: '{nearText}'");
// Show full SQL for short statements, truncated for long ones
if (sql.Length <= 200)
{
sb.AppendLine($"Full SQL: {sql}");
}
else
{
sb.AppendLine($"SQL (truncated): {sql.Substring(0, 197)}...");
}
return sb.ToString();
}
private static string ExtractNearText(string sql, int position)
{
if (string.IsNullOrEmpty(sql))
{
return string.Empty;
}
// Clamp position to valid range
position = Math.Max(0, Math.Min(position, sql.Length));
// Extract up to 20 chars before and 20 chars after the position
var start = Math.Max(0, position - 20);
var length = Math.Min(40, sql.Length - start);
var nearText = sql.Substring(start, length);
// Add ellipsis if truncated
if (start > 0)
{
nearText = "..." + nearText;
}
if (start + length < sql.Length)
{
nearText = nearText + "...";
}
return nearText;
}
}