diff options
author | Billy Donahue <billy.donahue@mongodb.com> | 2018-04-19 17:08:44 -0400 |
---|---|---|
committer | Billy Donahue <billy.donahue@mongodb.com> | 2018-04-19 17:10:10 -0400 |
commit | ffc12520c4ffbe816f7068637869bfca8761691c (patch) | |
tree | 68e6aa78c797fe67c2927572c9cca61623760a56 /src/mongo/db/s/get_database_version_command.cpp | |
parent | 2c8fe56c6501035063871930eda192bb78928c74 (diff) | |
download | mongo-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.cpp | 92 |
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 |