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;
}
}
//==========================================================================
}