summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mongo/scripting/mozjs/mongo.cpp39
-rw-r--r--src/mongo/scripting/mozjs/mongo.h3
-rw-r--r--src/mongo/shell/db.js3
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;