summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/get_database_version_command.cpp
diff options
context:
space:
mode:
authorBilly Donahue <billy.donahue@mongodb.com>2018-04-19 17:08:44 -0400
committerBilly Donahue <billy.donahue@mongodb.com>2018-04-19 17:10:10 -0400
commitffc12520c4ffbe816f7068637869bfca8761691c (patch)
tree68e6aa78c797fe67c2927572c9cca61623760a56 /src/mongo/db/s/get_database_version_command.cpp
parent2c8fe56c6501035063871930eda192bb78928c74 (diff)
downloadmongo-ffc12520c4ffbe816f7068637869bfca8761691c.tar.gz
SERVER-34214 getDatabaseVersion as TypedCommand
Diffstat (limited to 'src/mongo/db/s/get_database_version_command.cpp')
-rw-r--r--src/mongo/db/s/get_database_version_command.cpp92
1 files changed, 48 insertions, 44 deletions
diff --git a/src/mongo/db/s/get_database_version_command.cpp b/src/mongo/db/s/get_database_version_command.cpp
index c4aa90741f9..dd454c947c4 100644
--- a/src/mongo/db/s/get_database_version_command.cpp
+++ b/src/mongo/db/s/get_database_version_command.cpp
@@ -44,64 +44,68 @@
namespace mongo {
namespace {
-class GetDatabaseVersion : public BasicCommand {
+class GetDatabaseVersionCmd final : public TypedCommand<GetDatabaseVersionCmd> {
public:
- GetDatabaseVersion() : BasicCommand("getDatabaseVersion") {}
+ using Request = GetDatabaseVersion;
- std::string help() const override {
- return " example: { getDatabaseVersion : 'foo' } ";
- }
+ class Invocation final : public MinimalInvocationBase {
+ public:
+ using MinimalInvocationBase::MinimalInvocationBase;
- bool supportsWriteConcern(const BSONObj& cmd) const override {
- return false;
- }
+ private:
+ bool supportsWriteConcern() const override {
+ return false;
+ }
- AllowedOnSecondary secondaryAllowed(ServiceContext*) const override {
- return AllowedOnSecondary::kAlways;
- }
+ AllowedOnSecondary secondaryAllowed(ServiceContext* srvCtx) const override {
+ return definition()->secondaryAllowed(srvCtx);
+ }
- bool adminOnly() const override {
- return true;
- }
+ // The command parameter happens to be string so it's historically been interpreted
+ // by parseNs as a collection. Continuing to do so here for unexamined compatibility.
+ NamespaceString ns() const override {
+ return NamespaceString(request().getDbName(), _targetDb());
+ }
- Status checkAuthForCommand(Client* client,
- const std::string& dbname,
- const BSONObj& cmdObj) const override {
- if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource(
- ResourcePattern::forDatabaseName(cmdObj.firstElement().str()),
- ActionType::getDatabaseVersion)) {
- return Status(ErrorCodes::Unauthorized, "Unauthorized");
+ void doCheckAuthorization(OperationContext* opCtx) const override {
+ uassert(ErrorCodes::Unauthorized,
+ "Unauthorized",
+ AuthorizationSession::get(opCtx->getClient())
+ ->isAuthorizedForActionsOnResource(
+ ResourcePattern::forDatabaseName(_targetDb()),
+ ActionType::getDatabaseVersion));
}
- return Status::OK();
- }
- bool run(OperationContext* opCtx,
- const std::string& dbname_unused,
- const BSONObj& cmdObj,
- BSONObjBuilder& result) override {
- uassert(ErrorCodes::IllegalOperation,
- str::stream() << getName() << " can only be run on shard servers",
- serverGlobalParams.clusterRole == ClusterRole::ShardServer);
-
- const auto request = GetDatabaseVersionRequest::parse(
- IDLParserErrorContext("getDatabaseVersion command"), cmdObj);
-
- AutoGetDb autoDb(opCtx, request.getDatabaseVersion(), MODE_IS);
- if (!autoDb.getDb()) {
- result.append("dbVersion", BSONObj());
- return true;
+ void run(OperationContext* opCtx, CommandReplyBuilder* result) override {
+ uassert(ErrorCodes::IllegalOperation,
+ str::stream() << definition()->getName() << " can only be run on shard servers",
+ serverGlobalParams.clusterRole == ClusterRole::ShardServer);
+ BSONObj versionObj;
+ AutoGetDb autoDb(opCtx, _targetDb(), MODE_IS);
+ if (auto db = autoDb.getDb()) {
+ if (auto dbVersion = DatabaseShardingState::get(db).getDbVersion(opCtx)) {
+ versionObj = dbVersion->toBSON();
+ }
+ }
+ result->append("dbVersion", versionObj);
}
- auto const dbVersion = DatabaseShardingState::get(autoDb.getDb()).getDbVersion(opCtx);
- if (dbVersion) {
- result.append("dbVersion", dbVersion->toBSON());
- } else {
- result.append("dbVersion", BSONObj());
+ StringData _targetDb() const {
+ return request().getCommandParameter();
}
+ };
- return true;
+ std::string help() const override {
+ return " example: { getDatabaseVersion : 'foo' } ";
+ }
+
+ AllowedOnSecondary secondaryAllowed(ServiceContext*) const override {
+ return AllowedOnSecondary::kAlways;
}
+ bool adminOnly() const override {
+ return true;
+ }
} getDatabaseVersionCmd;
} // namespace