| 632 | } |
| 633 | |
| 634 | Status Execute([[maybe_unused]] engine::Context &ctx, Server *srv, Connection *conn, std::string *output) override { |
| 635 | if (subcommand_ == "list") { |
| 636 | *output = conn->VerbatimString("txt", srv->GetClientsStr()); |
| 637 | return Status::OK(); |
| 638 | } else if (subcommand_ == "info") { |
| 639 | *output = conn->VerbatimString("txt", conn->ToString()); |
| 640 | return Status::OK(); |
| 641 | } else if (subcommand_ == "setname") { |
| 642 | conn->SetName(conn_name_); |
| 643 | *output = redis::RESP_OK; |
| 644 | return Status::OK(); |
| 645 | } else if (subcommand_ == "getname") { |
| 646 | std::string name = conn->GetName(); |
| 647 | *output = name == "" ? conn->NilString() : redis::BulkString(name); |
| 648 | return Status::OK(); |
| 649 | } else if (subcommand_ == "id") { |
| 650 | *output = redis::Integer(conn->GetID()); |
| 651 | return Status::OK(); |
| 652 | } else if (subcommand_ == "kill") { |
| 653 | int64_t killed = 0; |
| 654 | srv->KillClient(&killed, addr_, id_, kill_type_, skipme_, conn); |
| 655 | if (new_format_) { |
| 656 | *output = redis::Integer(killed); |
| 657 | } else { |
| 658 | if (killed == 0) |
| 659 | return {Status::RedisExecErr, "No such client"}; |
| 660 | else |
| 661 | *output = redis::RESP_OK; |
| 662 | } |
| 663 | return Status::OK(); |
| 664 | } else if (subcommand_ == "reply") { |
| 665 | conn->SetReplyMode(reply_mode_); |
| 666 | if (reply_mode_ != redis::Connection::ReplyMode::SKIP) { |
| 667 | *output = redis::RESP_OK; |
| 668 | } |
| 669 | return Status::OK(); |
| 670 | } else if (subcommand_ == "pause") { |
| 671 | if (!conn->IsAdmin()) { |
| 672 | return {Status::RedisExecErr, errAdminPermissionRequired}; |
| 673 | } |
| 674 | uint64_t now_ms = util::GetTimeStampMS(); |
| 675 | srv->PauseConns(now_ms + pause_timeout_ms_, pause_mode_); |
| 676 | WARN("CLIENT PAUSE executed, timeout={}ms, mode={}, addr: {}", pause_timeout_ms_, |
| 677 | pause_mode_ == PauseMode::kWrite ? "write" : "all", conn->GetAddr()); |
| 678 | *output = redis::RESP_OK; |
| 679 | return Status::OK(); |
| 680 | } else if (subcommand_ == "unpause") { |
| 681 | if (!conn->IsAdmin()) { |
| 682 | return {Status::RedisExecErr, errAdminPermissionRequired}; |
| 683 | } |
| 684 | srv->UnpauseConns(); |
| 685 | *output = redis::RESP_OK; |
| 686 | return Status::OK(); |
| 687 | } else if (subcommand_ == "setinfo") { |
| 688 | if (setinfo_lib_name_) { |
| 689 | conn->SetLibName(*setinfo_lib_name_); |
| 690 | } |
| 691 | if (setinfo_lib_ver_) { |
nothing calls this directly
no test coverage detected