|
"use strict";
|
|
|
|
/**
|
|
* @fileOverview The **ReadPreference** class is a class that represents a MongoDB ReadPreference and is
|
|
* used to construct connections.
|
|
*
|
|
* @example
|
|
* var Db = require('mongodb').Db,
|
|
* ReplSet = require('mongodb').ReplSet,
|
|
* Server = require('mongodb').Server,
|
|
* ReadPreference = require('mongodb').ReadPreference,
|
|
* test = require('assert');
|
|
* // Connect using ReplSet
|
|
* var server = new Server('localhost', 27017);
|
|
* var db = new Db('test', new ReplSet([server]));
|
|
* db.open(function(err, db) {
|
|
* test.equal(null, err);
|
|
* // Perform a read
|
|
* var cursor = db.collection('t').find({});
|
|
* cursor.setReadPreference(ReadPreference.PRIMARY);
|
|
* cursor.toArray(function(err, docs) {
|
|
* test.equal(null, err);
|
|
* db.close();
|
|
* });
|
|
* });
|
|
*/
|
|
|
|
/**
|
|
* Creates a new ReadPreference instance
|
|
*
|
|
* Read Preferences
|
|
* - **ReadPreference.PRIMARY**, Read from primary only. All operations produce an error (throw an exception where applicable) if primary is unavailable. Cannot be combined with tags (This is the default.).
|
|
* - **ReadPreference.PRIMARY_PREFERRED**, Read from primary if available, otherwise a secondary.
|
|
* - **ReadPreference.SECONDARY**, Read from secondary if available, otherwise error.
|
|
* - **ReadPreference.SECONDARY_PREFERRED**, Read from a secondary if available, otherwise read from the primary.
|
|
* - **ReadPreference.NEAREST**, All modes read from among the nearest candidates, but unlike other modes, NEAREST will include both the primary and all secondaries in the random selection.
|
|
*
|
|
* @class
|
|
* @param {string} mode The ReadPreference mode as listed above.
|
|
* @param {array|object} tags An object representing read preference tags.
|
|
* @param {object} [options] Additional read preference options
|
|
* @param {number} [options.maxStalenessSeconds] Max Secondary Read Staleness in Seconds
|
|
* @return {ReadPreference} a ReadPreference instance.
|
|
*/
|
|
var ReadPreference = function(mode, tags, options) {
|
|
if(!(this instanceof ReadPreference)) {
|
|
return new ReadPreference(mode, tags, options);
|
|
}
|
|
|
|
this._type = 'ReadPreference';
|
|
this.mode = mode;
|
|
this.tags = tags;
|
|
this.options = options;
|
|
|
|
// If no tags were passed in
|
|
if(tags && typeof tags == 'object' && !Array.isArray(tags)) {
|
|
if(tags.maxStalenessSeconds) {
|
|
this.options = tags;
|
|
this.tags = null;
|
|
}
|
|
}
|
|
|
|
// Add the maxStalenessSeconds value to the read Preference
|
|
if(this.options && this.options.maxStalenessSeconds) {
|
|
this.maxStalenessSeconds = this.options.maxStalenessSeconds;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validate if a mode is legal
|
|
*
|
|
* @method
|
|
* @param {string} mode The string representing the read preference mode.
|
|
* @return {boolean}
|
|
*/
|
|
ReadPreference.isValid = function(_mode) {
|
|
return (_mode == ReadPreference.PRIMARY || _mode == ReadPreference.PRIMARY_PREFERRED
|
|
|| _mode == ReadPreference.SECONDARY || _mode == ReadPreference.SECONDARY_PREFERRED
|
|
|| _mode == ReadPreference.NEAREST
|
|
|| _mode == true || _mode == false || _mode == null);
|
|
}
|
|
|
|
/**
|
|
* Validate if a mode is legal
|
|
*
|
|
* @method
|
|
* @param {string} mode The string representing the read preference mode.
|
|
* @return {boolean}
|
|
*/
|
|
ReadPreference.prototype.isValid = function(mode) {
|
|
var _mode = typeof mode == 'string' ? mode : this.mode;
|
|
return ReadPreference.isValid(_mode);
|
|
}
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
ReadPreference.prototype.toObject = function() {
|
|
var object = {mode:this.mode};
|
|
|
|
if(this.tags != null) {
|
|
object['tags'] = this.tags;
|
|
}
|
|
|
|
if(this.maxStalenessSeconds) {
|
|
object['maxStalenessSeconds'] = this.maxStalenessSeconds;
|
|
}
|
|
|
|
return object;
|
|
}
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
ReadPreference.prototype.toJSON = function() {
|
|
return this.toObject();
|
|
}
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
ReadPreference.PRIMARY = 'primary';
|
|
ReadPreference.PRIMARY_PREFERRED = 'primaryPreferred';
|
|
ReadPreference.SECONDARY = 'secondary';
|
|
ReadPreference.SECONDARY_PREFERRED = 'secondaryPreferred';
|
|
ReadPreference.NEAREST = 'nearest'
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
module.exports = ReadPreference;
|