private async Task SendMessagesForBatch( StatementBuilder statement, TBoundTypeInfo[] typeInfos, String statementName, MessageIOArgs ioArgs, Int32 chunkSize, Int32 batchCount ) { var singleRowParamCount = statement.SQLParameterCount; Int32 max; var execMessage = new ExecuteMessage(); for (var i = 0; i < batchCount; i = max) { max = Math.Min(batchCount, i + chunkSize); for (var j = i; j < max; ++j) { // Send Bind and Execute messages // TODO reuse BindMessage -> add Reset method. await new BindMessage( statement.GetParameterEnumerable(j), singleRowParamCount, typeInfos, this.DisableBinaryProtocolSend, this.DisableBinaryProtocolReceive, statementName: statementName ).SendMessageAsync(ioArgs, true); await execMessage.SendMessageAsync(ioArgs, true); } // Now send flush message for backend to start sending results back await FrontEndMessageWithNoContent.FLUSH.SendMessageAsync(ioArgs, false); } }
protected override void ValidateStatementOrThrow(StatementBuilder statement) { if (statement.BatchParameterCount > 1) { // Verify that all columns have same typeIDs var first = statement .GetParameterEnumerable(0) .Select(param => this.TypeRegistry.GetTypeInfo(param.ParameterCILType).BoundData.TypeID) .ToArray(); var max = statement.BatchParameterCount; for (var i = 1; i < max; ++i) { var j = 0; foreach (var param in statement.GetParameterEnumerable(i)) { if (first[j] != this.TypeRegistry.GetTypeInfo(param.ParameterCILType).BoundData.TypeID) { throw new PgSQLException("When using batch parameters, columns must have same type IDs for all batch rows."); } ++j; } } } }