You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
2.9 KiB
125 lines
2.9 KiB
using System.Data;
|
|
using System.Reflection;
|
|
using Connected.Entities.Annotations;
|
|
|
|
namespace Connected.Data.Schema;
|
|
|
|
internal class SchemaColumn : IEquatable<ISchemaColumn>, ISchemaColumn
|
|
{
|
|
public SchemaColumn(ISchema schema, PropertyInfo property)
|
|
{
|
|
Schema = schema;
|
|
Property = property;
|
|
}
|
|
private ISchema Schema { get; }
|
|
|
|
public string? Name { get; set; }
|
|
public DbType DataType { get; set; }
|
|
public bool IsIdentity { get; set; }
|
|
public bool IsUnique { get; set; }
|
|
public bool IsVersion { get; set; }
|
|
public bool IsIndex { get; set; }
|
|
public bool IsPrimaryKey { get; set; }
|
|
public string? DefaultValue { get; set; }
|
|
public int MaxLength { get; set; }
|
|
public bool IsNullable { get; set; }
|
|
public string? Index { get; set; }
|
|
public int Precision { get; set; }
|
|
public int Scale { get; set; }
|
|
public DateKind DateKind { get; set; } = DateKind.DateTime;
|
|
public BinaryKind BinaryKind { get; set; } = BinaryKind.VarBinary;
|
|
public int DatePrecision { get; set; }
|
|
|
|
public int Ordinal { get; set; }
|
|
|
|
public PropertyInfo Property { get; set; }
|
|
|
|
public bool Equals(ISchemaColumn? other)
|
|
{
|
|
if (other is null)
|
|
return false;
|
|
|
|
if (!string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase))
|
|
return false;
|
|
|
|
if (DataType != other.DataType)
|
|
return false;
|
|
|
|
if (IsIdentity != other.IsIdentity)
|
|
return false;
|
|
|
|
if (IsUnique != other.IsUnique)
|
|
return false;
|
|
|
|
if (IsIndex != other.IsIndex)
|
|
return false;
|
|
|
|
if (IsVersion != other.IsVersion)
|
|
return false;
|
|
|
|
if (IsPrimaryKey != other.IsPrimaryKey)
|
|
return false;
|
|
|
|
if (Precision != other.Precision)
|
|
return false;
|
|
|
|
if (Scale != other.Scale)
|
|
return false;
|
|
|
|
if (!string.Equals(DefaultValue, other.DefaultValue, StringComparison.Ordinal))
|
|
return false;
|
|
|
|
if (MaxLength != other.MaxLength)
|
|
return false;
|
|
|
|
if (IsNullable != other.IsNullable)
|
|
return false;
|
|
|
|
if (DateKind != other.DateKind)
|
|
return false;
|
|
|
|
if (DatePrecision != other.DatePrecision)
|
|
return false;
|
|
|
|
if (BinaryKind != other.BinaryKind)
|
|
return false;
|
|
|
|
if (other is IExistingSchemaColumn existing)
|
|
{
|
|
var existingColumns = existing.QueryIndexColumns(Name);
|
|
|
|
if (existingColumns.Any() || IsIndex)
|
|
{
|
|
var columns = new List<string>();
|
|
|
|
if (!string.IsNullOrWhiteSpace(Index))
|
|
{
|
|
foreach (var column in Schema.Columns)
|
|
{
|
|
if (string.Equals(column.Index, Index, StringComparison.OrdinalIgnoreCase))
|
|
columns.Add(column.Name);
|
|
}
|
|
}
|
|
else
|
|
columns.Add(Name);
|
|
|
|
if (existingColumns.Length != columns.Count)
|
|
return false;
|
|
|
|
existingColumns = existingColumns.Sort();
|
|
columns.Sort();
|
|
|
|
for (var i = 0; i < existingColumns.Length; i++)
|
|
{
|
|
if (!string.Equals(existingColumns[i], columns[i], StringComparison.OrdinalIgnoreCase))
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
return string.Equals(Index, other.Index, StringComparison.Ordinal);
|
|
|
|
return true;
|
|
}
|
|
}
|