in src/Commands/Postgres/Database/DatabaseQueryCommand.cs [15:77]
public sealed class DatabaseQueryCommand(ILogger<DatabaseQueryCommand> logger) : BaseDatabaseCommand<DatabaseQueryArguments>(logger)
{
private readonly Option<string> _queryOption = ArgumentDefinitions.Postgres.Query.ToOption();
protected override string GetCommandName() => "query";
protected override string GetCommandDescription() => "Executes a query on the PostgreSQL database.";
protected override void RegisterOptions(Command command)
{
base.RegisterOptions(command);
command.AddOption(_queryOption);
}
protected override void RegisterArguments()
{
base.RegisterArguments();
AddArgument(CreateQueryArgument());
}
protected override DatabaseQueryArguments BindArguments(ParseResult parseResult)
{
var args = base.BindArguments(parseResult);
args.Query = parseResult.GetValueForOption(_queryOption);
return args;
}
[McpServerTool(Destructive = false, ReadOnly = true)]
public override async Task<CommandResponse> ExecuteAsync(CommandContext context, ParseResult parseResult)
{
try
{
var args = BindArguments(parseResult);
if (!await ProcessArguments(context, args))
{
return context.Response;
}
IPostgresService pgService = context.GetService<IPostgresService>() ?? throw new InvalidOperationException("PostgreSQL service is not available.");
List<string> queryResult = await pgService.ExecuteQueryAsync(args.Subscription!, args.ResourceGroup!, args.User!, args.Server!, args.Database!, args.Query!);
context.Response.Results = queryResult?.Count > 0 ?
ResponseResult.Create(
new DatabaseQueryCommandResult(queryResult),
PostgresJsonContext.Default.DatabaseQueryCommandResult) :
null;
}
catch (Exception ex)
{
_logger.LogError(ex, "An exception occurred while executing the query.");
HandleException(context.Response, ex);
}
return context.Response;
}
private static ArgumentBuilder<DatabaseQueryArguments> CreateQueryArgument() =>
ArgumentBuilder<DatabaseQueryArguments>
.Create(ArgumentDefinitions.Postgres.Query.Name, ArgumentDefinitions.Postgres.Query.Description)
.WithValueAccessor(args => args.Query ?? string.Empty)
.WithIsRequired(true);
internal record DatabaseQueryCommandResult(List<string> QueryResult);
}