Exemple #1
0
        public virtual void Insert_and_read_Guid_value(MySqlGuidFormat guidFormat, string sqlEquivalent, string supportedServerVersion)
        {
            if (supportedServerVersion != null &&
                !AppConfig.ServerVersion.Supports.Version(ServerVersion.Parse(supportedServerVersion)))
            {
                return;
            }

            using var context = CreateContext(guidFormat);

            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();

            context.SimpleGuidEntities.Add(new SimpleGuidEntity {
                GuidValue = new Guid("850368D8-93EA-4023-ACC7-6FA6E4C3B27F")
            });
            context.SaveChanges();

            var result = context.SimpleGuidEntities
                         .Where(e => e.GuidValue == new Guid("850368D8-93EA-4023-ACC7-6FA6E4C3B27F"))
                         .ToList();

            var sqlResult = context.SimpleGuidEntities
                            .FromSqlRaw(@"select * from `SimpleGuidEntities` where `GuidValue` = " + string.Format(sqlEquivalent, new Guid("850368D8-93EA-4023-ACC7-6FA6E4C3B27F")))
                            .ToList();

            Assert.Single(result);
            Assert.Equal(new Guid("850368D8-93EA-4023-ACC7-6FA6E4C3B27F"), result[0].GuidValue);
            Assert.Single(sqlResult);
        }
 public MySqlGuidTypeMapping(MySqlGuidFormat guidFormat)
     : this(new RelationalTypeMappingParameters(
                new CoreTypeMappingParameters(typeof(Guid)),
                GetStoreType(guidFormat),
                StoreTypePostfix.Size,
                System.Data.DbType.Guid,
                false,
                GetSize(guidFormat),
                true),
            guidFormat)
 {
 }
        protected static byte[] GetBytesFromGuid(MySqlGuidFormat guidFormat, Guid guid)
        {
            var bytes = guid.ToByteArray();

            if (guidFormat == MySqlGuidFormat.Binary16)
            {
                return(new[] { bytes[3], bytes[2], bytes[1], bytes[0], bytes[5], bytes[4], bytes[7], bytes[6], bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15] });
            }

            if (guidFormat == MySqlGuidFormat.TimeSwapBinary16)
            {
                return(new[] { bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0], bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15] });
            }

            return(bytes);
        }
        private static string GetStoreType(MySqlGuidFormat guidFormat)
        {
            switch (guidFormat)
            {
            case MySqlGuidFormat.Char36:
            case MySqlGuidFormat.Char32:
                return("char");

            case MySqlGuidFormat.Binary16:
            case MySqlGuidFormat.TimeSwapBinary16:
            case MySqlGuidFormat.LittleEndianBinary16:
                return("binary");

            case MySqlGuidFormat.None:
            case MySqlGuidFormat.Default:
            default:
                throw new InvalidOperationException();
            }
        }
        private static int GetSize(MySqlGuidFormat guidFormat)
        {
            switch (guidFormat)
            {
            case MySqlGuidFormat.Char36:
                return(36);

            case MySqlGuidFormat.Char32:
                return(32);

            case MySqlGuidFormat.Binary16:
            case MySqlGuidFormat.TimeSwapBinary16:
            case MySqlGuidFormat.LittleEndianBinary16:
                return(16);

            case MySqlGuidFormat.None:
            case MySqlGuidFormat.Default:
            default:
                throw new InvalidOperationException();
            }
        }
Exemple #6
0
        private static MySqlGuidFormat GetEffectiveGuidFormat(MySqlGuidFormat guidFormat, bool oldGuids)
        {
            switch (guidFormat)
            {
            case MySqlGuidFormat.Default:
                return(oldGuids ? MySqlGuidFormat.LittleEndianBinary16 : MySqlGuidFormat.Char36);

            case MySqlGuidFormat.None:
            case MySqlGuidFormat.Char36:
            case MySqlGuidFormat.Char32:
            case MySqlGuidFormat.Binary16:
            case MySqlGuidFormat.TimeSwapBinary16:
            case MySqlGuidFormat.LittleEndianBinary16:
                if (oldGuids)
                {
                    throw new MySqlException("OldGuids cannot be used with GuidFormat");
                }
                return(guidFormat);

            default:
                throw new MySqlException("Unknown GuidFormat");
            }
        }
        public static MySqlDbType ConvertToMySqlDbType(ColumnDefinitionPayload columnDefinition, bool treatTinyAsBoolean, MySqlGuidFormat guidFormat)
        {
            var isUnsigned = (columnDefinition.ColumnFlags & ColumnFlags.Unsigned) != 0;

            switch (columnDefinition.ColumnType)
            {
            case ColumnType.Tiny:
                return(treatTinyAsBoolean && columnDefinition.ColumnLength == 1 ? MySqlDbType.Bool :
                       isUnsigned?MySqlDbType.UByte : MySqlDbType.Byte);

            case ColumnType.Int24:
                return(isUnsigned ? MySqlDbType.UInt24 : MySqlDbType.Int24);

            case ColumnType.Long:
                return(isUnsigned ? MySqlDbType.UInt32 : MySqlDbType.Int32);

            case ColumnType.Longlong:
                return(isUnsigned ? MySqlDbType.UInt64 : MySqlDbType.Int64);

            case ColumnType.Bit:
                return(MySqlDbType.Bit);

            case ColumnType.String:
                if (guidFormat == MySqlGuidFormat.Char36 && columnDefinition.ColumnLength / ProtocolUtility.GetBytesPerCharacter(columnDefinition.CharacterSet) == 36)
                {
                    return(MySqlDbType.Guid);
                }
                if (guidFormat == MySqlGuidFormat.Char32 && columnDefinition.ColumnLength / ProtocolUtility.GetBytesPerCharacter(columnDefinition.CharacterSet) == 32)
                {
                    return(MySqlDbType.Guid);
                }
                if ((columnDefinition.ColumnFlags & ColumnFlags.Enum) != 0)
                {
                    return(MySqlDbType.Enum);
                }
                if ((columnDefinition.ColumnFlags & ColumnFlags.Set) != 0)
                {
                    return(MySqlDbType.Set);
                }
                goto case ColumnType.VarString;

            case ColumnType.VarString:
            case ColumnType.TinyBlob:
            case ColumnType.Blob:
            case ColumnType.MediumBlob:
            case ColumnType.LongBlob:
                var type = columnDefinition.ColumnType;
                if (columnDefinition.CharacterSet == CharacterSet.Binary)
                {
                    if ((guidFormat == MySqlGuidFormat.Binary16 || guidFormat == MySqlGuidFormat.TimeSwapBinary16 || guidFormat == MySqlGuidFormat.LittleEndianBinary16) && columnDefinition.ColumnLength == 16)
                    {
                        return(MySqlDbType.Guid);
                    }

                    return(type == ColumnType.String ? MySqlDbType.Binary :
                           type == ColumnType.VarString ? MySqlDbType.VarBinary :
                           type == ColumnType.TinyBlob ? MySqlDbType.TinyBlob :
                           type == ColumnType.Blob ? MySqlDbType.Blob :
                           type == ColumnType.MediumBlob ? MySqlDbType.MediumBlob :
                           MySqlDbType.LongBlob);
                }
                return(type == ColumnType.String ? MySqlDbType.String :
                       type == ColumnType.VarString ? MySqlDbType.VarChar :
                       type == ColumnType.TinyBlob ? MySqlDbType.TinyText :
                       type == ColumnType.Blob ? MySqlDbType.Text :
                       type == ColumnType.MediumBlob ? MySqlDbType.MediumText :
                       MySqlDbType.LongText);

            case ColumnType.Json:
                return(MySqlDbType.JSON);

            case ColumnType.Short:
                return(isUnsigned ? MySqlDbType.UInt16 : MySqlDbType.Int16);

            case ColumnType.Date:
                return(MySqlDbType.Date);

            case ColumnType.DateTime:
                return(MySqlDbType.DateTime);

            case ColumnType.Timestamp:
                return(MySqlDbType.Timestamp);

            case ColumnType.Time:
                return(MySqlDbType.Time);

            case ColumnType.Year:
                return(MySqlDbType.Year);

            case ColumnType.Float:
                return(MySqlDbType.Float);

            case ColumnType.Double:
                return(MySqlDbType.Double);

            case ColumnType.Decimal:
                return(MySqlDbType.Decimal);

            case ColumnType.NewDecimal:
                return(MySqlDbType.NewDecimal);

            case ColumnType.Geometry:
                return(MySqlDbType.Geometry);

            case ColumnType.Null:
                return(MySqlDbType.Null);

            default:
                throw new NotImplementedException("ConvertToMySqlDbType for {0} is not implemented".FormatInvariant(columnDefinition.ColumnType));
            }
        }
Exemple #8
0
 public ConnectionSettingsContext(IServiceProvider serviceProvider, string databaseName, MySqlGuidFormat guidFormat)
 {
     _serviceProvider = serviceProvider;
     _databaseName    = databaseName;
     _guidFormat      = guidFormat;
 }
Exemple #9
0
 protected ConnectionSettingsContext CreateContext(MySqlGuidFormat guidFormat)
 => new ConnectionSettingsContext(_serviceProvider, "ConnectionSettings", guidFormat);
Exemple #10
0
        private PayloadData CreateQueryPayload(PreparedStatement preparedStatement, MySqlParameterCollection parameterCollection, MySqlGuidFormat guidFormat)
        {
            var writer = new ByteBufferWriter();

            writer.Write((byte)CommandKind.StatementExecute);
            writer.Write(preparedStatement.StatementId);
            writer.Write((byte)0);
            writer.Write(1);
            if (preparedStatement.Parameters?.Length > 0)
            {
                // TODO: How to handle incorrect number of parameters?

                // build subset of parameters for this statement
                var parameters = new MySqlParameter[preparedStatement.Statement.ParameterNames.Count];
                for (var i = 0; i < preparedStatement.Statement.ParameterNames.Count; i++)
                {
                    var parameterName  = preparedStatement.Statement.ParameterNames[i];
                    var parameterIndex = parameterName != null ? (parameterCollection?.NormalizedIndexOf(parameterName) ?? -1) : preparedStatement.Statement.ParameterIndexes[i];
                    if (parameterIndex == -1 && parameterName != null)
                    {
                        throw new MySqlException("Parameter '{0}' must be defined.".FormatInvariant(parameterName));
                    }
                    else if (parameterIndex < 0 || parameterIndex >= (parameterCollection?.Count ?? 0))
                    {
                        throw new MySqlException("Parameter index {0} is invalid when only {1} parameter{2} defined.".FormatInvariant(parameterIndex, parameterCollection?.Count ?? 0, parameterCollection?.Count == 1 ? " is" : "s are"));
                    }
                    parameters[i] = parameterCollection[parameterIndex];
                }

                // write null bitmap
                byte nullBitmap = 0;
                for (var i = 0; i < parameters.Length; i++)
                {
                    var parameter = parameters[i];
                    if (parameter.Value == null || parameter.Value == DBNull.Value)
                    {
                        if (i > 0 && i % 8 == 0)
                        {
                            writer.Write(nullBitmap);
                            nullBitmap = 0;
                        }

                        nullBitmap |= (byte)(1 << (i % 8));
                    }
                }
                writer.Write(nullBitmap);

                // write "new parameters bound" flag
                writer.Write((byte)1);

                foreach (var parameter in parameters)
                {
                    writer.Write(TypeMapper.ConvertToColumnTypeAndFlags(parameter.MySqlDbType, guidFormat));
                }

                var options = m_command.CreateStatementPreparerOptions();
                foreach (var parameter in parameters)
                {
                    parameter.AppendBinary(writer, options);
                }
            }

            return(writer.ToPayloadData());
        }
Exemple #11
0
        public static ushort ConvertToColumnTypeAndFlags(MySqlDbType dbType, MySqlGuidFormat guidFormat)
        {
            var        isUnsigned = false;
            ColumnType columnType;

            switch (dbType)
            {
            case MySqlDbType.Bool:
            case MySqlDbType.Byte:
                columnType = ColumnType.Tiny;
                break;

            case MySqlDbType.UByte:
                columnType = ColumnType.Tiny;
                isUnsigned = true;
                break;

            case MySqlDbType.Int16:
                columnType = ColumnType.Short;
                break;

            case MySqlDbType.UInt16:
                columnType = ColumnType.Short;
                isUnsigned = true;
                break;

            case MySqlDbType.Int24:
                columnType = ColumnType.Int24;
                break;

            case MySqlDbType.UInt24:
                columnType = ColumnType.Int24;
                isUnsigned = true;
                break;

            case MySqlDbType.Int32:
                columnType = ColumnType.Long;
                break;

            case MySqlDbType.UInt32:
                columnType = ColumnType.Long;
                isUnsigned = true;
                break;

            case MySqlDbType.Int64:
                columnType = ColumnType.Longlong;
                break;

            case MySqlDbType.UInt64:
                columnType = ColumnType.Longlong;
                isUnsigned = true;
                break;

            case MySqlDbType.Bit:
                columnType = ColumnType.Bit;
                break;

            case MySqlDbType.Guid:
                if (guidFormat == MySqlGuidFormat.Char36 || guidFormat == MySqlGuidFormat.Char32)
                {
                    columnType = ColumnType.String;
                }
                else
                {
                    columnType = ColumnType.Blob;
                }
                break;

            case MySqlDbType.Enum:
            case MySqlDbType.Set:
                columnType = ColumnType.String;
                break;

            case MySqlDbType.Binary:
            case MySqlDbType.String:
                columnType = ColumnType.String;
                break;

            case MySqlDbType.VarBinary:
            case MySqlDbType.VarChar:
            case MySqlDbType.VarString:
                columnType = ColumnType.VarString;
                break;

            case MySqlDbType.TinyBlob:
            case MySqlDbType.TinyText:
                columnType = ColumnType.TinyBlob;
                break;

            case MySqlDbType.Blob:
            case MySqlDbType.Text:
                columnType = ColumnType.Blob;
                break;

            case MySqlDbType.MediumBlob:
            case MySqlDbType.MediumText:
                columnType = ColumnType.MediumBlob;
                break;

            case MySqlDbType.LongBlob:
            case MySqlDbType.LongText:
                columnType = ColumnType.LongBlob;
                break;

            case MySqlDbType.JSON:
                columnType = ColumnType.Json;                 // TODO: test
                break;

            case MySqlDbType.Date:
            case MySqlDbType.Newdate:
                columnType = ColumnType.Date;
                break;

            case MySqlDbType.DateTime:
                columnType = ColumnType.DateTime;
                break;

            case MySqlDbType.Timestamp:
                columnType = ColumnType.Timestamp;
                break;

            case MySqlDbType.Time:
                columnType = ColumnType.Time;
                break;

            case MySqlDbType.Year:
                columnType = ColumnType.Year;
                break;

            case MySqlDbType.Float:
                columnType = ColumnType.Float;
                break;

            case MySqlDbType.Double:
                columnType = ColumnType.Double;
                break;

            case MySqlDbType.Decimal:
                columnType = ColumnType.Decimal;
                break;

            case MySqlDbType.NewDecimal:
                columnType = ColumnType.NewDecimal;
                break;

            case MySqlDbType.Geometry:
                columnType = ColumnType.Geometry;
                break;

            default:
                throw new NotImplementedException("ConvertToColumnTypeAndFlags for {0} is not implemented".FormatInvariant(dbType));
            }

            return((ushort)((byte)columnType | (isUnsigned ? 0x8000 : 0)));
        }
