using System.Data; using Connected.Entities.Annotations; namespace Connected.Data.Schema.Sql; internal static class SchemaExtensions { public const string FileGroup = "PRIMARY"; public static ITable? Find(this List tables, string schema, string name) { return tables.FirstOrDefault(f => string.Equals(schema, f.Schema, StringComparison.OrdinalIgnoreCase) && string.Equals(name, f.Name, StringComparison.OrdinalIgnoreCase)); } public static ITableColumn? FindColumn(this ITable table, string name) { return table.Columns.FirstOrDefault(f => string.Equals(name, f.Name, StringComparison.OrdinalIgnoreCase)); } public static ITable? FindPrimaryKeyTable(this IDatabase database, string name) { foreach (var i in database.Tables) { foreach (var j in i.Columns) { foreach (var k in j.Constraints) { if (string.Equals(k.Type, "PRIMARY KEY", StringComparison.OrdinalIgnoreCase) && string.Equals(k.Name, name, StringComparison.OrdinalIgnoreCase)) return i; } } } return null; } public static ITableColumn? FindPrimaryKeyColumn(this IDatabase database, string name) { foreach (var i in database.Tables) { foreach (var j in i.Columns) { foreach (var k in j.Constraints) { if (string.Equals(k.Type, "PRIMARY KEY", StringComparison.OrdinalIgnoreCase) && string.Equals(k.Name, name, StringComparison.OrdinalIgnoreCase)) return j; } } } return null; } public static ITableColumn? ResolvePrimaryKeyColumn(this ITable table) { foreach (var i in table.Columns) { foreach (var j in i.Constraints) { if (string.Equals(j.Type, "PRIMARY KEY", StringComparison.OrdinalIgnoreCase)) return i; } } return null; } public static ITableConstraint? ResolvePrimaryKey(this ITable table) { foreach (var i in table.Columns) { foreach (var j in i.Constraints) { if (string.Equals(j.Type, "PRIMARY KEY", StringComparison.OrdinalIgnoreCase)) return j; } } return null; } public static List ResolveDefaults(this ITable table) { var r = new List(); foreach (var i in table.Columns) { if (!string.IsNullOrWhiteSpace(i.DefaultValue)) r.Add(i); } return r; } public static List ResolveUniqueConstraints(this ITable table) { var r = new List(); foreach (var i in table.Columns) { foreach (var j in i.Constraints) { if (string.Equals(j.Type, "UNIQUE", StringComparison.OrdinalIgnoreCase) && r.FirstOrDefault(f => string.Equals(f.Name, j.Name, StringComparison.OrdinalIgnoreCase)) is null) r.Add(j); } } return r; } public static ITableColumn? FindUniqueConstraintColumn(this IDatabase database, string name) { foreach (var table in database.Tables) { foreach (var column in table.Columns) { foreach (var constraint in column.Constraints) { if (string.Equals(constraint.Type, "UNIQUE", StringComparison.OrdinalIgnoreCase) && string.Equals(constraint.Name, name, StringComparison.OrdinalIgnoreCase)) return column; } } } return null; } public static T GetValue(this IDataReader r, string fieldName, T defaultValue) { var idx = r.GetOrdinal(fieldName); if (idx == -1) return defaultValue; if (r.IsDBNull(idx)) return defaultValue; return (T)Convert.ChangeType(r.GetValue(idx), typeof(T)); } public static string SchemaName(this ISchema schema) { return string.IsNullOrWhiteSpace(schema.Schema) ? SchemaAttribute.DefaultSchema : schema.Schema; } public static string ParseDefaultValue(string value) { if (string.IsNullOrEmpty(value)) return value; if (value.StartsWith("N'")) return value; var defValue = $"N'{value}'"; if (value.Length > 1) { var last = value.Trim()[^1]; var prev = value.Trim()[0..^1].Trim()[^1]; if (last == ')' && prev == '(') defValue = value; } return defValue; } public static DbType ToDbType(string value) { if (string.Equals(value, "bigint", StringComparison.OrdinalIgnoreCase)) return DbType.Int64; else if (string.Equals(value, "binary", StringComparison.OrdinalIgnoreCase)) return DbType.Binary; else if (string.Equals(value, "bit", StringComparison.OrdinalIgnoreCase)) return DbType.Boolean; else if (string.Equals(value, "char", StringComparison.OrdinalIgnoreCase)) return DbType.AnsiStringFixedLength; else if (string.Equals(value, "date", StringComparison.OrdinalIgnoreCase)) return DbType.Date; else if (string.Equals(value, "datetime", StringComparison.OrdinalIgnoreCase)) return DbType.DateTime; else if (string.Equals(value, "datetime2", StringComparison.OrdinalIgnoreCase)) return DbType.DateTime2; else if (string.Equals(value, "datetimeoffset", StringComparison.OrdinalIgnoreCase)) return DbType.DateTimeOffset; else if (string.Equals(value, "decimal", StringComparison.OrdinalIgnoreCase)) return DbType.Decimal; else if (string.Equals(value, "float", StringComparison.OrdinalIgnoreCase)) return DbType.Double; else if (string.Equals(value, "geography", StringComparison.OrdinalIgnoreCase)) return DbType.Object; else if (string.Equals(value, "hierarchyid", StringComparison.OrdinalIgnoreCase)) return DbType.Object; else if (string.Equals(value, "image", StringComparison.OrdinalIgnoreCase)) return DbType.Binary; else if (string.Equals(value, "int", StringComparison.OrdinalIgnoreCase)) return DbType.Int32; else if (string.Equals(value, "money", StringComparison.OrdinalIgnoreCase)) return DbType.Currency; else if (string.Equals(value, "nchar", StringComparison.OrdinalIgnoreCase)) return DbType.StringFixedLength; else if (string.Equals(value, "ntext", StringComparison.OrdinalIgnoreCase)) return DbType.String; else if (string.Equals(value, "numeric", StringComparison.OrdinalIgnoreCase)) return DbType.VarNumeric; else if (string.Equals(value, "nvarchar", StringComparison.OrdinalIgnoreCase)) return DbType.String; else if (string.Equals(value, "real", StringComparison.OrdinalIgnoreCase)) return DbType.Single; else if (string.Equals(value, "smalldatetime", StringComparison.OrdinalIgnoreCase)) return DbType.DateTime; else if (string.Equals(value, "smallmoney", StringComparison.OrdinalIgnoreCase)) return DbType.Currency; else if (string.Equals(value, "sql_variant", StringComparison.OrdinalIgnoreCase)) return DbType.Object; else if (string.Equals(value, "text", StringComparison.OrdinalIgnoreCase)) return DbType.String; else if (string.Equals(value, "time", StringComparison.OrdinalIgnoreCase)) return DbType.Time; else if (string.Equals(value, "timestamp", StringComparison.OrdinalIgnoreCase)) return DbType.Binary; else if (string.Equals(value, "tinyint", StringComparison.OrdinalIgnoreCase)) return DbType.Byte; else if (string.Equals(value, "uniqueidentifier", StringComparison.OrdinalIgnoreCase)) return DbType.Guid; else if (string.Equals(value, "varbinary", StringComparison.OrdinalIgnoreCase)) return DbType.Binary; else if (string.Equals(value, "varchar", StringComparison.OrdinalIgnoreCase)) return DbType.AnsiString; else if (string.Equals(value, "xml", StringComparison.OrdinalIgnoreCase)) return DbType.Xml; else return DbType.String; } }