Добавьте файлы проекта.

This commit is contained in:
2025-12-07 08:52:05 +03:00
parent 95344cd7a7
commit 226b6b6b21
118 changed files with 5249 additions and 0 deletions

310
SQLLinter/Core/Constants.cs Normal file
View File

@@ -0,0 +1,310 @@
namespace SQLLinter.Core;
public static class Constants
{
public static readonly string[] _TSqlKeywords =
{
"ADD",
"ALL",
"ALTER",
"AND",
"ANY",
"AS",
"ASC",
"AUTHORIZATION",
"BACKUP",
"BEGIN",
"BETWEEN",
"BREAK",
"BROWSE",
"BULK",
"BY",
"CASCADE",
"CASE",
"CHECK",
"CHECKPOINT",
"CLOSE",
"CLUSTERED",
"COALESCE",
"COLLATE",
"COLUMN",
"COMMIT",
"COMPUTE",
"CONSTRAINT",
"CONTAINS",
"CONTAINSTABLE",
"CONTINUE",
"CONVERT",
"CREATE",
"CROSS",
"CURRENT",
"CURRENT_DATE",
"CURRENT_TIME",
"CURRENT_TIMESTAMP",
"CURRENT_USER",
"CURSOR",
"DATABASE",
"DBCC",
"DEALLOCATE",
"DECLARE",
"DEFAULT",
"DELETE",
"DENY",
"DESC",
"DISK",
"DISTINCT",
"DISTRIBUTED",
"DOUBLE",
"DROP",
"DUMP",
"ELSE",
"END",
"ERRLVL",
"ESCAPE",
"EXCEPT",
"EXEC",
"EXECUTE",
"EXISTS",
"EXIT",
"EXTERNAL",
"FETCH",
"FILE",
"FILLFACTOR",
"FOR",
"FOREIGN",
"FREETEXT",
"FREETEXTTABLE",
"FROM",
"FULL",
"FUNCTION",
"GOTO",
"GRANT",
"GROUP",
"HAVING",
"HOLDLOCK",
"IDENTITY",
"IDENTITYCOL",
"IDENTITY_INSERT",
"IF",
"IN",
"INDEX",
"INNER",
"INSERT",
"INTERSECT",
"INTO",
"IS",
"JOIN",
"KEY",
"KILL",
"LEFT",
"LIKE",
"LINENO",
"LOAD",
"MERGE",
"NATIONAL",
"NOCHECK",
"NONCLUSTERED",
"NOT",
"NULL",
"NULLIF",
"OF",
"OFF",
"OFFSETS",
"ON",
"OPEN",
"OPENDATASOURCE",
"OPENQUERY",
"OPENROWSET",
"OPENXML",
"OPTION",
"OR",
"ORDER",
"OUTER",
"OVER",
"PERCENT",
"PIVOT",
"PLAN",
"PRECISION",
"PRIMARY",
"PRINT",
"PROC",
"PROCEDURE",
"PUBLIC",
"RAISERROR",
"READ",
"READTEXT",
"RECONFIGURE",
"REFERENCES",
"REPLICATION",
"RESTORE",
"RESTRICT",
"RETURN",
"REVERT",
"REVOKE",
"RIGHT",
"ROLLBACK",
"ROWCOUNT",
"ROWGUIDCOL",
"RULE",
"SAVE",
"SCHEMA",
"SECURITYAUDIT",
"SELECT",
"SEMANTICKEYPHRASETABLE",
"SEMANTICSIMILARITYDETAILSTABLE",
"SEMANTICSIMILARITYTABLE",
"SESSION_USER",
"SET",
"SETUSER",
"SHUTDOWN",
"SOME",
"STATISTICS",
"SYSTEM_USER",
"TABLE",
"TABLESAMPLE",
"TEXTSIZE",
"THEN",
"TO",
"TOP",
"TRAN",
"TRANSACTION",
"TRIGGER",
"TRUNCATE",
"TRY_CONVERT",
"TSEQUAL",
"UNION",
"UNIQUE",
"UNPIVOT",
"UPDATE",
"UPDATETEXT",
"USE",
"USER",
"VALUES",
"VARYING",
"VIEW",
"WAITFOR",
"WHEN",
"WHERE",
"WHILE",
"WITH",
"WITHIN GROUP",
"WRITETEXT"
};
public static readonly string[] _TSqlDataTypes =
{
"BIGINT",
"BIT",
"DECIMAL",
"INT",
"MONEY",
"NUMERIC",
"SMALLINT",
"SMALLMONEY",
"TINYINT",
"FLOAT",
"REAL",
"DATE",
"DATETIME2",
"DATETIME",
"DATETIMEOFFSET",
"SMALLDATETIME",
"TIME",
"CHAR",
"TEXT",
"VARCHAR",
"NCHAR",
"NTEXT",
"NVARCHAR",
"BINARY",
"IMAGE",
"VARBINARY",
"CURSOR",
"ROWVERSION",
"UNIQUEIDENTIFIER",
"XML"
};
public static readonly HashSet<string> TSqlKeywords = new HashSet<string>(_TSqlKeywords);
public static readonly HashSet<string> TSqlDataTypes = new HashSet<string>(_TSqlDataTypes);
public static int TabWidth => 4;
public static int DefaultCompatabilityLevel => 120;
public static int MaxLineWidthForRegexEval => 300;
public static HashSet<string> SystemFunctions = new(StringComparer.OrdinalIgnoreCase)
{
// Метаданные
"APP_NAME", "HOST_NAME", "HOST_ID", "CONNECTIONPROPERTY", "SESSION_CONTEXT",
"CURRENT_USER", "SYSTEM_USER", "SUSER_NAME", "SUSER_SID", "USER_NAME", "USER_ID",
// Ошибки
"@@ERROR", "ERROR_MESSAGE", "ERROR_LINE", "ERROR_NUMBER", "ERROR_SEVERITY", "ERROR_STATE", "FORMATMESSAGE",
// Идентификаторы
"@@IDENTITY", "SCOPE_IDENTITY", "IDENT_CURRENT", "@@ROWCOUNT", "ROWCOUNT_BIG",
"@@TRANCOUNT", "XACT_STATE", "CURRENT_TRANSACTION_ID",
// Дата/время
"GETDATE", "SYSDATETIME", "SYSUTCDATETIME", "SYSDATETIMEOFFSET", "CURRENT_TIMESTAMP", "GETUTCDATE",
"DATEADD", "DATEDIFF", "DATENAME", "DATEPART", "EOMONTH",
// Строковые/бинарные
"ISNULL", "NULLIF", "COALESCE", "DATALENGTH", "COMPRESS", "DECOMPRESS",
"BINARY_CHECKSUM", "CHECKSUM", "PARSENAME",
// Уникальные идентификаторы
"NEWID", "NEWSEQUENTIALID",
// Системные переменные
"@@VERSION", "@@SERVERNAME", "@@SPID", "@@LANGUAGE", "@@MAX_CONNECTIONS",
// Database Functions
"DB_ID", "DB_NAME", "OBJECT_ID", "OBJECT_NAME", "OBJECT_SCHEMA_NAME",
"COL_LENGTH", "COL_NAME", "FILE_ID", "FILE_NAME", "SCHEMA_ID", "SCHEMA_NAME", "TYPE_ID", "TYPE_NAME",
// Математические
"ABS", "ACOS", "ASIN", "ATAN", "ATN2", "CEILING", "COS", "COT", "DEGREES",
"EXP", "FLOOR", "LOG", "LOG10", "PI", "POWER", "RADIANS", "RAND", "ROUND", "SIGN", "SIN", "SQRT", "SQUARE", "TAN",
// Агрегатные
"AVG", "COUNT", "COUNT_BIG", "MIN", "MAX", "SUM",
// Курсоры
"CURSOR_STATUS",
// Конфигурационные и серверные
"@@OPTIONS", "SESSIONPROPERTY", "INDEXPROPERTY", "INDEX_COL", "COLLATIONPROPERTY",
"SERVERPROPERTY", "DATABASEPROPERTYEX", "OBJECTPROPERTY", "OBJECTPROPERTYEX",
// Безопасность
"HAS_DBACCESS", "IS_MEMBER", "IS_ROLEMEMBER", "IS_SRVROLEMEMBER", "PERMISSIONS", "PWDCOMPARE", "PWDENCRYPT",
// JSON
"JSON_VALUE", "JSON_QUERY", "JSON_MODIFY",
// Аналитические (оконные)
"CUME_DIST", "RANK", "DENSE_RANK", "NTILE", "ROW_NUMBER",
"LEAD", "LAG", "FIRST_VALUE", "LAST_VALUE",
"PERCENT_RANK", "PERCENTILE_CONT", "PERCENTILE_DISC",
// XML
"nodes", "value", "query", "exist", "modify",
// CLR
"FORMAT", "TRY_CONVERT", "TRY_CAST", "TRY_PARSE", "PARSE",
// Spatial (geometry/geography)
"STArea", "STLength", "STDistance", "STIntersects", "STBuffer", "STUnion", "STDifference", "STIntersection",
"STGeomFromText", "STGeomFromWKB", "STPointFromText", "STPointFromWKB",
"STAsText", "STAsBinary", "STEnvelope", "STCentroid", "STIsEmpty", "STIsValid",
// Statistical
"STDEV", "STDEVP", "VAR", "VARP", "CHECKSUM_AGG", "COLUMNS_UPDATED"
};
}

