using System; using System.Collections.Generic; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; namespace Sarand.Net.Standard.Base.Dbas { //========================================================================== //[Serializable()] public enum DbColumnDataType { // Ref. https://msdn.microsoft.com/en-us/library/yy6y35y8%28v=vs.110%29.aspx Unknown = -1, VarChar, // SQL_C_CHAR, Bit, // SQL_C_BIT, TinyInt, // SQL_C_TINYINT, SmallInt, // SQL_C_SHORT, Int, // SQL_C_SLONG, BigInt, // SQL_C_SBIGINT, Single, // SQL_C_REAL, Double, // SQL_C_DOUBLE, Decimal, // SQL_DECIMAL?, DateTime, // SQL_C_TYPE_TIMESTAMP Binary, }; //[Serializable()] public enum DbColumnNullable { NoNulls = 0, // SQL_NO_NULLS, Nullable = 1, // SQL_NULLABLE, Unknown = 2, // SQL_NULLABLE_UNKNOWN, // Not known whether or not a data type supports null values. }; //========================================================================== //[Serializable()] public class DbDfnColumn { //------------------------------------------------------------------- // Data members. //------------------------------------------------------------------- // Construction. public DbDfnColumn() { } public DbDfnColumn(String schema, String table, short pos, String name) { Schema = schema; Table = table; Pos = pos; Name = name; } //------------------------------------------------------------------- // Attributes. public String Schema { get; set; } = String.Empty; public String Table { get; set; } = String.Empty; public short Pos { get; set; } = 0; public String Name { get; set; } = String.Empty; public DbColumnDataType DataType { get; set; } = DbColumnDataType.Unknown; public String DataTypeName { get; set; } = String.Empty; public short DataTypeNative { get; set; } = 0; public String DataTypeNameNative { get; set; } = String.Empty; public bool IsIdentity { get; set; } = false; public long Size { get; set; } = 0; public long BufferLen { get; set; } = 0; public short DecimalDigits { get; set; } = 0; public DbColumnNullable Nullable { get; set; } = DbColumnNullable.Unknown; public bool IsNullable { get; set; } = false; public String Remarks { get; set; } = String.Empty; //------------------------------------------------------------------- // Format. public String GetFormat() { String dataType = StringUtil.OnEmpty(DataTypeNameNative, DataTypeName); String format = dataType; if (dataType.ContainsCI("char") || dataType.ContainsCI("bin")) { if (Size > 0) format += "(" + Size + ")"; else format += "(max)"; } return format; } //------------------------------------------------------------------- // Variable type and default - used in variable declaration. /// /// Column data type name as used in property names. /// - Binary represented as 'ByteArray'. /// - Other data types represented by their variable type. /// public String GetVariableTypeName() { switch (DataType) { case DbColumnDataType.Binary: return "ByteArray"; } return GetVariableType(); } /// /// Column data type name as used in variable declarations. /// - VarChar represented as 'String'. /// - Bit represented as 'Boolean'. /// - TinyInt/SmallInt/BigInt represented as 'Int16/32/64'. /// - Single/Double/Decimal/DateTime represented 'as-is'. /// - Binary represented as 'Byte[]'. /// public String GetVariableType() { switch (DataType) { case DbColumnDataType.VarChar: return "String"; case DbColumnDataType.Bit: return "Boolean"; case DbColumnDataType.TinyInt: return "Byte"; case DbColumnDataType.SmallInt: return "Int16"; case DbColumnDataType.Int: return "Int32"; case DbColumnDataType.BigInt: return "Int64"; case DbColumnDataType.Single: return "Single"; case DbColumnDataType.Double: return "Double"; case DbColumnDataType.Decimal: return "Decimal"; case DbColumnDataType.DateTime: return "DateTime"; case DbColumnDataType.Binary: return "Byte[]"; } return String.Empty; } /// /// Default value to be used in column value declarations. /// public String GetVariableDefault() { switch (DataType) { case DbColumnDataType.VarChar: return "String.Empty"; case DbColumnDataType.Bit: return "false"; case DbColumnDataType.TinyInt: return "0"; case DbColumnDataType.SmallInt: return "0"; case DbColumnDataType.Int: return "0"; case DbColumnDataType.BigInt: return "0"; case DbColumnDataType.Single: return "0.0f"; case DbColumnDataType.Double: return "0.0"; case DbColumnDataType.Decimal: return "0.0m"; case DbColumnDataType.DateTime: return "DateTime.MinValue"; case DbColumnDataType.Binary: return "null"; } return String.Empty; } /// /// Method suffix to use for 'GetValue' calls. /// - Binary represented as 'ByteArray'. /// - Other data types represented by their variable type. /// public String GetGetFieldSuffix() { switch (DataType) { case DbColumnDataType.VarChar: case DbColumnDataType.Bit: case DbColumnDataType.TinyInt: case DbColumnDataType.SmallInt: case DbColumnDataType.Int: case DbColumnDataType.BigInt: case DbColumnDataType.Single: case DbColumnDataType.Double: case DbColumnDataType.Decimal: case DbColumnDataType.DateTime: return GetVariableType(); case DbColumnDataType.Binary: return "ByteArray"; } return String.Empty; } //------------------------------------------------------------------- } //========================================================================== // Column list extensions. public static class DbDfnColumnList { // List of column names. public static List GetNames(this List columns) { List names = new List(); foreach (var column in columns) { names.Add(column.Name); } return names; } // Identity column. public static String GetIdentityColumnName(this List columns) { List names = new List(); foreach (var column in columns) { if (column.IsIdentity) return column.Name; } return String.Empty; } public static String GetIdentityColumnVariableTypeName(this List columns) { List names = new List(); foreach (var column in columns) { if (column.IsIdentity) return column.GetVariableTypeName(); } return String.Empty; } // Locate the column in the list: public static DbDfnColumn GetColumnByPos(this List columns, short pos) { foreach (var column in columns) { if (column.Pos == pos) return column; } return null; } public static DbDfnColumn GetColumnByName(this List columns, String name) { foreach (var column in columns) { if (column.Name.EqualsCI(name)) return column; } return null; } } //========================================================================== }