mongo 1.7.1 → 1.8.0
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.
- data/{LICENSE.txt → LICENSE} +0 -0
- data/README.md +124 -111
- data/Rakefile +9 -325
- data/VERSION +1 -0
- data/bin/mongo_console +4 -4
- data/examples/admin.rb +43 -0
- data/examples/capped.rb +22 -0
- data/examples/cursor.rb +48 -0
- data/examples/gridfs.rb +44 -0
- data/examples/index_test.rb +126 -0
- data/examples/info.rb +31 -0
- data/examples/queries.rb +74 -0
- data/examples/replica_set.rb +26 -0
- data/examples/simple.rb +25 -0
- data/examples/strict.rb +35 -0
- data/examples/types.rb +36 -0
- data/{test/load → examples/web}/thin/load.rb +3 -1
- data/{test/load → examples/web}/unicorn/load.rb +5 -3
- data/lib/mongo.rb +8 -10
- data/lib/mongo/collection.rb +134 -114
- data/lib/mongo/cursor.rb +21 -14
- data/lib/mongo/db.rb +30 -28
- data/lib/mongo/exceptions.rb +1 -1
- data/lib/mongo/gridfs/grid.rb +8 -7
- data/lib/mongo/gridfs/grid_ext.rb +1 -1
- data/lib/mongo/gridfs/grid_file_system.rb +6 -5
- data/lib/mongo/gridfs/grid_io.rb +22 -19
- data/lib/mongo/legacy.rb +82 -0
- data/lib/mongo/{connection.rb → mongo_client.rb} +82 -61
- data/lib/mongo/{repl_set_connection.rb → mongo_replica_set_client.rb} +54 -39
- data/lib/mongo/{sharded_connection.rb → mongo_sharded_client.rb} +9 -9
- data/lib/mongo/networking.rb +25 -20
- data/lib/mongo/util/conversions.rb +1 -1
- data/lib/mongo/util/core_ext.rb +1 -1
- data/lib/mongo/util/logging.rb +20 -4
- data/lib/mongo/util/node.rb +16 -16
- data/lib/mongo/util/pool.rb +56 -27
- data/lib/mongo/util/pool_manager.rb +28 -27
- data/lib/mongo/util/server_version.rb +1 -1
- data/lib/mongo/util/sharding_pool_manager.rb +8 -8
- data/lib/mongo/util/ssl_socket.rb +1 -5
- data/lib/mongo/util/support.rb +24 -8
- data/lib/mongo/util/tcp_socket.rb +0 -4
- data/lib/mongo/util/uri_parser.rb +54 -38
- data/lib/mongo/util/write_concern.rb +67 -0
- data/mongo.gemspec +21 -32
- data/test/auxillary/{1.4_features.rb → 1.4_feature_test.rb} +4 -5
- data/test/auxillary/authentication_test.rb +18 -20
- data/test/auxillary/autoreconnect_test.rb +3 -5
- data/test/auxillary/fork_test.rb +5 -7
- data/test/auxillary/repl_set_auth_test.rb +13 -15
- data/test/auxillary/slave_connection_test.rb +8 -7
- data/test/auxillary/threaded_authentication_test.rb +15 -17
- data/test/bson/binary_test.rb +1 -1
- data/test/bson/bson_test.rb +60 -36
- data/test/bson/byte_buffer_test.rb +1 -1
- data/test/bson/hash_with_indifferent_access_test.rb +2 -2
- data/test/bson/json_test.rb +1 -2
- data/test/bson/object_id_test.rb +1 -2
- data/test/bson/ordered_hash_test.rb +1 -1
- data/test/bson/timestamp_test.rb +1 -1
- data/test/{collection_test.rb → functional/collection_test.rb} +57 -57
- data/test/{connection_test.rb → functional/connection_test.rb} +75 -89
- data/test/{conversions_test.rb → functional/conversions_test.rb} +1 -1
- data/test/{cursor_fail_test.rb → functional/cursor_fail_test.rb} +3 -29
- data/test/{cursor_message_test.rb → functional/cursor_message_test.rb} +1 -1
- data/test/{cursor_test.rb → functional/cursor_test.rb} +5 -1
- data/test/{db_api_test.rb → functional/db_api_test.rb} +8 -9
- data/test/{db_connection_test.rb → functional/db_connection_test.rb} +3 -5
- data/test/{db_test.rb → functional/db_test.rb} +13 -13
- data/test/{grid_file_system_test.rb → functional/grid_file_system_test.rb} +2 -2
- data/test/{grid_io_test.rb → functional/grid_io_test.rb} +6 -6
- data/test/{grid_test.rb → functional/grid_test.rb} +4 -10
- data/test/{pool_test.rb → functional/pool_test.rb} +1 -1
- data/test/functional/safe_test.rb +84 -0
- data/test/{support_test.rb → functional/support_test.rb} +1 -1
- data/test/{threading_test.rb → functional/threading_test.rb} +9 -9
- data/test/{timeout_test.rb → functional/timeout_test.rb} +1 -1
- data/test/{uri_test.rb → functional/uri_test.rb} +1 -1
- data/test/functional/write_concern_test.rb +104 -0
- data/test/replica_set/basic_test.rb +139 -0
- data/test/replica_set/client_test.rb +255 -0
- data/test/replica_set/complex_connect_test.rb +62 -0
- data/test/replica_set/connection_test.rb +255 -0
- data/test/{replica_sets → replica_set}/count_test.rb +17 -14
- data/test/replica_set/cursor_test.rb +75 -0
- data/test/{replica_sets → replica_set}/insert_test.rb +19 -16
- data/test/replica_set/query_test.rb +64 -0
- data/test/replica_set/refresh_test.rb +153 -0
- data/test/{replica_sets → replica_set}/replication_ack_test.rb +21 -17
- data/test/sharded_cluster/basic_test.rb +31 -50
- data/test/support/hash_with_indifferent_access.rb +1 -1
- data/test/test_helper.rb +56 -9
- data/test/threading/threading_with_large_pool_test.rb +8 -8
- data/test/tools/mongo_config.rb +270 -58
- data/test/tools/mongo_config_test.rb +146 -0
- data/test/unit/client_test.rb +230 -0
- data/test/unit/collection_test.rb +45 -32
- data/test/unit/connection_test.rb +82 -74
- data/test/unit/cursor_test.rb +14 -6
- data/test/unit/db_test.rb +8 -8
- data/test/unit/grid_test.rb +11 -11
- data/test/unit/node_test.rb +24 -24
- data/test/unit/pool_manager_test.rb +13 -13
- data/test/unit/pool_test.rb +1 -1
- data/test/unit/read_test.rb +21 -26
- data/test/unit/safe_test.rb +52 -33
- data/test/unit/util_test.rb +55 -0
- data/test/unit/write_concern_test.rb +161 -0
- metadata +158 -171
- data/docs/CREDITS.md +0 -123
- data/docs/FAQ.md +0 -116
- data/docs/GRID_FS.md +0 -158
- data/docs/HISTORY.md +0 -392
- data/docs/READ_PREFERENCE.md +0 -99
- data/docs/RELEASES.md +0 -54
- data/docs/REPLICA_SETS.md +0 -113
- data/docs/TAILABLE_CURSORS.md +0 -51
- data/docs/TUTORIAL.md +0 -356
- data/docs/WRITE_CONCERN.md +0 -31
- data/lib/mongo/gridfs/grid_io_fix.rb +0 -38
- data/lib/mongo/version.rb +0 -3
- data/test/bson/test_helper.rb +0 -30
- data/test/replica_sets/basic_test.rb +0 -119
- data/test/replica_sets/complex_connect_test.rb +0 -57
- data/test/replica_sets/complex_read_preference_test.rb +0 -237
- data/test/replica_sets/connect_test.rb +0 -156
- data/test/replica_sets/cursor_test.rb +0 -70
- data/test/replica_sets/pooled_insert_test.rb +0 -57
- data/test/replica_sets/query_test.rb +0 -50
- data/test/replica_sets/read_preference_test.rb +0 -234
- data/test/replica_sets/refresh_test.rb +0 -156
- data/test/replica_sets/refresh_with_threads_test.rb +0 -60
- data/test/replica_sets/rs_test_helper.rb +0 -39
- data/test/safe_test.rb +0 -68
- data/test/sharded_cluster/mongo_config_test.rb +0 -126
- data/test/sharded_cluster/sc_test_helper.rb +0 -39
- data/test/tools/repl_set_manager.rb +0 -418
@@ -1,7 +1,7 @@
|
|
1
1
|
module Mongo
|
2
2
|
class PoolManager
|
3
3
|
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :client, :arbiters, :primary, :secondaries, :primary_pool,
|
5
5
|
:secondary_pool, :secondary_pools, :hosts, :nodes, :members, :seeds,
|
6
6
|
:max_bson_size
|
7
7
|
|
@@ -14,10 +14,10 @@ module Mongo
|
|
14
14
|
# the user may pass an additional list of seeds nodes discovered in real
|
15
15
|
# time. The union of these lists will be used when attempting to connect,
|
16
16
|
# with the newly-discovered nodes being used first.
|
17
|
-
def initialize(
|
18
|
-
@pinned_pools
|
19
|
-
@
|
20
|
-
@seeds
|
17
|
+
def initialize(client, seeds=[])
|
18
|
+
@pinned_pools = {}
|
19
|
+
@client = client
|
20
|
+
@seeds = seeds
|
21
21
|
@previously_connected = false
|
22
22
|
end
|
23
23
|
|
@@ -99,15 +99,16 @@ module Mongo
|
|
99
99
|
read_pool.host_port
|
100
100
|
end
|
101
101
|
|
102
|
-
def read_pool(mode=@
|
103
|
-
|
102
|
+
def read_pool(mode=@client.read_preference,
|
103
|
+
tags=@client.tag_sets,
|
104
|
+
acceptable_latency=@client.acceptable_latency)
|
104
105
|
|
105
106
|
if mode == :primary && !tags.empty?
|
106
107
|
raise MongoArgumentError, "Read preferecy :primary cannot be combined with tags"
|
107
108
|
end
|
108
109
|
|
109
110
|
pinned = @pinned_pools[Thread.current]
|
110
|
-
if
|
111
|
+
if pinned && pinned.matches_mode(mode) && pinned.matches_tag_sets(tags) && pinned.up?
|
111
112
|
pool = pinned
|
112
113
|
else
|
113
114
|
pool = case mode
|
@@ -159,18 +160,18 @@ module Mongo
|
|
159
160
|
end
|
160
161
|
|
161
162
|
def initialize_data
|
162
|
-
@primary
|
163
|
-
@primary_pool
|
164
|
-
@read
|
165
|
-
@read_pool
|
166
|
-
@arbiters
|
167
|
-
@secondaries
|
168
|
-
@secondary_pool
|
169
|
-
@secondary_pools
|
170
|
-
@hosts
|
171
|
-
@members
|
163
|
+
@primary = nil
|
164
|
+
@primary_pool = nil
|
165
|
+
@read = nil
|
166
|
+
@read_pool = nil
|
167
|
+
@arbiters = []
|
168
|
+
@secondaries = []
|
169
|
+
@secondary_pool = nil
|
170
|
+
@secondary_pools = []
|
171
|
+
@hosts = Set.new
|
172
|
+
@members = Set.new
|
172
173
|
@refresh_required = false
|
173
|
-
@pinned_pools
|
174
|
+
@pinned_pools = {}
|
174
175
|
end
|
175
176
|
|
176
177
|
# Connect to each member of the replica set
|
@@ -182,7 +183,7 @@ module Mongo
|
|
182
183
|
seed = get_valid_seed_node
|
183
184
|
|
184
185
|
seed.node_list.each do |host|
|
185
|
-
node = Mongo::Node.new(self.
|
186
|
+
node = Mongo::Node.new(self.client, host)
|
186
187
|
if node.connect && node.set_config && node.healthy?
|
187
188
|
members << node
|
188
189
|
end
|
@@ -216,9 +217,9 @@ module Mongo
|
|
216
217
|
def assign_primary(member)
|
217
218
|
member.last_state = :primary
|
218
219
|
@primary = member.host_port
|
219
|
-
@primary_pool = Pool.new(self.
|
220
|
-
:size => self.
|
221
|
-
:timeout => self.
|
220
|
+
@primary_pool = Pool.new(self.client, member.host, member.port,
|
221
|
+
:size => self.client.pool_size,
|
222
|
+
:timeout => self.client.pool_timeout,
|
222
223
|
:node => member
|
223
224
|
)
|
224
225
|
end
|
@@ -226,9 +227,9 @@ module Mongo
|
|
226
227
|
def assign_secondary(member)
|
227
228
|
member.last_state = :secondary
|
228
229
|
@secondaries << member.host_port
|
229
|
-
pool = Pool.new(self.
|
230
|
-
:size => self.
|
231
|
-
:timeout => self.
|
230
|
+
pool = Pool.new(self.client, member.host, member.port,
|
231
|
+
:size => self.client.pool_size,
|
232
|
+
:timeout => self.client.pool_timeout,
|
232
233
|
:node => member
|
233
234
|
)
|
234
235
|
@secondary_pools << pool
|
@@ -268,7 +269,7 @@ module Mongo
|
|
268
269
|
# If we don't get a response, raise an exception.
|
269
270
|
def get_valid_seed_node
|
270
271
|
@seeds.each do |seed|
|
271
|
-
node = Mongo::Node.new(self.
|
272
|
+
node = Mongo::Node.new(self.client, seed)
|
272
273
|
if !node.connect
|
273
274
|
next
|
274
275
|
elsif node.set_config && node.healthy?
|
@@ -3,15 +3,15 @@ module Mongo
|
|
3
3
|
module ShardingNode
|
4
4
|
def set_config
|
5
5
|
begin
|
6
|
-
@config = @
|
6
|
+
@config = @client['admin'].command({:ismaster => 1}, :socket => @socket)
|
7
7
|
|
8
8
|
# warning: instance variable @logger not initialized
|
9
9
|
#if @config['msg'] && @logger
|
10
|
-
# @
|
10
|
+
# @client.log(:warn, "#{config['msg']}")
|
11
11
|
#end
|
12
12
|
|
13
13
|
rescue ConnectionFailure, OperationFailure, OperationTimeout, SocketError, SystemCallError, IOError => ex
|
14
|
-
@
|
14
|
+
@client.log(:warn, "Attempted connection to node #{host_string} raised " +
|
15
15
|
"#{ex.class}: #{ex.message}")
|
16
16
|
|
17
17
|
# Socket may already be nil from issuing command
|
@@ -39,7 +39,7 @@ module Mongo
|
|
39
39
|
|
40
40
|
class ShardingPoolManager < PoolManager
|
41
41
|
|
42
|
-
attr_reader :
|
42
|
+
attr_reader :client, :primary, :primary_pool, :hosts, :nodes,
|
43
43
|
:max_bson_size, :members
|
44
44
|
|
45
45
|
# Create a new set of connection pools.
|
@@ -49,7 +49,7 @@ module Mongo
|
|
49
49
|
# the user may pass an additional list of seeds nodes discovered in real
|
50
50
|
# time. The union of these lists will be used when attempting to connect,
|
51
51
|
# with the newly-discovered nodes being used first.
|
52
|
-
def initialize(
|
52
|
+
def initialize(client, seeds=[])
|
53
53
|
super
|
54
54
|
end
|
55
55
|
|
@@ -81,7 +81,7 @@ module Mongo
|
|
81
81
|
# The config.mongos find can't be part of the connect call chain due to infinite recursion
|
82
82
|
def check_connection_health
|
83
83
|
begin
|
84
|
-
seeds = @
|
84
|
+
seeds = @client['config']['mongos'].find.to_a.map{|doc| doc['_id']}
|
85
85
|
if @seeds != seeds
|
86
86
|
@seeds = seeds
|
87
87
|
@refresh_required = true
|
@@ -102,7 +102,7 @@ module Mongo
|
|
102
102
|
seed = get_valid_seed_node
|
103
103
|
|
104
104
|
seed.node_list.each do |host|
|
105
|
-
node = Mongo::Node.new(self.
|
105
|
+
node = Mongo::Node.new(self.client, host)
|
106
106
|
node.extend ShardingNode
|
107
107
|
if node.connect && node.set_config
|
108
108
|
members << node
|
@@ -124,7 +124,7 @@ module Mongo
|
|
124
124
|
# If we don't get a response, raise an exception.
|
125
125
|
def get_valid_seed_node
|
126
126
|
@seeds.each do |seed|
|
127
|
-
node = Mongo::Node.new(self.
|
127
|
+
node = Mongo::Node.new(self.client, seed)
|
128
128
|
node.extend ShardingNode
|
129
129
|
if !node.connect
|
130
130
|
next
|
@@ -20,7 +20,7 @@ module Mongo
|
|
20
20
|
|
21
21
|
@ssl = OpenSSL::SSL::SSLSocket.new(@socket)
|
22
22
|
@ssl.sync_close = true
|
23
|
-
|
23
|
+
|
24
24
|
connect
|
25
25
|
end
|
26
26
|
|
@@ -48,10 +48,6 @@ module Mongo
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
def setsockopt(key, value, n)
|
52
|
-
@ssl.setsockopt(key, value, n)
|
53
|
-
end
|
54
|
-
|
55
51
|
def close
|
56
52
|
@ssl.close
|
57
53
|
end
|
data/lib/mongo/util/support.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
# --
|
4
|
-
# Copyright (C) 2008-
|
4
|
+
# Copyright (C) 2008-2012 10gen Inc.
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
@@ -20,15 +20,31 @@ require 'digest/md5'
|
|
20
20
|
|
21
21
|
module Mongo
|
22
22
|
module Support
|
23
|
+
|
23
24
|
include Mongo::Conversions
|
24
25
|
extend self
|
25
26
|
|
26
|
-
READ_PREFERENCES = [
|
27
|
+
READ_PREFERENCES = [
|
28
|
+
:primary,
|
29
|
+
:primary_preferred,
|
30
|
+
:secondary,
|
31
|
+
:secondary_preferred,
|
32
|
+
:nearest
|
33
|
+
]
|
27
34
|
|
28
35
|
# Commands that may be sent to replica-set secondaries, depending on
|
29
36
|
# read preference and tags. All other commands are always run on the primary.
|
30
|
-
SECONDARY_OK_COMMANDS = [
|
31
|
-
'
|
37
|
+
SECONDARY_OK_COMMANDS = [
|
38
|
+
'group',
|
39
|
+
'aggregate',
|
40
|
+
'collstats',
|
41
|
+
'dbstats',
|
42
|
+
'count',
|
43
|
+
'distinct',
|
44
|
+
'geonear',
|
45
|
+
'geosearch',
|
46
|
+
'geowalk'
|
47
|
+
]
|
32
48
|
|
33
49
|
# Generate an MD5 for authentication.
|
34
50
|
#
|
@@ -69,10 +85,10 @@ module Mongo
|
|
69
85
|
command = selector.keys.first.to_s.downcase
|
70
86
|
|
71
87
|
if command == 'mapreduce'
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
88
|
+
out = selector.select { |k, v| k.to_s.downcase == 'out' }.first.last
|
89
|
+
# mongo looks at the first key in the out object, and doesn't
|
90
|
+
# look at the value
|
91
|
+
out.is_a?(Hash) && out.keys.first.to_s.downcase == 'inline' ? true : false
|
76
92
|
else
|
77
93
|
SECONDARY_OK_COMMANDS.member?(command)
|
78
94
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
# --
|
4
|
-
# Copyright (C) 2008-
|
4
|
+
# Copyright (C) 2008-2012 10gen Inc.
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
@@ -35,7 +35,20 @@ module Mongo
|
|
35
35
|
MONGODB_URI_SPEC = "mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]"
|
36
36
|
|
37
37
|
SPEC_ATTRS = [:nodes, :auths]
|
38
|
-
|
38
|
+
|
39
|
+
OPT_ATTRS = [
|
40
|
+
:connect,
|
41
|
+
:replicaset,
|
42
|
+
:slaveok,
|
43
|
+
:safe,
|
44
|
+
:w,
|
45
|
+
:wtimeout,
|
46
|
+
:fsync,
|
47
|
+
:journal,
|
48
|
+
:connecttimeoutms,
|
49
|
+
:sockettimeoutms,
|
50
|
+
:wtimeoutms
|
51
|
+
]
|
39
52
|
|
40
53
|
OPT_VALID = {:connect => lambda {|arg| ['direct', 'replicaset', 'true', 'false', true, false].include?(arg)},
|
41
54
|
:replicaset => lambda {|arg| arg.length > 0},
|
@@ -76,9 +89,20 @@ module Mongo
|
|
76
89
|
:wtimeoutms => lambda {|arg| arg.to_i }
|
77
90
|
}
|
78
91
|
|
79
|
-
attr_reader :auths,
|
80
|
-
|
81
|
-
|
92
|
+
attr_reader :auths,
|
93
|
+
:connect,
|
94
|
+
:replicaset,
|
95
|
+
:slaveok,
|
96
|
+
:safe,
|
97
|
+
:w,
|
98
|
+
:wtimeout,
|
99
|
+
:fsync,
|
100
|
+
:journal,
|
101
|
+
:connecttimeoutms,
|
102
|
+
:sockettimeoutms,
|
103
|
+
:wtimeoutms
|
104
|
+
|
105
|
+
# Parse a MongoDB URI. This method is used by MongoClient.from_uri.
|
82
106
|
# Returns an array of nodes and an array of db authorizations, if applicable.
|
83
107
|
#
|
84
108
|
# @note Passwords can contain any character except for ','
|
@@ -100,17 +124,25 @@ module Mongo
|
|
100
124
|
validate_connect
|
101
125
|
end
|
102
126
|
|
103
|
-
# Create a Mongo::
|
127
|
+
# Create a Mongo::MongoClient or a Mongo::MongoReplicaSetClient based on the URI.
|
104
128
|
#
|
105
129
|
# @note Don't confuse this with attribute getter method #connect.
|
106
130
|
#
|
107
|
-
# @return [
|
108
|
-
def connection(extra_opts)
|
131
|
+
# @return [MongoClient,MongoReplicaSetClient]
|
132
|
+
def connection(extra_opts, legacy=false)
|
109
133
|
opts = connection_options.merge! extra_opts
|
110
|
-
if
|
111
|
-
|
134
|
+
if(legacy)
|
135
|
+
if replicaset?
|
136
|
+
ReplSetConnection.new(nodes, opts)
|
137
|
+
else
|
138
|
+
Connection.new(host, port, opts)
|
139
|
+
end
|
112
140
|
else
|
113
|
-
|
141
|
+
if replicaset?
|
142
|
+
MongoReplicaSetClient.new(nodes, opts)
|
143
|
+
else
|
144
|
+
MongoClient.new(host, port, opts)
|
145
|
+
end
|
114
146
|
end
|
115
147
|
end
|
116
148
|
|
@@ -147,42 +179,26 @@ module Mongo
|
|
147
179
|
nodes[0][1].to_i
|
148
180
|
end
|
149
181
|
|
150
|
-
# Options that can be passed to
|
182
|
+
# Options that can be passed to MongoClient.new or MongoReplicaSetClient.new
|
151
183
|
# @return [Hash]
|
152
184
|
def connection_options
|
153
185
|
opts = {}
|
154
186
|
|
155
|
-
if
|
156
|
-
|
187
|
+
if @wtimeout
|
188
|
+
warn "Using wtimeout in a URI is deprecated, please use wtimeoutMS. It will be removed in v2.0."
|
189
|
+
opts[:wtimeout] = @wtimeout
|
157
190
|
end
|
191
|
+
opts[:wtimeout] = @wtimeoutms
|
158
192
|
|
159
|
-
if @safe
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
safe_opts[:j] = @journal if @journal
|
164
|
-
|
165
|
-
if @wtimeout
|
166
|
-
warn "Using wtimeout in a URI is deprecated, please use wtimeoutMS. It will be removed in v2.0."
|
167
|
-
safe_opts[:wtimeout] = @wtimeout
|
168
|
-
end
|
169
|
-
|
170
|
-
if @wtimeoutms
|
171
|
-
safe_opts[:wtimeout] = @wtimeoutms
|
172
|
-
end
|
173
|
-
|
174
|
-
safe_opts[:fsync] = @fsync if @fsync
|
175
|
-
else
|
176
|
-
safe_opts = true
|
177
|
-
end
|
193
|
+
opts[:w] = 1 if @safe
|
194
|
+
opts[:w] = @w if @w
|
195
|
+
opts[:j] = @journal
|
196
|
+
opts[:fsync] = @fsync
|
178
197
|
|
179
|
-
opts[:safe] = safe_opts
|
180
|
-
end
|
181
|
-
|
182
198
|
if @connecttimeoutms
|
183
199
|
opts[:connect_timeout] = @connecttimeoutms
|
184
200
|
end
|
185
|
-
|
201
|
+
|
186
202
|
if @sockettimeoutms
|
187
203
|
opts[:op_timeout] = @sockettimeoutms
|
188
204
|
end
|
@@ -235,7 +251,7 @@ module Mongo
|
|
235
251
|
|
236
252
|
hosturis.each do |hosturi|
|
237
253
|
# If port is present, use it, otherwise use default port
|
238
|
-
host, port = hosturi.split(':') + [
|
254
|
+
host, port = hosturi.split(':') + [MongoClient::DEFAULT_PORT]
|
239
255
|
|
240
256
|
if !(port.to_s =~ /^\d+$/)
|
241
257
|
raise MongoArgumentError, "Invalid port #{port}; port must be specified as digits."
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# --
|
4
|
+
# Copyright (C) 2008-2011 10gen Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
# ++
|
18
|
+
|
19
|
+
module Mongo
|
20
|
+
module WriteConcern
|
21
|
+
|
22
|
+
attr_reader :legacy_write_concern
|
23
|
+
|
24
|
+
@@safe_warn = nil
|
25
|
+
def write_concern_from_legacy(opts)
|
26
|
+
# Warn if 'safe' parameter is being used,
|
27
|
+
if opts.key?(:safe) && !@@safe_warn && !ENV['TEST_MODE']
|
28
|
+
warn "[DEPRECATED] The 'safe' write concern option has been deprecated in favor of 'w'."
|
29
|
+
@@safe_warn = true
|
30
|
+
end
|
31
|
+
|
32
|
+
# nil: set :w => 0
|
33
|
+
# false: set :w => 0
|
34
|
+
# true: set :w => 1
|
35
|
+
# hash: set :w => 0 and merge with opts
|
36
|
+
|
37
|
+
unless opts.has_key?(:w)
|
38
|
+
opts[:w] = 0 # legacy default, unacknowledged
|
39
|
+
safe = opts.delete(:safe)
|
40
|
+
if(safe && safe.is_a?(Hash))
|
41
|
+
opts.merge!(safe)
|
42
|
+
elsif(safe == true)
|
43
|
+
opts[:w] = 1
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# todo: throw exception for conflicting write concern options
|
49
|
+
def get_write_concern(opts, parent=nil)
|
50
|
+
write_concern_from_legacy(opts) if opts.key?(:safe) || @legacy_write_concern
|
51
|
+
write_concern = {
|
52
|
+
:w => 1,
|
53
|
+
:j => false,
|
54
|
+
:fsync => false,
|
55
|
+
:wtimeout => false
|
56
|
+
}
|
57
|
+
write_concern.merge!(parent.write_concern) if parent
|
58
|
+
write_concern.merge!(opts.reject {|k,v| !write_concern.keys.include?(k)})
|
59
|
+
write_concern
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.gle?(write_concern)
|
63
|
+
write_concern[:w] > 0 || write_concern[:j] || write_concern[:fsync] || write_concern[:wtimeout]
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|