internal MySqlDbColumn(int ordinal, ColumnDefinitionPayload column, Type type, string dataTypeName) { var columnSize = type == typeof(string) || type == typeof(Guid) ? column.ColumnLength / SerializationUtility.GetBytesPerCharacter(column.CharacterSet) : column.ColumnLength; AllowDBNull = (column.ColumnFlags & ColumnFlags.NotNull) == 0; BaseCatalogName = null; BaseColumnName = column.PhysicalName; BaseSchemaName = column.SchemaName; BaseTableName = column.PhysicalTable; ColumnName = column.Name; ColumnOrdinal = ordinal; ColumnSize = columnSize > int.MaxValue ? int.MaxValue : unchecked ((int)columnSize); DataType = type; DataTypeName = dataTypeName; IsAliased = column.PhysicalName != column.Name; IsAutoIncrement = (column.ColumnFlags & ColumnFlags.AutoIncrement) != 0; IsExpression = false; IsHidden = false; IsKey = (column.ColumnFlags & ColumnFlags.PrimaryKey) != 0; IsLong = column.ColumnLength > 255 && ((column.ColumnFlags & ColumnFlags.Blob) != 0 || column.ColumnType == ColumnType.TinyBlob || column.ColumnType == ColumnType.Blob || column.ColumnType == ColumnType.MediumBlob || column.ColumnType == ColumnType.LongBlob); IsReadOnly = false; IsUnique = (column.ColumnFlags & ColumnFlags.UniqueKey) != 0; if (column.ColumnType == ColumnType.Decimal || column.ColumnType == ColumnType.NewDecimal) { NumericPrecision = (int)(column.ColumnLength - 2 + ((column.ColumnFlags & ColumnFlags.Unsigned) != 0 ? 1 : 0)); } NumericScale = column.Decimals; ProviderType = (int)column.ColumnType; }
public void MaxLength() { using (var reader = m_database.Connection.ExecuteReader(@"select coll.ID, cs.MAXLEN from information_schema.collations coll inner join information_schema.character_sets cs using(CHARACTER_SET_NAME);")) { while (reader.Read()) { var characterSet = (CharacterSet)reader.GetInt32(0); var maxLength = reader.GetInt32(1); Assert.Equal(maxLength, SerializationUtility.GetBytesPerCharacter(characterSet)); } } }
public Type GetFieldType(int ordinal) { if (ordinal < 0 || ordinal > ColumnDefinitions.Length) { throw new ArgumentOutOfRangeException(nameof(ordinal), "value must be between 0 and {0}.".FormatInvariant(ColumnDefinitions.Length)); } var columnDefinition = ColumnDefinitions[ordinal]; var isUnsigned = (columnDefinition.ColumnFlags & ColumnFlags.Unsigned) != 0; switch (columnDefinition.ColumnType) { case ColumnType.Tiny: return(Connection.TreatTinyAsBoolean && columnDefinition.ColumnLength == 1 ? typeof(bool) : isUnsigned ? typeof(byte) : typeof(sbyte)); case ColumnType.Int24: case ColumnType.Long: return(isUnsigned ? typeof(uint) : typeof(int)); case ColumnType.Longlong: return(isUnsigned ? typeof(ulong) : typeof(long)); case ColumnType.Bit: return(typeof(ulong)); case ColumnType.String: if (!Connection.OldGuids && columnDefinition.ColumnLength / SerializationUtility.GetBytesPerCharacter(columnDefinition.CharacterSet) == 36) { return(typeof(Guid)); } goto case ColumnType.VarString; case ColumnType.VarString: case ColumnType.TinyBlob: case ColumnType.Blob: case ColumnType.MediumBlob: case ColumnType.LongBlob: return(columnDefinition.CharacterSet == CharacterSet.Binary ? (Connection.OldGuids && columnDefinition.ColumnLength == 16 ? typeof(Guid) : typeof(byte[])) : typeof(string)); case ColumnType.Json: return(typeof(string)); case ColumnType.Short: return(isUnsigned ? typeof(ushort) : typeof(short)); case ColumnType.Date: case ColumnType.DateTime: case ColumnType.Timestamp: return(typeof(DateTime)); case ColumnType.Time: return(typeof(TimeSpan)); case ColumnType.Year: return(typeof(int)); case ColumnType.Float: return(typeof(float)); case ColumnType.Double: return(typeof(double)); case ColumnType.Decimal: case ColumnType.NewDecimal: return(typeof(decimal)); default: throw new NotImplementedException("GetFieldType for {0} is not implemented".FormatInvariant(columnDefinition.ColumnType)); } }
public string GetDataTypeName(int ordinal) { if (ordinal < 0 || ordinal > ColumnDefinitions.Length) { throw new ArgumentOutOfRangeException(nameof(ordinal), "value must be between 0 and {0}.".FormatInvariant(ColumnDefinitions.Length)); } var columnDefinition = ColumnDefinitions[ordinal]; switch (columnDefinition.ColumnType) { case ColumnType.Tiny: return(Connection.TreatTinyAsBoolean && columnDefinition.ColumnLength == 1 ? "BOOL" : "TINYINT"); case ColumnType.Short: return("SMALLINT"); case ColumnType.Int24: return("MEDIUMINT"); case ColumnType.Long: return("INT"); case ColumnType.Longlong: return("BIGINT"); case ColumnType.Bit: return("BIT"); case ColumnType.String: return(columnDefinition.CharacterSet == CharacterSet.Binary ? "BLOB" : (columnDefinition.ColumnFlags & ColumnFlags.Enum) != 0 ? "ENUM" : (columnDefinition.ColumnFlags & ColumnFlags.Set) != 0 ? "SET" : string.Format(CultureInfo.InvariantCulture, "CHAR({0})", columnDefinition.ColumnLength / SerializationUtility.GetBytesPerCharacter(columnDefinition.CharacterSet))); case ColumnType.VarString: case ColumnType.TinyBlob: case ColumnType.Blob: case ColumnType.MediumBlob: case ColumnType.LongBlob: return(columnDefinition.CharacterSet == CharacterSet.Binary ? "BLOB" : "VARCHAR"); case ColumnType.Date: return("DATE"); case ColumnType.DateTime: return("DATETIME"); case ColumnType.Timestamp: return("TIMESTAMP"); case ColumnType.Time: return("TIME"); case ColumnType.Year: return("YEAR"); case ColumnType.Float: return("FLOAT"); case ColumnType.Double: return("DOUBLE"); case ColumnType.Decimal: case ColumnType.NewDecimal: return("DECIMAL"); case ColumnType.Json: return("JSON"); default: throw new NotImplementedException("GetDataTypeName for {0} is not implemented".FormatInvariant(columnDefinition.ColumnType)); } }
public override object GetValue(int ordinal) { VerifyRead(); if (ordinal < 0 || ordinal > m_columnDefinitions.Length) { throw new ArgumentOutOfRangeException(nameof(ordinal), "value must be between 0 and {0}.".FormatInvariant(m_columnDefinitions.Length)); } if (m_dataOffsets[ordinal] == -1) { return(DBNull.Value); } var data = new ArraySegment <byte>(m_currentRow, m_dataOffsets[ordinal], m_dataLengths[ordinal]); var columnDefinition = m_columnDefinitions[ordinal]; var isUnsigned = columnDefinition.ColumnFlags.HasFlag(ColumnFlags.Unsigned); switch (columnDefinition.ColumnType) { case ColumnType.Tiny: var value = int.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture); if (columnDefinition.ColumnLength == 1) { return(value != 0); } return(isUnsigned ? (object)(byte)value : (sbyte)value); case ColumnType.Int24: case ColumnType.Long: return(isUnsigned ? (object)uint.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture) : int.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture)); case ColumnType.Longlong: return(isUnsigned ? (object)ulong.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture) : long.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture)); case ColumnType.Bit: // BIT column is transmitted as MSB byte array ulong bitValue = 0; for (int i = 0; i < m_dataLengths[ordinal]; i++) { bitValue = bitValue * 256 + m_currentRow[m_dataOffsets[ordinal] + i]; } return(bitValue); case ColumnType.String: if (!Connection.OldGuids && columnDefinition.ColumnLength / SerializationUtility.GetBytesPerCharacter(columnDefinition.CharacterSet) == 36) { return(Guid.Parse(Encoding.UTF8.GetString(data))); } goto case ColumnType.VarString; case ColumnType.VarString: case ColumnType.VarChar: case ColumnType.TinyBlob: case ColumnType.Blob: case ColumnType.MediumBlob: case ColumnType.LongBlob: if (columnDefinition.CharacterSet == CharacterSet.Binary) { var result = new byte[m_dataLengths[ordinal]]; Buffer.BlockCopy(m_currentRow, m_dataOffsets[ordinal], result, 0, result.Length); return(Connection.OldGuids && columnDefinition.ColumnLength == 16 ? (object)new Guid(result) : result); } return(Encoding.UTF8.GetString(data)); case ColumnType.Json: return(Encoding.UTF8.GetString(data)); case ColumnType.Short: return(isUnsigned ? (object)ushort.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture) : short.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture)); case ColumnType.Date: case ColumnType.DateTime: case ColumnType.Timestamp: return(ParseDateTime(data)); case ColumnType.Time: return(ParseTimeSpan(data)); case ColumnType.Year: return(int.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture)); case ColumnType.Float: return(float.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture)); case ColumnType.Double: return(double.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture)); case ColumnType.Decimal: case ColumnType.NewDecimal: return(decimal.Parse(Encoding.UTF8.GetString(data), CultureInfo.InvariantCulture)); default: throw new NotImplementedException("Reading {0} not implemented".FormatInvariant(columnDefinition.ColumnType)); } }