read_preference.js
3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
"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;