summaryrefslogtreecommitdiffstats
path: root/node_modules/mongodb/lib/operations/command.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/mongodb/lib/operations/command.js')
-rw-r--r--node_modules/mongodb/lib/operations/command.js119
1 files changed, 119 insertions, 0 deletions
diff --git a/node_modules/mongodb/lib/operations/command.js b/node_modules/mongodb/lib/operations/command.js
new file mode 100644
index 0000000..fd18a54
--- /dev/null
+++ b/node_modules/mongodb/lib/operations/command.js
@@ -0,0 +1,119 @@
+'use strict';
+
+const Aspect = require('./operation').Aspect;
+const OperationBase = require('./operation').OperationBase;
+const applyWriteConcern = require('../utils').applyWriteConcern;
+const debugOptions = require('../utils').debugOptions;
+const handleCallback = require('../utils').handleCallback;
+const MongoError = require('../core').MongoError;
+const ReadPreference = require('../core').ReadPreference;
+const MongoDBNamespace = require('../utils').MongoDBNamespace;
+
+const debugFields = [
+ 'authSource',
+ 'w',
+ 'wtimeout',
+ 'j',
+ 'native_parser',
+ 'forceServerObjectId',
+ 'serializeFunctions',
+ 'raw',
+ 'promoteLongs',
+ 'promoteValues',
+ 'promoteBuffers',
+ 'bufferMaxEntries',
+ 'numberOfRetries',
+ 'retryMiliSeconds',
+ 'readPreference',
+ 'pkFactory',
+ 'parentDb',
+ 'promiseLibrary',
+ 'noListener'
+];
+
+class CommandOperation extends OperationBase {
+ constructor(db, options, collection, command) {
+ super(options);
+
+ if (!this.hasAspect(Aspect.WRITE_OPERATION)) {
+ if (collection != null) {
+ this.options.readPreference = ReadPreference.resolve(collection, options);
+ } else {
+ this.options.readPreference = ReadPreference.resolve(db, options);
+ }
+ } else {
+ if (collection != null) {
+ applyWriteConcern(this.options, { db, coll: collection }, this.options);
+ } else {
+ applyWriteConcern(this.options, { db }, this.options);
+ }
+ this.options.readPreference = ReadPreference.primary;
+ }
+
+ this.db = db;
+
+ if (command != null) {
+ this.command = command;
+ }
+
+ if (collection != null) {
+ this.collection = collection;
+ }
+ }
+
+ _buildCommand() {
+ if (this.command != null) {
+ return this.command;
+ }
+ }
+
+ execute(callback) {
+ const db = this.db;
+ const options = Object.assign({}, this.options);
+
+ // Did the user destroy the topology
+ if (db.serverConfig && db.serverConfig.isDestroyed()) {
+ return callback(new MongoError('topology was destroyed'));
+ }
+
+ let command;
+ try {
+ command = this._buildCommand();
+ } catch (e) {
+ return callback(e);
+ }
+
+ // Get the db name we are executing against
+ const dbName = options.dbName || options.authdb || db.databaseName;
+
+ // Convert the readPreference if its not a write
+ if (this.hasAspect(Aspect.WRITE_OPERATION)) {
+ if (options.writeConcern && (!options.session || !options.session.inTransaction())) {
+ command.writeConcern = options.writeConcern;
+ }
+ }
+
+ // Debug information
+ if (db.s.logger.isDebug()) {
+ db.s.logger.debug(
+ `executing command ${JSON.stringify(
+ command
+ )} against ${dbName}.$cmd with options [${JSON.stringify(
+ debugOptions(debugFields, options)
+ )}]`
+ );
+ }
+
+ const namespace =
+ this.namespace != null ? this.namespace : new MongoDBNamespace(dbName, '$cmd');
+
+ // Execute command
+ db.s.topology.command(namespace, command, options, (err, result) => {
+ if (err) return handleCallback(callback, err);
+ if (options.full) return handleCallback(callback, null, result);
+ handleCallback(callback, null, result.result);
+ });
+ }
+}
+
+module.exports = CommandOperation;