Exemple #12
0
 public static string CreateConnectionString(string name, bool noBackslashEscapes = false, MySqlGuidFormat guidFormat = MySqlGuidFormat.Default)
 => new MySqlConnectionStringBuilder(AppConfig.ConnectionString)
 {
     Database = name,
     DefaultCommandTimeout = (uint)GetCommandTimeout(),
     NoBackslashEscapes    = noBackslashEscapes,
     PersistSecurityInfo   = true,   // needed by some tests to not leak a broken connection into the following tests
     GuidFormat            = guidFormat,
     AllowUserVariables    = true,
     UseAffectedRows       = false,
 }.ConnectionString;
 public static bool IsValidGuidFormat(MySqlGuidFormat guidFormat)
 => guidFormat != MySqlGuidFormat.None &&
 guidFormat != MySqlGuidFormat.Default;
 protected MySqlGuidTypeMapping(RelationalTypeMappingParameters parameters, MySqlGuidFormat guidFormat)
     : base(parameters)
 {
     _guidFormat = guidFormat;
 }
        private PayloadData CreateQueryPayload(PreparedStatement preparedStatement, MySqlParameterCollection parameterCollection, MySqlGuidFormat guidFormat)
        {
            var writer = new ByteBufferWriter();

            writer.Write((byte)CommandKind.StatementExecute);
            writer.Write(preparedStatement.StatementId);
            writer.Write((byte)0);
            writer.Write(1);
            if (preparedStatement.Parameters?.Length > 0)
            {
                // TODO: How to handle incorrect number of parameters?

                // build subset of parameters for this statement
                var parameters = new MySqlParameter[preparedStatement.Statement.ParameterNames.Count];
                for (var i = 0; i < preparedStatement.Statement.ParameterNames.Count; i++)
                {
                    var parameterName  = preparedStatement.Statement.ParameterNames[i];
                    var parameterIndex = parameterName != null?parameterCollection.NormalizedIndexOf(parameterName) : preparedStatement.Statement.ParameterIndexes[i];

                    parameters[i] = parameterCollection[parameterIndex];
                }

                // write null bitmap
                byte nullBitmap = 0;
                for (var i = 0; i < parameters.Length; i++)
                {
                    var parameter = parameters[i];
                    if (parameter.Value == null || parameter.Value == DBNull.Value)
                    {
                        if (i > 0 && i % 8 == 0)
                        {
                            writer.Write(nullBitmap);
                            nullBitmap = 0;
                        }

                        nullBitmap |= (byte)(1 << (i % 8));
                    }
                }
                writer.Write(nullBitmap);

                // write "new parameters bound" flag
                writer.Write((byte)1);

                foreach (var parameter in parameters)
                {
                    writer.Write(TypeMapper.ConvertToColumnTypeAndFlags(parameter.MySqlDbType, guidFormat));
                }

                var options = m_command.CreateStatementPreparerOptions();
                foreach (var parameter in parameters)
                {
                    parameter.AppendBinary(writer, options);
                }
            }

            return(writer.ToPayloadData());
        }