StatusWith<long long> CatalogManagerReplicaSet::_runCountCommandOnConfig(const HostAndPort& target, const NamespaceString& ns, BSONObj query) { BSONObjBuilder countBuilder; countBuilder.append("count", ns.coll()); countBuilder.append("query", query); _appendReadConcern(&countBuilder); auto responseStatus = grid.shardRegistry()->runCommandOnConfig(target, ns.db().toString(), countBuilder.done()); if (!responseStatus.isOK()) { return responseStatus.getStatus(); } auto responseObj = responseStatus.getValue(); Status status = Command::getStatusFromCommandResult(responseObj); if (!status.isOK()) { return status; } long long result; status = bsonExtractIntegerField(responseObj, "n", &result); if (!status.isOK()) { return status; } return result; }
bool CatalogManagerReplicaSet::runReadCommand(OperationContext* txn, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { BSONObjBuilder cmdBuilder; cmdBuilder.appendElements(cmdObj); _appendReadConcern(&cmdBuilder); return _runReadCommand(txn, dbname, cmdBuilder.done(), kConfigReadSelector, result); }
StatusWith<long long> CatalogManagerReplicaSet::_runCountCommandOnConfig(OperationContext* txn, const NamespaceString& ns, BSONObj query) { BSONObjBuilder countBuilder; countBuilder.append("count", ns.coll()); countBuilder.append("query", query); _appendReadConcern(&countBuilder); BSONObjBuilder resultBuilder; if (!_runReadCommand( txn, ns.db().toString(), countBuilder.done(), kConfigReadSelector, &resultBuilder)) { return Command::getStatusFromCommandResult(resultBuilder.obj()); } auto responseObj = resultBuilder.obj(); long long result; auto status = bsonExtractIntegerField(responseObj, "n", &result); if (!status.isOK()) { return status; } return result; }