View File

@@ -0,0 +1,20 @@
namespace SQLLinter.Core.DTO;
public class HandlerResponseMessage
{
public HandlerResponseMessage(bool success, bool shouldLint)
: this(success, shouldLint, false)
{
}
public HandlerResponseMessage(bool success, bool shouldLint, bool shouldFix)
{
Success = success;
ShouldLint = shouldLint;
ShouldFix = shouldFix;
}
public bool Success { get; }
public bool ShouldLint { get; }
public bool ShouldFix { get; }
}

View File

@@ -0,0 +1,10 @@
using System.Reflection;
namespace SQLLinter.Core.Interfaces;
public interface IAssemblyWrapper
{
Assembly LoadFrom(string path);
Type[] GetExportedTypes(Assembly assembly);
}

View File

@@ -0,0 +1,24 @@
using SQLLinter.Common;
namespace SQLLinter.Core.Interfaces
{
public interface IConfig
{
/// <summary>
/// Уровень совместимости SQL Server
/// </summary>
int CompatibilityLevel { get; set; }
/// <summary>
/// Включенные правила.
/// Key - Название правила.
/// Value - Уровень предупреждения.
/// </summary>
Dictionary<string, RuleViolationSeverity> Rules { get; set; }
/// <summary>
/// Список сторонних плагинов.
/// </summary>
List<string> Plugins { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
using SQLLinter.Common;
namespace SQLLinter.Core.Interfaces;
public interface IExtendedRuleException : IRuleException
{
void SetEndLine(int endLine);
}

View File

@@ -0,0 +1,10 @@
namespace SQLLinter.Core.Interfaces;
public interface IFileSystemWrapper
{
bool FileExists(string path);
bool PathIsValidForLint(string path);
string CombinePath(params string[] paths);
}

View File

@@ -0,0 +1,8 @@
using System.Reflection;
namespace SQLLinter.Core.Interfaces;
public interface IFileversionWrapper
{
string GetVersion(Assembly assembly);
}

View File

@@ -0,0 +1,6 @@
namespace SQLLinter.Core.Interfaces;
public interface IGlobPatternMatcher
{
IEnumerable<string> GetResultsInFullPath(string path);
}

View File

@@ -0,0 +1,4 @@
namespace SQLLinter.Core.Interfaces;
public interface IOverride
{ }

View File

@@ -0,0 +1,9 @@
using SQLLinter.Common;
namespace SQLLinter.Core.Interfaces;
public interface IPluginHandler
{
IList<IRule> Rules { get; }
IDictionary<string, IRule> RuleWithNames { get; }
}

View File

@@ -0,0 +1,19 @@
namespace SQLLinter.Core.Interfaces.Config.Contracts;
public interface IRequestHandler<in TRequest, out TResponse> where TRequest : IRequest<TResponse>
{
TResponse Handle(TRequest request);
}
public interface IRequestHandler<in TRequest> where TRequest : IRequest
{
void Handle(TRequest message);
}
public interface IRequest
{
}
public interface IRequest<out TResponse>
{
}

View File

@@ -0,0 +1,6 @@
namespace SQLLinter.Core.Interfaces;
public interface IRuleExceptionFinder
{
IEnumerable<IExtendedRuleException> GetIgnoredRuleList(Stream fileStream);
}

View File

@@ -0,0 +1,8 @@
using SQLLinter.Common;
namespace SQLLinter.Core.Interfaces;
public interface IRuleVisitor
{
void VisitRules(string path, IEnumerable<IRuleException> igoredRules, Stream sqlFileStream);
}

View File

@@ -0,0 +1,11 @@
namespace SQLLinter.Core.Interfaces;
public interface ISqlFileProcessor
{
int FileCount { get; }
void ProcessList(List<string> filePaths);
void ProcessList(Dictionary<string, Stream> files);
void ProcessPath(string path);
}