Example #1
0
        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);
            }
        }
Example #2
0
 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;
             }
         }
     }
 }