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(); } }
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)); } }
public ConnectionSettingsContext(IServiceProvider serviceProvider, string databaseName, MySqlGuidFormat guidFormat) { _serviceProvider = serviceProvider; _databaseName = databaseName; _guidFormat = guidFormat; }
protected ConnectionSettingsContext CreateContext(MySqlGuidFormat guidFormat) => new ConnectionSettingsContext(_serviceProvider, "ConnectionSettings", 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) ?? -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()); }
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))); }
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()); }