public void SendPrepareStatement()

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();
    }