Example #1
0
        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;
        }
Example #2
0
        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));
                }
            }
        }
Example #3
0
        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));
            }
        }
Example #4
0
        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));
            }
        }
Example #5
0
        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));
            }
        }