mongodb 2.1.0-alpha → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +574 -429
- package/Makefile +2 -5
- package/README.md +108 -15
- package/conf.json +17 -13
- package/index.js +13 -2
- package/lib/admin.js +113 -47
- package/lib/aggregation_cursor.js +56 -28
- package/lib/apm.js +608 -0
- package/lib/bulk/common.js +7 -7
- package/lib/bulk/ordered.js +56 -17
- package/lib/bulk/unordered.js +52 -14
- package/lib/collection.js +671 -212
- package/lib/command_cursor.js +60 -32
- package/lib/cursor.js +313 -115
- package/lib/db.js +264 -105
- package/lib/gridfs/chunk.js +26 -29
- package/lib/gridfs/grid_store.js +150 -64
- package/lib/gridfs-stream/download.js +310 -0
- package/lib/gridfs-stream/index.js +335 -0
- package/lib/gridfs-stream/upload.js +450 -0
- package/lib/metadata.js +64 -0
- package/lib/mongo_client.js +69 -39
- package/lib/mongos.js +65 -20
- package/lib/replset.js +69 -34
- package/lib/server.js +35 -1
- package/lib/topology_base.js +22 -10
- package/lib/url_parser.js +111 -13
- package/lib/utils.js +9 -8
- package/mongolabs.js +427 -0
- package/package.json +8 -6
- package/t.js +68 -51
- package/test.js +12 -0
- package/test_boot/boot.sh +3 -0
- package/test_boot/ca.pem +49 -0
- package/test_boot/client.pem +48 -0
- package/test_boot/client_password.pem +51 -0
- package/test_boot/connect.js +29 -0
- package/test_boot/data/WiredTiger +2 -0
- package/test_boot/data/WiredTiger.lock +1 -0
- package/test_boot/data/WiredTiger.turtle +6 -0
- package/test_boot/data/WiredTiger.wt +0 -0
- package/test_boot/data/WiredTigerLAS.wt +0 -0
- package/test_boot/data/_mdb_catalog.wt +0 -0
- package/test_boot/data/collection-0-757073248613337118.wt +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-44-37Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-45-15Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-46-31Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-47-25Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-49-07Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-50-41Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-50-53Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-52-31Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-54-53Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-55-09Z-00000 +0 -0
- package/test_boot/data/diagnostic.data/metrics.2015-10-07T14-55-38Z-00000 +0 -0
- package/test_boot/data/index-1-757073248613337118.wt +0 -0
- package/test_boot/data/mongod.lock +0 -0
- package/test_boot/data/sizeStorer.wt +0 -0
- package/test_boot/data/storage.bson +0 -0
- package/test_boot/server_password.pem +51 -0
- package/.travis.yml +0 -10
- package/t1.js +0 -59
- package/wercker.yml +0 -19
package/lib/replset.js
CHANGED
|
@@ -6,11 +6,14 @@ var EventEmitter = require('events').EventEmitter
|
|
|
6
6
|
, Server = require('./server')
|
|
7
7
|
, Mongos = require('./mongos')
|
|
8
8
|
, Cursor = require('./cursor')
|
|
9
|
+
, AggregationCursor = require('./aggregation_cursor')
|
|
10
|
+
, CommandCursor = require('./command_cursor')
|
|
9
11
|
, ReadPreference = require('./read_preference')
|
|
10
12
|
, MongoCR = require('mongodb-core').MongoCR
|
|
11
13
|
, MongoError = require('mongodb-core').MongoError
|
|
12
14
|
, ServerCapabilities = require('./topology_base').ServerCapabilities
|
|
13
15
|
, Store = require('./topology_base').Store
|
|
16
|
+
, Define = require('./metadata')
|
|
14
17
|
, CServer = require('mongodb-core').Server
|
|
15
18
|
, CReplSet = require('mongodb-core').ReplSet
|
|
16
19
|
, CoreReadPreference = require('mongodb-core').ReadPreference
|
|
@@ -19,7 +22,7 @@ var EventEmitter = require('events').EventEmitter
|
|
|
19
22
|
/**
|
|
20
23
|
* @fileOverview The **ReplSet** class is a class that represents a Replicaset topology and is
|
|
21
24
|
* used to construct connections.
|
|
22
|
-
*
|
|
25
|
+
*
|
|
23
26
|
* **ReplSet Should not be used, use MongoClient.connect**
|
|
24
27
|
* @example
|
|
25
28
|
* var Db = require('mongodb').Db,
|
|
@@ -44,20 +47,21 @@ var EventEmitter = require('events').EventEmitter
|
|
|
44
47
|
* @param {booelan} [options.ha=true] Turn on high availability monitoring.
|
|
45
48
|
* @param {number} [options.haInterval=5000] Time between each replicaset status check.
|
|
46
49
|
* @param {string} options.replicaSet The name of the replicaset to connect to.
|
|
47
|
-
* @param {number} [options.secondaryAcceptableLatencyMS=15] Sets the range of servers to pick when using NEAREST (lowest ping ms + the latency fence, ex: range of 1 to (1 + 15) ms)
|
|
50
|
+
* @param {number} [options.secondaryAcceptableLatencyMS=15] Sets the range of servers to pick when using NEAREST (lowest ping ms + the latency fence, ex: range of 1 to (1 + 15) ms)
|
|
48
51
|
* @param {boolean} [options.connectWithNoPrimary=false] Sets if the driver should connect even if no primary is available
|
|
49
52
|
* @param {number} [options.poolSize=5] Number of connections in the connection pool for each server instance, set to 5 as default for legacy reasons.
|
|
50
|
-
* @param {boolean} [options.ssl=false] Use ssl connection (needs to have a mongod server with ssl support)
|
|
53
|
+
* @param {boolean} [options.ssl=false] Use ssl connection (needs to have a mongod server with ssl support)
|
|
54
|
+
* @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function.
|
|
51
55
|
* @param {object} [options.sslValidate=true] Validate mongod server certificate against ca (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
52
56
|
* @param {array} [options.sslCA=null] Array of valid certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
53
57
|
* @param {(Buffer|string)} [options.sslCert=null] String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
54
58
|
* @param {(Buffer|string)} [options.sslKey=null] String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
55
59
|
* @param {(Buffer|string)} [options.sslPass=null] String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
56
|
-
* @param {object} [options.socketOptions=null] Socket options
|
|
57
|
-
* @param {boolean} [options.socketOptions.noDelay=true] TCP Socket NoDelay option.
|
|
58
|
-
* @param {number} [options.socketOptions.keepAlive=0] TCP KeepAlive on the socket with a X ms delay before start.
|
|
59
|
-
* @param {number} [options.socketOptions.connectTimeoutMS=
|
|
60
|
-
* @param {number} [options.socketOptions.socketTimeoutMS=0] TCP Socket timeout setting
|
|
60
|
+
* @param {object} [options.socketOptions=null] Socket options
|
|
61
|
+
* @param {boolean} [options.socketOptions.noDelay=true] TCP Socket NoDelay option.
|
|
62
|
+
* @param {number} [options.socketOptions.keepAlive=0] TCP KeepAlive on the socket with a X ms delay before start.
|
|
63
|
+
* @param {number} [options.socketOptions.connectTimeoutMS=10000] TCP Connection timeout setting
|
|
64
|
+
* @param {number} [options.socketOptions.socketTimeoutMS=0] TCP Socket timeout setting
|
|
61
65
|
* @fires ReplSet#connect
|
|
62
66
|
* @fires ReplSet#ha
|
|
63
67
|
* @fires ReplSet#joined
|
|
@@ -70,7 +74,7 @@ var EventEmitter = require('events').EventEmitter
|
|
|
70
74
|
* @fires ReplSet#parseError
|
|
71
75
|
* @return {ReplSet} a ReplSet instance.
|
|
72
76
|
*/
|
|
73
|
-
var ReplSet = function(servers, options) {
|
|
77
|
+
var ReplSet = function(servers, options) {
|
|
74
78
|
if(!(this instanceof ReplSet)) return new ReplSet(servers, options);
|
|
75
79
|
options = options || {};
|
|
76
80
|
var self = this;
|
|
@@ -78,7 +82,7 @@ var ReplSet = function(servers, options) {
|
|
|
78
82
|
// Ensure all the instances are Server
|
|
79
83
|
for(var i = 0; i < servers.length; i++) {
|
|
80
84
|
if(!(servers[i] instanceof Server)) {
|
|
81
|
-
throw
|
|
85
|
+
throw MongoError.create({message: "all seed list instances must be of the Server type", driver:true});
|
|
82
86
|
}
|
|
83
87
|
}
|
|
84
88
|
|
|
@@ -105,7 +109,7 @@ var ReplSet = function(servers, options) {
|
|
|
105
109
|
// Final options
|
|
106
110
|
var finalOptions = shallowClone(options);
|
|
107
111
|
|
|
108
|
-
// Default values
|
|
112
|
+
// Default values
|
|
109
113
|
finalOptions.size = typeof options.poolSize == 'number' ? options.poolSize : 5;
|
|
110
114
|
finalOptions.reconnect = typeof options.auto_reconnect == 'boolean' ? options.auto_reconnect : true;
|
|
111
115
|
finalOptions.emitError = typeof options.emitError == 'boolean' ? options.emitError : true;
|
|
@@ -120,11 +124,11 @@ var ReplSet = function(servers, options) {
|
|
|
120
124
|
this.connectTimeoutMS = options.socketOptions.connectTimeoutMS;
|
|
121
125
|
finalOptions.connectionTimeout = options.socketOptions.connectTimeoutMS;
|
|
122
126
|
}
|
|
123
|
-
|
|
127
|
+
|
|
124
128
|
if(options.socketOptions.socketTimeoutMS) {
|
|
125
129
|
finalOptions.socketTimeout = options.socketOptions.socketTimeoutMS;
|
|
126
130
|
}
|
|
127
|
-
}
|
|
131
|
+
}
|
|
128
132
|
|
|
129
133
|
// Get the name
|
|
130
134
|
var replicaSet = options.replicaSet || options.rs_name;
|
|
@@ -178,6 +182,7 @@ var ReplSet = function(servers, options) {
|
|
|
178
182
|
if(options.sslKey) finalOptions.key = options.sslKey;
|
|
179
183
|
if(options.sslCert) finalOptions.cert = options.sslCert;
|
|
180
184
|
if(options.sslPass) finalOptions.passphrase = options.sslPass;
|
|
185
|
+
if(options.checkServerIdentity) finalOptions.checkServerIdentity = options.checkServerIdentity;
|
|
181
186
|
|
|
182
187
|
// Create the ReplSet
|
|
183
188
|
var replset = new CReplSet(seedlist, finalOptions)
|
|
@@ -209,13 +214,13 @@ var ReplSet = function(servers, options) {
|
|
|
209
214
|
// Options
|
|
210
215
|
, options: options
|
|
211
216
|
}
|
|
212
|
-
|
|
217
|
+
|
|
213
218
|
// Debug
|
|
214
219
|
if(debug) {
|
|
215
220
|
// Last ismaster
|
|
216
221
|
Object.defineProperty(this, 'replset', {
|
|
217
222
|
enumerable:true, get: function() { return replset; }
|
|
218
|
-
});
|
|
223
|
+
});
|
|
219
224
|
}
|
|
220
225
|
|
|
221
226
|
// Last ismaster
|
|
@@ -224,9 +229,9 @@ var ReplSet = function(servers, options) {
|
|
|
224
229
|
});
|
|
225
230
|
|
|
226
231
|
// BSON property
|
|
227
|
-
Object.defineProperty(this, 'bson', {
|
|
228
|
-
enumerable: true, get: function() {
|
|
229
|
-
return replset.bson;
|
|
232
|
+
Object.defineProperty(this, 'bson', {
|
|
233
|
+
enumerable: true, get: function() {
|
|
234
|
+
return replset.bson;
|
|
230
235
|
}
|
|
231
236
|
});
|
|
232
237
|
|
|
@@ -240,6 +245,8 @@ var ReplSet = function(servers, options) {
|
|
|
240
245
|
*/
|
|
241
246
|
inherits(ReplSet, EventEmitter);
|
|
242
247
|
|
|
248
|
+
var define = ReplSet.define = new Define('ReplSet', ReplSet, false);
|
|
249
|
+
|
|
243
250
|
// Ensure the right read Preference object
|
|
244
251
|
var translateReadPreference = function(options) {
|
|
245
252
|
if(typeof options.readPreference == 'string') {
|
|
@@ -249,13 +256,15 @@ var translateReadPreference = function(options) {
|
|
|
249
256
|
, options.readPreference.tags);
|
|
250
257
|
}
|
|
251
258
|
|
|
252
|
-
return options;
|
|
259
|
+
return options;
|
|
253
260
|
}
|
|
254
261
|
|
|
255
262
|
ReplSet.prototype.parserType = function() {
|
|
256
263
|
return this.s.replset.parserType();
|
|
257
264
|
}
|
|
258
265
|
|
|
266
|
+
define.classMethod('parserType', {callback: false, promise:false, returns: [String]});
|
|
267
|
+
|
|
259
268
|
// Connect method
|
|
260
269
|
ReplSet.prototype.connect = function(db, _options, callback) {
|
|
261
270
|
var self = this;
|
|
@@ -304,12 +313,12 @@ ReplSet.prototype.connect = function(db, _options, callback) {
|
|
|
304
313
|
|
|
305
314
|
// Relay ha
|
|
306
315
|
var relayHa = function(t, state) {
|
|
307
|
-
self.emit('ha', t, state);
|
|
316
|
+
self.emit('ha', t, state);
|
|
308
317
|
|
|
309
318
|
if(t == 'start') {
|
|
310
|
-
self.emit('ha_connect', t, state);
|
|
319
|
+
self.emit('ha_connect', t, state);
|
|
311
320
|
} else if(t == 'end') {
|
|
312
|
-
self.emit('ha_ismaster', t, state);
|
|
321
|
+
self.emit('ha_ismaster', t, state);
|
|
313
322
|
}
|
|
314
323
|
}
|
|
315
324
|
|
|
@@ -318,24 +327,24 @@ ReplSet.prototype.connect = function(db, _options, callback) {
|
|
|
318
327
|
self.s.replset.on('left', relay('left'));
|
|
319
328
|
self.s.replset.on('ping', relay('ping'));
|
|
320
329
|
self.s.replset.on('ha', relayHa);
|
|
321
|
-
|
|
330
|
+
|
|
322
331
|
self.s.replset.on('fullsetup', function(topology) {
|
|
323
332
|
self.emit('fullsetup', null, self);
|
|
324
333
|
});
|
|
325
|
-
|
|
334
|
+
|
|
326
335
|
self.s.replset.on('all', function(topology) {
|
|
327
336
|
self.emit('all', null, self);
|
|
328
337
|
});
|
|
329
338
|
|
|
330
339
|
// Emit open event
|
|
331
|
-
self.emit('open', null, self);
|
|
340
|
+
self.emit('open', null, self);
|
|
332
341
|
|
|
333
342
|
// Return correctly
|
|
334
343
|
try {
|
|
335
344
|
callback(null, self);
|
|
336
|
-
} catch(err) {
|
|
345
|
+
} catch(err) {
|
|
337
346
|
process.nextTick(function() { throw err; })
|
|
338
|
-
}
|
|
347
|
+
}
|
|
339
348
|
}
|
|
340
349
|
|
|
341
350
|
// Error handler
|
|
@@ -352,12 +361,12 @@ ReplSet.prototype.connect = function(db, _options, callback) {
|
|
|
352
361
|
// Try to callback
|
|
353
362
|
try {
|
|
354
363
|
callback(err);
|
|
355
|
-
} catch(err) {
|
|
364
|
+
} catch(err) {
|
|
356
365
|
if(!self.s.replset.isConnected())
|
|
357
366
|
process.nextTick(function() { throw err; })
|
|
358
367
|
}
|
|
359
368
|
}
|
|
360
|
-
}
|
|
369
|
+
}
|
|
361
370
|
|
|
362
371
|
// Set up listeners
|
|
363
372
|
self.s.replset.once('timeout', connectErrorHandler('timeout'));
|
|
@@ -367,44 +376,62 @@ ReplSet.prototype.connect = function(db, _options, callback) {
|
|
|
367
376
|
|
|
368
377
|
// Start connection
|
|
369
378
|
self.s.replset.connect(_options);
|
|
370
|
-
}
|
|
379
|
+
}
|
|
371
380
|
|
|
372
381
|
// Server capabilities
|
|
373
382
|
ReplSet.prototype.capabilities = function() {
|
|
374
383
|
if(this.s.sCapabilities) return this.s.sCapabilities;
|
|
384
|
+
if(this.s.replset.lastIsMaster() == null) return null;
|
|
375
385
|
this.s.sCapabilities = new ServerCapabilities(this.s.replset.lastIsMaster());
|
|
376
386
|
return this.s.sCapabilities;
|
|
377
387
|
}
|
|
378
388
|
|
|
389
|
+
define.classMethod('capabilities', {callback: false, promise:false, returns: [ServerCapabilities]});
|
|
390
|
+
|
|
379
391
|
// Command
|
|
380
392
|
ReplSet.prototype.command = function(ns, cmd, options, callback) {
|
|
381
393
|
options = translateReadPreference(options);
|
|
382
394
|
this.s.replset.command(ns, cmd, options, callback);
|
|
383
395
|
}
|
|
384
396
|
|
|
397
|
+
define.classMethod('command', {callback: true, promise:false});
|
|
398
|
+
|
|
385
399
|
// Insert
|
|
386
400
|
ReplSet.prototype.insert = function(ns, ops, options, callback) {
|
|
387
401
|
this.s.replset.insert(ns, ops, options, callback);
|
|
388
402
|
}
|
|
389
403
|
|
|
404
|
+
define.classMethod('insert', {callback: true, promise:false});
|
|
405
|
+
|
|
390
406
|
// Update
|
|
391
407
|
ReplSet.prototype.update = function(ns, ops, options, callback) {
|
|
392
408
|
this.s.replset.update(ns, ops, options, callback);
|
|
393
409
|
}
|
|
394
410
|
|
|
411
|
+
define.classMethod('update', {callback: true, promise:false});
|
|
412
|
+
|
|
395
413
|
// Remove
|
|
396
414
|
ReplSet.prototype.remove = function(ns, ops, options, callback) {
|
|
397
415
|
this.s.replset.remove(ns, ops, options, callback);
|
|
398
416
|
}
|
|
399
417
|
|
|
418
|
+
define.classMethod('remove', {callback: true, promise:false});
|
|
419
|
+
|
|
420
|
+
// Destroyed
|
|
421
|
+
ReplSet.prototype.isDestroyed = function() {
|
|
422
|
+
return this.s.replset.isDestroyed();
|
|
423
|
+
}
|
|
424
|
+
|
|
400
425
|
// IsConnected
|
|
401
426
|
ReplSet.prototype.isConnected = function() {
|
|
402
427
|
return this.s.replset.isConnected();
|
|
403
428
|
}
|
|
404
429
|
|
|
430
|
+
define.classMethod('isConnected', {callback: false, promise:false, returns: [Boolean]});
|
|
431
|
+
|
|
405
432
|
ReplSet.prototype.setBSONParserType = function(type) {
|
|
406
433
|
return this.s.replset.setBSONParserType(type);
|
|
407
|
-
}
|
|
434
|
+
}
|
|
408
435
|
|
|
409
436
|
// Insert
|
|
410
437
|
ReplSet.prototype.cursor = function(ns, cmd, options) {
|
|
@@ -413,6 +440,8 @@ ReplSet.prototype.cursor = function(ns, cmd, options) {
|
|
|
413
440
|
return this.s.replset.cursor(ns, cmd, options);
|
|
414
441
|
}
|
|
415
442
|
|
|
443
|
+
define.classMethod('cursor', {callback: false, promise:false, returns: [Cursor, AggregationCursor, CommandCursor]});
|
|
444
|
+
|
|
416
445
|
ReplSet.prototype.lastIsMaster = function() {
|
|
417
446
|
return this.s.replset.lastIsMaster();
|
|
418
447
|
}
|
|
@@ -429,14 +458,18 @@ ReplSet.prototype.close = function(forceClosed) {
|
|
|
429
458
|
var events = ['timeout', 'error', 'close', 'joined', 'left'];
|
|
430
459
|
events.forEach(function(e) {
|
|
431
460
|
self.removeAllListeners(e);
|
|
432
|
-
});
|
|
461
|
+
});
|
|
433
462
|
}
|
|
434
463
|
|
|
464
|
+
define.classMethod('close', {callback: false, promise:false});
|
|
465
|
+
|
|
435
466
|
ReplSet.prototype.auth = function() {
|
|
436
467
|
var args = Array.prototype.slice.call(arguments, 0);
|
|
437
468
|
this.s.replset.auth.apply(this.s.replset, args);
|
|
438
469
|
}
|
|
439
470
|
|
|
471
|
+
define.classMethod('auth', {callback: true, promise:false});
|
|
472
|
+
|
|
440
473
|
/**
|
|
441
474
|
* All raw connections
|
|
442
475
|
* @method
|
|
@@ -444,7 +477,9 @@ ReplSet.prototype.auth = function() {
|
|
|
444
477
|
*/
|
|
445
478
|
ReplSet.prototype.connections = function() {
|
|
446
479
|
return this.s.replset.connections();
|
|
447
|
-
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
define.classMethod('connections', {callback: false, promise:false, returns:[Array]});
|
|
448
483
|
|
|
449
484
|
/**
|
|
450
485
|
* A replset connect event, used to verify that the connection is up and running
|
|
@@ -524,4 +559,4 @@ ReplSet.prototype.connections = function() {
|
|
|
524
559
|
* @type {object}
|
|
525
560
|
*/
|
|
526
561
|
|
|
527
|
-
module.exports = ReplSet;
|
|
562
|
+
module.exports = ReplSet;
|
package/lib/server.js
CHANGED
|
@@ -4,9 +4,12 @@ var EventEmitter = require('events').EventEmitter
|
|
|
4
4
|
, inherits = require('util').inherits
|
|
5
5
|
, CServer = require('mongodb-core').Server
|
|
6
6
|
, Cursor = require('./cursor')
|
|
7
|
+
, AggregationCursor = require('./aggregation_cursor')
|
|
8
|
+
, CommandCursor = require('./command_cursor')
|
|
7
9
|
, f = require('util').format
|
|
8
10
|
, ServerCapabilities = require('./topology_base').ServerCapabilities
|
|
9
11
|
, Store = require('./topology_base').Store
|
|
12
|
+
, Define = require('./metadata')
|
|
10
13
|
, MongoError = require('mongodb-core').MongoError
|
|
11
14
|
, shallowClone = require('./utils').shallowClone;
|
|
12
15
|
|
|
@@ -37,6 +40,7 @@ var EventEmitter = require('events').EventEmitter
|
|
|
37
40
|
* @param {number} [options.poolSize=5] Number of connections in the connection pool for each server instance, set to 5 as default for legacy reasons.
|
|
38
41
|
* @param {boolean} [options.ssl=false] Use ssl connection (needs to have a mongod server with ssl support)
|
|
39
42
|
* @param {object} [options.sslValidate=true] Validate mongod server certificate against ca (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
43
|
+
* @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function.
|
|
40
44
|
* @param {array} [options.sslCA=null] Array of valid certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
41
45
|
* @param {(Buffer|string)} [options.sslCert=null] String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
42
46
|
* @param {(Buffer|string)} [options.sslKey=null] String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher)
|
|
@@ -79,7 +83,7 @@ var Server = function(host, port, options) {
|
|
|
79
83
|
port = null;
|
|
80
84
|
}
|
|
81
85
|
} else if(port == null) {
|
|
82
|
-
throw
|
|
86
|
+
throw MongoError.create({message: 'port must be specified', driver:true});
|
|
83
87
|
}
|
|
84
88
|
|
|
85
89
|
// Clone options
|
|
@@ -195,10 +199,14 @@ var Server = function(host, port, options) {
|
|
|
195
199
|
|
|
196
200
|
inherits(Server, EventEmitter);
|
|
197
201
|
|
|
202
|
+
var define = Server.define = new Define('Server', Server, false);
|
|
203
|
+
|
|
198
204
|
Server.prototype.parserType = function() {
|
|
199
205
|
return this.s.server.parserType();
|
|
200
206
|
}
|
|
201
207
|
|
|
208
|
+
define.classMethod('parserType', {callback: false, promise:false, returns: [String]});
|
|
209
|
+
|
|
202
210
|
// Connect
|
|
203
211
|
Server.prototype.connect = function(db, _options, callback) {
|
|
204
212
|
var self = this;
|
|
@@ -271,6 +279,7 @@ Server.prototype.connect = function(db, _options, callback) {
|
|
|
271
279
|
try {
|
|
272
280
|
callback(null, self);
|
|
273
281
|
} catch(err) {
|
|
282
|
+
console.log(err.stack)
|
|
274
283
|
process.nextTick(function() { throw err; })
|
|
275
284
|
}
|
|
276
285
|
}
|
|
@@ -297,41 +306,60 @@ Server.prototype.connect = function(db, _options, callback) {
|
|
|
297
306
|
// Server capabilities
|
|
298
307
|
Server.prototype.capabilities = function() {
|
|
299
308
|
if(this.s.sCapabilities) return this.s.sCapabilities;
|
|
309
|
+
if(this.s.server.lastIsMaster() == null) return null;
|
|
300
310
|
this.s.sCapabilities = new ServerCapabilities(this.s.server.lastIsMaster());
|
|
301
311
|
return this.s.sCapabilities;
|
|
302
312
|
}
|
|
303
313
|
|
|
314
|
+
define.classMethod('capabilities', {callback: false, promise:false, returns: [ServerCapabilities]});
|
|
315
|
+
|
|
304
316
|
// Command
|
|
305
317
|
Server.prototype.command = function(ns, cmd, options, callback) {
|
|
306
318
|
this.s.server.command(ns, cmd, options, callback);
|
|
307
319
|
}
|
|
308
320
|
|
|
321
|
+
define.classMethod('command', {callback: true, promise:false});
|
|
322
|
+
|
|
309
323
|
// Insert
|
|
310
324
|
Server.prototype.insert = function(ns, ops, options, callback) {
|
|
311
325
|
this.s.server.insert(ns, ops, options, callback);
|
|
312
326
|
}
|
|
313
327
|
|
|
328
|
+
define.classMethod('insert', {callback: true, promise:false});
|
|
329
|
+
|
|
314
330
|
// Update
|
|
315
331
|
Server.prototype.update = function(ns, ops, options, callback) {
|
|
316
332
|
this.s.server.update(ns, ops, options, callback);
|
|
317
333
|
}
|
|
318
334
|
|
|
335
|
+
define.classMethod('update', {callback: true, promise:false});
|
|
336
|
+
|
|
319
337
|
// Remove
|
|
320
338
|
Server.prototype.remove = function(ns, ops, options, callback) {
|
|
321
339
|
this.s.server.remove(ns, ops, options, callback);
|
|
322
340
|
}
|
|
323
341
|
|
|
342
|
+
define.classMethod('remove', {callback: true, promise:false});
|
|
343
|
+
|
|
324
344
|
// IsConnected
|
|
325
345
|
Server.prototype.isConnected = function() {
|
|
326
346
|
return this.s.server.isConnected();
|
|
327
347
|
}
|
|
328
348
|
|
|
349
|
+
Server.prototype.isDestroyed = function() {
|
|
350
|
+
return this.s.server.isDestroyed();
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
define.classMethod('isConnected', {callback: false, promise:false, returns: [Boolean]});
|
|
354
|
+
|
|
329
355
|
// Insert
|
|
330
356
|
Server.prototype.cursor = function(ns, cmd, options) {
|
|
331
357
|
options.disconnectHandler = this.s.store;
|
|
332
358
|
return this.s.server.cursor(ns, cmd, options);
|
|
333
359
|
}
|
|
334
360
|
|
|
361
|
+
define.classMethod('cursor', {callback: false, promise:false, returns: [Cursor, AggregationCursor, CommandCursor]});
|
|
362
|
+
|
|
335
363
|
Server.prototype.setBSONParserType = function(type) {
|
|
336
364
|
return this.s.server.setBSONParserType(type);
|
|
337
365
|
}
|
|
@@ -349,11 +377,15 @@ Server.prototype.close = function(forceClosed) {
|
|
|
349
377
|
}
|
|
350
378
|
}
|
|
351
379
|
|
|
380
|
+
define.classMethod('close', {callback: false, promise:false});
|
|
381
|
+
|
|
352
382
|
Server.prototype.auth = function() {
|
|
353
383
|
var args = Array.prototype.slice.call(arguments, 0);
|
|
354
384
|
this.s.server.auth.apply(this.s.server, args);
|
|
355
385
|
}
|
|
356
386
|
|
|
387
|
+
define.classMethod('auth', {callback: true, promise:false});
|
|
388
|
+
|
|
357
389
|
/**
|
|
358
390
|
* All raw connections
|
|
359
391
|
* @method
|
|
@@ -363,6 +395,8 @@ Server.prototype.connections = function() {
|
|
|
363
395
|
return this.s.server.connections();
|
|
364
396
|
}
|
|
365
397
|
|
|
398
|
+
define.classMethod('connections', {callback: false, promise:false, returns:[Array]});
|
|
399
|
+
|
|
366
400
|
/**
|
|
367
401
|
* Server connect event
|
|
368
402
|
*
|
package/lib/topology_base.js
CHANGED
|
@@ -22,12 +22,18 @@ var Store = function(topology, storeOptions) {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
Store.prototype.add = function(opType, ns, ops, options, callback) {
|
|
25
|
-
if(this.s.storeOptions.force)
|
|
26
|
-
|
|
25
|
+
if(this.s.storeOptions.force) {
|
|
26
|
+
return callback(MongoError.create({message: "db closed by application", driver:true}));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if(this.s.storeOptions.bufferMaxEntries == 0) {
|
|
30
|
+
return callback(MongoError.create({message: f("no connection available for operation and number of stored operation > %s", this.s.storeOptions.bufferMaxEntries), driver:true }));
|
|
31
|
+
}
|
|
32
|
+
|
|
27
33
|
if(this.s.storeOptions.bufferMaxEntries > 0 && this.s.storedOps.length > this.s.storeOptions.bufferMaxEntries) {
|
|
28
34
|
while(this.s.storedOps.length > 0) {
|
|
29
35
|
var op = this.s.storedOps.shift();
|
|
30
|
-
op.c(
|
|
36
|
+
op.c(MongoError.create({message: f("no connection available for operation and number of stored operation > %s", this.s.storeOptions.bufferMaxEntries), driver:true }));
|
|
31
37
|
}
|
|
32
38
|
|
|
33
39
|
return;
|
|
@@ -37,12 +43,18 @@ Store.prototype.add = function(opType, ns, ops, options, callback) {
|
|
|
37
43
|
}
|
|
38
44
|
|
|
39
45
|
Store.prototype.addObjectAndMethod = function(opType, object, method, params, callback) {
|
|
40
|
-
if(this.s.storeOptions.force)
|
|
41
|
-
|
|
46
|
+
if(this.s.storeOptions.force) {
|
|
47
|
+
return callback(MongoError.create({message: "db closed by application", driver:true }));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if(this.s.storeOptions.bufferMaxEntries == 0) {
|
|
51
|
+
return callback(MongoError.create({message: f("no connection available for operation and number of stored operation > %s", this.s.storeOptions.bufferMaxEntries), driver:true }));
|
|
52
|
+
}
|
|
53
|
+
|
|
42
54
|
if(this.s.storeOptions.bufferMaxEntries > 0 && this.s.storedOps.length > this.s.storeOptions.bufferMaxEntries) {
|
|
43
55
|
while(this.s.storedOps.length > 0) {
|
|
44
56
|
var op = this.s.storedOps.shift();
|
|
45
|
-
op.c(
|
|
57
|
+
op.c(MongoError.create({message: f("no connection available for operation and number of stored operation > %s", this.s.storeOptions.bufferMaxEntries), driver:true }));
|
|
46
58
|
}
|
|
47
59
|
|
|
48
60
|
return;
|
|
@@ -53,7 +65,7 @@ Store.prototype.addObjectAndMethod = function(opType, object, method, params, ca
|
|
|
53
65
|
|
|
54
66
|
Store.prototype.flush = function() {
|
|
55
67
|
while(this.s.storedOps.length > 0) {
|
|
56
|
-
this.s.storedOps.shift().c(
|
|
68
|
+
this.s.storedOps.shift().c(MongoError.create({message: f("no connection available for operation"), driver:true }));
|
|
57
69
|
}
|
|
58
70
|
}
|
|
59
71
|
|
|
@@ -72,7 +84,7 @@ Store.prototype.execute = function() {
|
|
|
72
84
|
} else {
|
|
73
85
|
this.s.topology[op.t](op.n, op.o, op.op, op.c);
|
|
74
86
|
}
|
|
75
|
-
}
|
|
87
|
+
}
|
|
76
88
|
}
|
|
77
89
|
|
|
78
90
|
Store.prototype.all = function() {
|
|
@@ -85,7 +97,7 @@ var ServerCapabilities = function(ismaster) {
|
|
|
85
97
|
Object.defineProperty(object, name, {
|
|
86
98
|
enumerable: true
|
|
87
99
|
, get: function () { return value; }
|
|
88
|
-
});
|
|
100
|
+
});
|
|
89
101
|
}
|
|
90
102
|
|
|
91
103
|
// Capabilities
|
|
@@ -137,4 +149,4 @@ var ServerCapabilities = function(ismaster) {
|
|
|
137
149
|
}
|
|
138
150
|
|
|
139
151
|
exports.Store = Store;
|
|
140
|
-
exports.ServerCapabilities = ServerCapabilities;
|
|
152
|
+
exports.ServerCapabilities = ServerCapabilities;
|