Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }