Skip to content

Commit

Permalink
Unified command handling #1041, #1042
Browse files Browse the repository at this point in the history
  • Loading branch information
christkv committed Jul 30, 2013
1 parent ceb102d commit 7c5c55b
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 137 deletions.
109 changes: 40 additions & 69 deletions lib/mongodb/collection.js
Original file line number Diff line number Diff line change
Expand Up @@ -229,35 +229,30 @@ Collection.prototype.remove = function remove(selector, options, callback) {
* @return {null}
* @api public
*/
Collection.prototype.rename = function rename (newName, options, callback) {
Collection.prototype.rename = function rename(newName, options, callback) {
var self = this;

if(typeof options == 'function') {
callback = options;
options = {}
}

// Ensure the new name is valid
checkCollectionName(newName);

// Execute the command, return the new renamed collection if successful
self.db._executeQueryCommand(DbCommand.createRenameCollectionCommand(self.db, self.collectionName, newName, options), function(err, result) {
if(err == null && result.documents[0].ok == 1) {
if(callback != null) {
// Set current object to point to the new name
self.db._executeQueryCommand(DbCommand.createRenameCollectionCommand(self.db, self.collectionName, newName, options)
, utils.handleSingleCommandResultReturn(true, false, function(err, result) {
if(err) return callback(err, null)
try {
if(options.new_collection)
return callback(null, new Collection(self.db, newName, self.db.pkFactory));
self.collectionName = newName;
// Return the current collection
callback(null, self);
}
} else if(result.documents[0].errmsg != null) {
if(null != callback) {
if (null == err) {
err = utils.toError(result.documents[0]);
}
} catch(err) {
callback(err, null);
}
}
});
};
}));
}

/**
* @ignore
Expand Down Expand Up @@ -398,9 +393,9 @@ Collection.prototype.save = function save(doc, options, callback) {
this.update({ _id: id }, doc, commandOptions, callback);
} else {
this.insert(doc, commandOptions, callback && function (err, docs) {
if (err) return callback(err, null);
if(err) return callback(err, null);

if (Array.isArray(docs)) {
if(Array.isArray(docs)) {
callback(err, docs[0]);
} else {
callback(err, docs);
Expand Down Expand Up @@ -538,16 +533,13 @@ Collection.prototype.distinct = function distinct(key, query, options, callback)

// Set read preference if we set one
var readPreference = options['readPreference'] ? options['readPreference'] : false;
// Create the command
var cmd = DbCommand.createDbSlaveOkCommand(this.db, mapCommandHash);

this.db._executeQueryCommand(cmd, {read:readPreference}, function (err, result) {
if(err)
return callback(err);
if(result.documents[0].ok != 1)
return callback(new Error(result.documents[0].errmsg));
callback(null, result.documents[0].values);
});
// Execute the command
this.db._executeQueryCommand(DbCommand.createDbSlaveOkCommand(this.db, mapCommandHash)
, {read:readPreference}
, utils.handleSingleCommandResultReturn(null, null, function(err, result) {
if(err) return callback(err, null);
callback(null, result.values);
}));
};

/**
Expand Down Expand Up @@ -665,22 +657,11 @@ Collection.prototype.findAndModify = function findAndModify (query, sort, doc, o
// Only run command and rely on getLastError command
var command = DbCommand.createDbCommand(this.db, queryObject, options)
// Execute command
this.db._executeQueryCommand(command, {read:false}, function(err, result) {
if(err != null) return callback(err);

result = result && result.documents;

if(result[0].errmsg != null && !result[0].errmsg.match(eErrorMessages)) {
return callback(utils.toError(result[0]), null, result[0]);
}

// If we have an error return it
if(result[0].lastErrorObject && result[0].lastErrorObject.err != null) {
return callback(utils.toError(result[0].lastErrorObject), null);
}

return callback(null, result[0].value, result[0]);
});
this.db._executeQueryCommand(command
, {read:false}, utils.handleSingleCommandResultReturn(null, null, function(err, result) {
if(err) return callback(err, null);
return callback(null, result.value, result[0]);
}));
}

/**
Expand Down Expand Up @@ -1087,15 +1068,10 @@ Collection.prototype.dropIndex = function dropIndex (name, callback) {
*/
Collection.prototype.dropAllIndexes = function dropIndexes (callback) {
this.db.dropIndex(this.collectionName, '*', function (err, result) {
if(err != null) {
callback(err, false);
} else if(result.documents[0].errmsg == null) {
callback(null, true);
} else {
callback(new Error(result.documents[0].errmsg), false);
}
if(err) return callback(err, false);
callback(null, true);
});
};
}

/**
* Drops all indexes from this collection.
Expand Down Expand Up @@ -1189,12 +1165,12 @@ Collection.prototype.mapReduce = function mapReduce (map, reduce, options, callb
var cmd = DbCommand.createDbCommand(this.db, mapCommandHash);

this.db._executeQueryCommand(cmd, {read:readPreference}, function (err, result) {
if (err) {
return callback(err);
}
if(err) return callback(err);
if(!result || !result.documents || result.documents.length == 0)
return callback(Error("command failed to return results"), null)

//
if (1 != result.documents[0].ok || result.documents[0].err || result.documents[0].errmsg) {
// Check if we have an error
if(1 != result.documents[0].ok || result.documents[0].err || result.documents[0].errmsg) {
return callback(utils.toError(result.documents[0]));
}

Expand Down Expand Up @@ -1368,18 +1344,13 @@ Collection.prototype.group = function group(keys, condition, initial, reduce, fi
var cmd = DbCommand.createDbSlaveOkCommand(this.db, selector);
// Set read preference if we set one
var readPreference = _getReadConcern(this, options);

this.db._executeQueryCommand(cmd, {read:readPreference}, function (err, result) {
if(err != null) return callback(err);

var document = result.documents[0];
if (null == document.retval) {
return callback(new Error("group command failed: " + document.errmsg));
}

callback(null, document.retval);
});

// Execute the command
this.db._executeQueryCommand(cmd
, {read:readPreference}
, utils.handleSingleCommandResultReturn(null, null, function(err, result) {
if(err) return callback(err, null);
callback(null, result.retval);
}));
} else {
// Create execution scope
var scope = reduce != null && reduce instanceof Code
Expand Down
10 changes: 8 additions & 2 deletions lib/mongodb/cursor.js
Original file line number Diff line number Diff line change
Expand Up @@ -626,8 +626,8 @@ Cursor.prototype.nextObject = function(options, callback) {
self.state = Cursor.OPEN;
if(err != null && result == null) return callback(utils.toError(err), null);

if(err == null && (result == null || result.documents == null)) {
return self.close(function() {callback(null, null);});
if(err == null && (result == null || result.documents == null || !Array.isArray(result.documents))) {
return self.close(function() {callback(new Error("command failed to return results"), null);});
}

if(err == null && result && result.documents[0] && result.documents[0]['$err']) {
Expand Down Expand Up @@ -738,6 +738,12 @@ var getMore = function(self, options, callback) {
return callback(utils.toError(err), null);
}

// Ensure we get a valid result
if(!result || !result.documents) {
self.state = Cursor.CLOSED;
return callback(utils.toError("command failed to return results"), null)
}

// If the QueryFailure flag is set
if((result.responseFlag & (1 << 1)) != 0) {
self.state = Cursor.CLOSED;
Expand Down
91 changes: 27 additions & 64 deletions lib/mongodb/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -598,12 +598,8 @@ Db.prototype.logout = function(options, callback) {
// Remove the db from auths
self.serverConfig.auth.remove(self.databaseName);

// Handle any errors
if(err == null && result.documents[0].ok == 1) {
internalCallback(null, true);
} else {
err != null ? internalCallback(err, false) : internalCallback(new Error(result.documents[0].errmsg), false);
}
// Handle error result
utils.handleSingleCommandResultReturn(true, false, internalCallback)(err, result);
}
});
}
Expand Down Expand Up @@ -856,21 +852,17 @@ Db.prototype.createCollection = function(collectionName, options, callback) {
}

// Create a new collection and return it
self._executeQueryCommand(DbCommand.createCreateCollectionCommand(self, collectionName, options), {read:false, safe:safe}, function(err, result) {
var document = result.documents[0];
// If we have no error let's return the collection
if(err == null && document.ok == 1) {
self._executeQueryCommand(DbCommand.createCreateCollectionCommand(self, collectionName, options)
, {read:false, safe:safe}
, utils.handleSingleCommandResultReturn(null, null, function(err, result) {
if(err) return callback(err, null);
// Create collection and return
try {
var collection = new Collection(self, collectionName, self.pkFactory, options);
return callback(null, new Collection(self, collectionName, self.pkFactory, options));
} catch(err) {
return callback(err, null);
}
return callback(null, collection);
} else {
if (null == err) err = utils.toError(document);
callback(err, null);
}
});
}));
});
};

Expand Down Expand Up @@ -933,14 +925,9 @@ Db.prototype.dropCollection = function(collectionName, callback) {
callback || (callback = function(){});

// Drop the collection
this._executeQueryCommand(DbCommand.createDropCollectionCommand(this, collectionName), function(err, result) {
if(err == null && result.documents[0].ok == 1) {
return callback(null, true);
}

if(null == err) err = utils.toError(result.documents[0]);
callback(err, null);
});
this._executeQueryCommand(DbCommand.createDropCollectionCommand(this, collectionName)
, utils.handleSingleCommandResultReturn(true, false, callback)
);
};

/**
Expand All @@ -964,16 +951,11 @@ Db.prototype.renameCollection = function(fromCollection, toCollection, options,
options = {}
}

callback || (callback = function(){});
// Execute the command, return the new renamed collection if successful
this._executeQueryCommand(DbCommand.createRenameCollectionCommand(this, fromCollection, toCollection, options), function(err, result) {
if(err == null && result.documents[0].ok == 1) {
return callback(null, new Collection(self, toCollection, self.pkFactory));
}
// Add return new collection
options.new_collection = true;

if(null == err) err = utils.toError(result.documents[0]);
callback(err, null);
});
// Execute using the collection method
this.collection(fromCollection).rename(toCollection, options, callback);
};

/**
Expand Down Expand Up @@ -1087,7 +1069,7 @@ Db.prototype.resetErrorHistory = function(options, callback) {
options = args.length ? args.shift() || {} : {};

this._executeQueryCommand(DbCommand.createResetErrorHistoryCommand(this), options, function(err, error) {
if(callback) callback(err, error.documents);
if(callback) callback(err, error && error.documents);
});
};

Expand Down Expand Up @@ -1302,9 +1284,9 @@ Db.prototype.cursorInfo = function(options, callback) {
callback = args.pop();
options = args.length ? args.shift() || {} : {};

this._executeQueryCommand(DbCommand.createDbSlaveOkCommand(this, {'cursorInfo':1}), options, function(err, result) {
if(callback) callback(err, result.documents[0]);
});
this._executeQueryCommand(DbCommand.createDbSlaveOkCommand(this, {'cursorInfo':1})
, options
, utils.handleSingleCommandResultReturn(null, null, callback));
};

/**
Expand All @@ -1317,9 +1299,8 @@ Db.prototype.cursorInfo = function(options, callback) {
* @api public
*/
Db.prototype.dropIndex = function(collectionName, indexName, callback) {
this._executeQueryCommand(DbCommand.createDropIndexCommand(this, collectionName, indexName), function(err, result, conn) {
if(callback) callback(err, result);
});
this._executeQueryCommand(DbCommand.createDropIndexCommand(this, collectionName, indexName)
, utils.handleSingleCommandResultReturn(null, null, callback));
};

/**
Expand All @@ -1331,15 +1312,8 @@ Db.prototype.dropIndex = function(collectionName, indexName, callback) {
* @api public
**/
Db.prototype.reIndex = function(collectionName, callback) {
this._executeQueryCommand(DbCommand.createReIndexCommand(this, collectionName), function(err, result) {
if(err != null) {
callback(err, false);
} else if(result.documents[0].errmsg == null) {
callback(null, true);
} else {
callback(new Error(result.documents[0].errmsg), false);
}
});
this._executeQueryCommand(DbCommand.createReIndexCommand(this, collectionName)
, utils.handleSingleCommandResultReturn(true, false, callback));
};

/**
Expand Down Expand Up @@ -1409,20 +1383,9 @@ Db.prototype.indexInformation = function(collectionName, options, callback) {
* @api public
*/
Db.prototype.dropDatabase = function(callback) {
var self = this;

this._executeQueryCommand(DbCommand.createDropDatabaseCommand(this), function(err, result) {
if(err == null && result.documents[0].ok == 1) {
callback(null, true);
} else {
if(err) {
callback(err, false);
} else {
callback(utils.toError(result.documents[0]), false);
}
}
});
};
this._executeQueryCommand(DbCommand.createDropDatabaseCommand(this)
, utils.handleSingleCommandResultReturn(true, false, callback));
}

/**
* Get all the db statistics.
Expand Down
23 changes: 22 additions & 1 deletion lib/mongodb/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ exports.isRegExp = function (arg) {
* @ignore
* @api private
*/
exports.toError = function(error) {
var toError = function(error) {
if (error instanceof Error) return error;

var msg = error.err || error.errmsg || error;
Expand All @@ -119,6 +119,7 @@ exports.toError = function(error) {

return e;
}
exports.toError = toError;

/**
* Convert a single level object to an array
Expand All @@ -135,3 +136,23 @@ exports.objectToArray = function(object) {
return list;
}

/**
* Handle single command document return
* @ignore
* @api private
*/
exports.handleSingleCommandResultReturn = function(override_value_true, override_value_false, callback) {
return function(err, result, connection) {
if(err) return callback(err, null);
if(!result || !result.documents || result.documents.length == 0)
if(callback) return callback(toError("command failed to return results"), null)
if(result.documents[0].ok == 1) {
if(override_value_true) return callback(null, override_value_true)
if(callback) return callback(null, result.documents[0]);
}

// Return the error from the document
if(callback) return callback(toError(result.documents[0]), override_value_false);
}
}

Loading

0 comments on commit 7c5c55b

Please sign in to comment.