protected override async Task HandleMessage(PgTransaction transaction, MessageBuilder messageBuilder, PipeWriter writer, CancellationToken token) { // TODO: Maybe support multiple SELECT statements in one query - requires parsing the SQL using var query = PgQuery.CreateInstance(QueryString, null, transaction.DocumentDatabase); var schema = await query.Init(true); if (schema.Count != 0) { await writer.WriteAsync(messageBuilder.RowDescription(schema), token); } await query.Execute(messageBuilder, writer, token); await writer.WriteAsync(messageBuilder.ReadyForQuery(transaction.State), token); }
protected override async Task HandleMessage(PgTransaction transaction, MessageBuilder messageBuilder, PipeWriter writer, CancellationToken token) { if (transaction.State == TransactionState.Idle) { throw new PgErrorException(PgErrorCodes.NoActiveSqlTransaction, "Describe message was received when no transaction is taking place."); } if (!string.IsNullOrEmpty(ObjectName)) { throw new PgErrorException(PgErrorCodes.FeatureNotSupported, "Describe: Named statements/portals are not supported."); } var(schema, parameterDataTypes) = await transaction.Describe(); if (PgObjectType == PgObjectType.PreparedStatement) { await writer.WriteAsync(messageBuilder.ParameterDescription(parameterDataTypes), token); } var response = schema.Count == 0 ? messageBuilder.NoData() : messageBuilder.RowDescription(schema); await writer.WriteAsync(response, token); }