in MySQL.Data/src/X/Protocol/X/XProtocol.cs [785:898]
public void SendPrepareStatement(uint stmtId,
PreparedStatementType type,
string schema,
string collection,
bool isRelational,
FilterParams filter,
FindParams findParams,
List<UpdateSpec> updateSpecs = null,
object[] rows = null,
string[] columns = null,
bool upsert = false,
string sql = null)
{
var builder = new Prepare();
builder.StmtId = stmtId;
builder.Stmt = new Prepare.Types.OneOfMessage();
switch (type)
{
case PreparedStatementType.Find:
builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Find;
var message = CreateFindMessage(schema, collection, isRelational, filter, findParams);
message.Args.Clear();
if (filter.HasLimit)
{
uint positionFind = (uint)filter.Parameters.Count;
message.Limit = null;
message.LimitExpr = new LimitExpr
{
RowCount = new Expr
{
Type = Expr.Types.Type.Placeholder,
Position = positionFind++
},
Offset = new Expr
{
Type = Expr.Types.Type.Placeholder,
Position = positionFind++
}
};
}
builder.Stmt.Find = message;
break;
case PreparedStatementType.Update:
builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Update;
var updateMessage = CreateUpdateMessage(schema, collection, isRelational, filter, updateSpecs);
updateMessage.Args.Clear();
if (filter.HasLimit)
{
uint positionUpdate = (uint)filter.Parameters.Count;
updateMessage.Limit = null;
updateMessage.LimitExpr = new LimitExpr
{
RowCount = new Expr
{
Type = Expr.Types.Type.Placeholder,
Position = positionUpdate++
}
};
}
builder.Stmt.Update = updateMessage;
break;
case PreparedStatementType.Delete:
builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Delete;
var deleteMessage = CreateDeleteMessage(schema, collection, isRelational, filter);
deleteMessage.Args.Clear();
if (filter.HasLimit)
{
uint positionDelete = (uint)filter.Parameters.Count;
deleteMessage.Limit = null;
deleteMessage.LimitExpr = new LimitExpr
{
RowCount = new Expr
{
Type = Expr.Types.Type.Placeholder,
Position = positionDelete++
}
};
}
builder.Stmt.Delete = deleteMessage;
break;
case PreparedStatementType.Insert:
builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Insert;
var insertMessage = CreateInsertMessage(schema, isRelational, collection, rows, columns, upsert);
insertMessage.Args.Clear();
uint position = 0;
foreach (var row in insertMessage.Row)
{
foreach (var field in row.Field)
{
if (field.Type == Expr.Types.Type.Literal)
{
field.Type = Expr.Types.Type.Placeholder;
field.Literal = null;
field.Position = position++;
}
}
}
builder.Stmt.Insert = insertMessage;
break;
case PreparedStatementType.SqlStatement:
builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Stmt;
var sqlMessage = CreateExecuteSQLStatement(sql, rows);
sqlMessage.Args.Clear();
builder.Stmt.StmtExecute = sqlMessage;
break;
}
_packetReaderWriter.Write((int)ClientMessages.Types.Type.PreparePrepare, builder);
ReadOk();
}