private async ValueTask WriteToServerAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
#endif
{
var tableName = DestinationTableName ?? throw new InvalidOperationException("DestinationTableName must be set before calling WriteToServer");
var bulkLoader = new MySqlBulkLoader(m_connection)
{
CharacterSet = "utf8mb4",
EscapeCharacter = '\\',
FieldQuotationCharacter = '\0',
FieldTerminator = "\t",
LinePrefix = null,
LineTerminator = "\n",
Local = true,
NumberOfLinesToSkip = 0,
Source = this,
TableName = QuoteIdentifier(tableName),
Timeout = BulkCopyTimeout,
};
var closeConnection = false;
if (m_connection.State != ConnectionState.Open)
{
m_connection.Open();
closeConnection = true;
}
// if no user-supplied column mappings, compute them from the destination schema
if (ColumnMappings.Count == 0)
{
using var cmd = new MySqlCommand("select * from " + QuoteIdentifier(tableName) + ";", m_connection, m_transaction);
using var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.SchemaOnly, ioBehavior, cancellationToken).ConfigureAwait(false);
var schema = reader.GetColumnSchema();
for (var i = 0; i < schema.Count; i++)
{
if (schema[i].DataTypeName == "BIT")
{
ColumnMappings.Add(new MySqlBulkCopyColumnMapping(i, $"@col{i}", $"`{reader.GetName(i)}` = CAST(@col{i} AS UNSIGNED)"));
}
else if (schema[i].DataTypeName == "YEAR")
{
// the current code can't distinguish between 0 = 0000 and 0 = 2000
throw new NotSupportedException("'YEAR' columns are not supported by MySqlBulkLoader.");
}
else
{
var type = schema[i].DataType;
if (type == typeof(byte[]) || (type == typeof(Guid) && (m_connection.GuidFormat == MySqlGuidFormat.Binary16 || m_connection.GuidFormat == MySqlGuidFormat.LittleEndianBinary16 || m_connection.GuidFormat == MySqlGuidFormat.TimeSwapBinary16)))
{
ColumnMappings.Add(new MySqlBulkCopyColumnMapping(i, $"@col{i}", $"`{reader.GetName(i)}` = UNHEX(@col{i})"));
}
else
{
ColumnMappings.Add(new MySqlBulkCopyColumnMapping(i, reader.GetName(i)));
}
}
}
}
// set columns and expressions from the column mappings
for (var i = 0; i < m_valuesEnumerator !.FieldCount; i++)
{
var columnMapping = ColumnMappings.FirstOrDefault(x => x.SourceOrdinal == i);
if (columnMapping is null)
{
bulkLoader.Columns.Add("@`\uE002\bignore`");
}
else
{
if (columnMapping.DestinationColumn.Length == 0)
{
throw new InvalidOperationException("MySqlBulkCopyColumnMapping.DestinationName is not set.");
}
if (columnMapping.DestinationColumn[0] == '@')
{
bulkLoader.Columns.Add(columnMapping.DestinationColumn);
}
else
{
bulkLoader.Columns.Add(QuoteIdentifier(columnMapping.DestinationColumn));
}
if (columnMapping.Expression is object)
{
bulkLoader.Expressions.Add(columnMapping.Expression);
}
}
}
await bulkLoader.LoadAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
if (closeConnection)
{
m_connection.Close();
}
#if !NETSTANDARD2_1 && !NETCOREAPP3_0
return(default);