diff options
-rw-r--r-- | src/mongo/scripting/mozjs/mongo.cpp | 39 | ||||
-rw-r--r-- | src/mongo/scripting/mozjs/mongo.h | 3 | ||||
-rw-r--r-- | src/mongo/shell/db.js | 3 |
3 files changed, 43 insertions, 2 deletions
diff --git a/src/mongo/scripting/mozjs/mongo.cpp b/src/mongo/scripting/mozjs/mongo.cpp index fe937e359dd..ca8c5a35f93 100644 --- a/src/mongo/scripting/mozjs/mongo.cpp +++ b/src/mongo/scripting/mozjs/mongo.cpp @@ -45,7 +45,7 @@ namespace mongo { namespace mozjs { -const JSFunctionSpec MongoBase::methods[13] = { +const JSFunctionSpec MongoBase::methods[] = { MONGO_ATTACH_JS_FUNCTION(auth), MONGO_ATTACH_JS_FUNCTION(copyDatabaseWithSCRAM), MONGO_ATTACH_JS_FUNCTION(cursorFromId), @@ -56,6 +56,7 @@ const JSFunctionSpec MongoBase::methods[13] = { MONGO_ATTACH_JS_FUNCTION(logout), MONGO_ATTACH_JS_FUNCTION(remove), MONGO_ATTACH_JS_FUNCTION(runCommand), + MONGO_ATTACH_JS_FUNCTION(runCommandWithMetadata), MONGO_ATTACH_JS_FUNCTION(setClientRPCProtocols), MONGO_ATTACH_JS_FUNCTION(update), JS_FS_END, @@ -119,6 +120,42 @@ void MongoBase::Functions::runCommand(JSContext* cx, JS::CallArgs args) { ValueReader(cx, args.rval()).fromBSON(cmdRes, false /* read only */); } +void MongoBase::Functions::runCommandWithMetadata(JSContext* cx, JS::CallArgs args) { + if (args.length() != 4) + uasserted(ErrorCodes::BadValue, "runCommandWithMetadata needs 4 args"); + + if (!args.get(0).isString()) + uasserted(ErrorCodes::BadValue, + "the database parameter to runCommandWithMetadata must be a string"); + + if (!args.get(1).isString()) + uasserted(ErrorCodes::BadValue, + "the commandName parameter to runCommandWithMetadata must be a string"); + + if (!args.get(2).isObject()) + uasserted(ErrorCodes::BadValue, + "the metadata argument to runCommandWithMetadata must be an object"); + + if (!args.get(3).isObject()) + uasserted(ErrorCodes::BadValue, + "the commandArgs argument to runCommandWithMetadata must be an object"); + + std::string database = ValueWriter(cx, args.get(0)).toString(); + std::string commandName = ValueWriter(cx, args.get(1)).toString(); + BSONObj metadata = ValueWriter(cx, args.get(2)).toBSON(); + BSONObj commandArgs = ValueWriter(cx, args.get(3)).toBSON(); + + auto conn = getConnection(args); + auto res = conn->runCommandWithMetadata(database, commandName, metadata, commandArgs); + + BSONObjBuilder mergedResultBob; + mergedResultBob.append("commandReply", res->getCommandReply()); + mergedResultBob.append("metadata", res->getMetadata()); + + auto mergedResult = mergedResultBob.done(); + ValueReader(cx, args.rval()).fromBSON(mergedResult, false); +} + void MongoBase::Functions::find(JSContext* cx, JS::CallArgs args) { auto scope = getScope(cx); diff --git a/src/mongo/scripting/mozjs/mongo.h b/src/mongo/scripting/mozjs/mongo.h index e31e52fd14c..33ca0502018 100644 --- a/src/mongo/scripting/mozjs/mongo.h +++ b/src/mongo/scripting/mozjs/mongo.h @@ -54,11 +54,12 @@ struct MongoBase : public BaseInfo { MONGO_DEFINE_JS_FUNCTION(logout); MONGO_DEFINE_JS_FUNCTION(remove); MONGO_DEFINE_JS_FUNCTION(runCommand); + MONGO_DEFINE_JS_FUNCTION(runCommandWithMetadata); MONGO_DEFINE_JS_FUNCTION(setClientRPCProtocols); MONGO_DEFINE_JS_FUNCTION(update); }; - static const JSFunctionSpec methods[13]; + static const JSFunctionSpec methods[14]; static const char* const className; static const unsigned classFlags = JSCLASS_HAS_PRIVATE; diff --git a/src/mongo/shell/db.js b/src/mongo/shell/db.js index 2cecf28e579..9be0f76b72d 100644 --- a/src/mongo/shell/db.js +++ b/src/mongo/shell/db.js @@ -128,6 +128,9 @@ DB.prototype.commandHelp = function( name ){ return res; }; +DB.prototype.runCommandWithMetadata = function(commandName, commandArgs, metadata) { + return this.getMongo().runCommandWithMetadata(this._name, commandName, metadata, commandArgs); +}; DB.prototype._dbCommand = DB.prototype.runCommand; DB.prototype._dbReadCommand = DB.prototype.runReadCommand; |