"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;