1763b2c844dc9dfec7a654e84c37d38b93ca397f
[aai/esr-gui.git] /
1 "use strict";
2
3 /**
4  * @fileOverview The **ReadPreference** class is a class that represents a MongoDB ReadPreference and is
5  * used to construct connections.
6  *
7  * @example
8  * var Db = require('mongodb').Db,
9  *   ReplSet = require('mongodb').ReplSet,
10  *   Server = require('mongodb').Server,
11  *   ReadPreference = require('mongodb').ReadPreference,
12  *   test = require('assert');
13  * // Connect using ReplSet
14  * var server = new Server('localhost', 27017);
15  * var db = new Db('test', new ReplSet([server]));
16  * db.open(function(err, db) {
17  *   test.equal(null, err);
18  *   // Perform a read
19  *   var cursor = db.collection('t').find({});
20  *   cursor.setReadPreference(ReadPreference.PRIMARY);
21  *   cursor.toArray(function(err, docs) {
22  *     test.equal(null, err);
23  *     db.close();
24  *   });
25  * });
26  */
27
28 /**
29  * Creates a new ReadPreference instance
30  *
31  * Read Preferences
32  *  - **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.).
33  *  - **ReadPreference.PRIMARY_PREFERRED**, Read from primary if available, otherwise a secondary.
34  *  - **ReadPreference.SECONDARY**, Read from secondary if available, otherwise error.
35  *  - **ReadPreference.SECONDARY_PREFERRED**, Read from a secondary if available, otherwise read from the primary.
36  *  - **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.
37  *
38  * @class
39  * @param {string} mode The ReadPreference mode as listed above.
40  * @param {array|object} tags An object representing read preference tags.
41  * @param {object} [options] Additional read preference options
42  * @param {number} [options.maxStalenessMS] Max Secondary Read Stalleness in Miliseconds
43  * @return {ReadPreference} a ReadPreference instance.
44  */
45 var ReadPreference = function(mode, tags, options) {
46   if(!(this instanceof ReadPreference)) {
47     return new ReadPreference(mode, tags, options);
48   }
49
50   this._type = 'ReadPreference';
51   this.mode = mode;
52   this.tags = tags;
53   this.options =  options;
54
55   // If no tags were passed in
56   if(tags && typeof tags == 'object' && !Array.isArray(tags)) {
57     if(tags.maxStalenessMS) {
58       this.options = tags;
59       this.tags = null;
60     }
61   }
62
63   // Add the maxStalenessMS value to the read Preference
64   if(this.options && this.options.maxStalenessMS) {
65     this.maxStalenessMS = this.options.maxStalenessMS;
66   }
67 }
68
69 /**
70  * Validate if a mode is legal
71  *
72  * @method
73  * @param {string} mode The string representing the read preference mode.
74  * @return {boolean}
75  */
76 ReadPreference.isValid = function(_mode) {
77   return (_mode == ReadPreference.PRIMARY || _mode == ReadPreference.PRIMARY_PREFERRED
78     || _mode == ReadPreference.SECONDARY || _mode == ReadPreference.SECONDARY_PREFERRED
79     || _mode == ReadPreference.NEAREST
80     || _mode == true || _mode == false || _mode == null);
81 }
82
83 /**
84  * Validate if a mode is legal
85  *
86  * @method
87  * @param {string} mode The string representing the read preference mode.
88  * @return {boolean}
89  */
90 ReadPreference.prototype.isValid = function(mode) {
91   var _mode = typeof mode == 'string' ? mode : this.mode;
92   return ReadPreference.isValid(_mode);
93 }
94
95 /**
96  * @ignore
97  */
98 ReadPreference.prototype.toObject = function() {
99   var object = {mode:this.mode};
100
101   if(this.tags != null) {
102     object['tags'] = this.tags;
103   }
104
105   if(this.maxStalenessMS) {
106     object['maxStalenessMS'] = this.maxStalenessMS;
107   }
108
109   return object;
110 }
111
112 /**
113  * @ignore
114  */
115 ReadPreference.prototype.toJSON = function() {
116   return this.toObject();
117 }
118
119 /**
120  * @ignore
121  */
122 ReadPreference.PRIMARY = 'primary';
123 ReadPreference.PRIMARY_PREFERRED = 'primaryPreferred';
124 ReadPreference.SECONDARY = 'secondary';
125 ReadPreference.SECONDARY_PREFERRED = 'secondaryPreferred';
126 ReadPreference.NEAREST = 'nearest'
127
128 /**
129  * @ignore
130  */
131 module.exports = ReadPreference;