mongo 2.0.4 → 2.0.5
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/address/ipv4.rb +8 -4
- data/lib/mongo/address/ipv6.rb +8 -4
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/auth/user/view.rb +5 -1
- data/lib/mongo/bulk_write/bulk_writable.rb +5 -0
- data/lib/mongo/bulk_write/deletable.rb +0 -4
- data/lib/mongo/bulk_write/insertable.rb +0 -4
- data/lib/mongo/client.rb +30 -2
- data/lib/mongo/collection/view/aggregation.rb +17 -4
- data/lib/mongo/collection/view/map_reduce.rb +19 -2
- data/lib/mongo/database.rb +12 -0
- data/lib/mongo/database/view.rb +12 -0
- data/lib/mongo/grid/fs.rb +5 -5
- data/lib/mongo/loggable.rb +5 -3
- data/lib/mongo/logger.rb +21 -5
- data/lib/mongo/operation/aggregate.rb +18 -11
- data/lib/mongo/operation/aggregate/result.rb +16 -1
- data/lib/mongo/operation/map_reduce.rb +7 -9
- data/lib/mongo/operation/read/query.rb +1 -1
- data/lib/mongo/operation/read_preferrable.rb +11 -5
- data/lib/mongo/operation/result.rb +5 -1
- data/lib/mongo/operation/write.rb +1 -0
- data/lib/mongo/operation/write/command.rb +1 -0
- data/lib/mongo/operation/write/command/update_user.rb +43 -0
- data/lib/mongo/operation/write/update_user.rb +75 -0
- data/lib/mongo/protocol/reply.rb +12 -0
- data/lib/mongo/server/connection_pool/queue.rb +3 -3
- data/lib/mongo/socket.rb +22 -11
- data/lib/mongo/socket/ssl.rb +6 -3
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/auth/user/view_spec.rb +42 -0
- data/spec/mongo/client_spec.rb +19 -0
- data/spec/mongo/cluster_spec.rb +2 -1
- data/spec/mongo/collection/view/aggregation_spec.rb +34 -1
- data/spec/mongo/collection/view/map_reduce_spec.rb +92 -0
- data/spec/mongo/collection/view_spec.rb +14 -11
- data/spec/mongo/collection_spec.rb +13 -0
- data/spec/mongo/database_spec.rb +29 -0
- data/spec/mongo/grid/fs_spec.rb +32 -1
- data/spec/mongo/loggable_spec.rb +2 -1
- data/spec/mongo/operation/read/query_spec.rb +19 -0
- data/spec/mongo/operation/read_preferrable_spec.rb +192 -0
- data/spec/mongo/operation/write/update_user_spec.rb +46 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +4 -0
- data/spec/mongo/socket/ssl_spec.rb +21 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/support/authorization.rb +6 -4
- data/spec/support/shared/operation.rb +12 -0
- metadata +9 -3
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 009aca6194505e854c2e8ce72b50826c76b81942
|
4
|
+
data.tar.gz: ec9fa507bafe9c3f79ce430bee77bee9fa6452c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac666b6d3593018bf29f22a212bcf36a1b0dff88e9aee3e439c3f599bff14c90b8e2507355b10cc40e4426a7135313fa161d78fdc853ac4c094acfa9122d2c2c
|
7
|
+
data.tar.gz: 0ff89ae3bc0661a5a39e067a0c96d7a044b291333f314dd6dbd89e8bb7c6d2f4f95ba894785d784acc8126f66896b0505900d56b39c77c5e1a4ac66f8f43f0ca
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/mongo/address.rb
CHANGED
@@ -148,7 +148,7 @@ module Mongo
|
|
148
148
|
error = nil
|
149
149
|
::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM).detect do |info|
|
150
150
|
begin
|
151
|
-
return FAMILY_MAP[info[4]].new(info[3], port).tap do |res|
|
151
|
+
return FAMILY_MAP[info[4]].new(info[3], port, host).tap do |res|
|
152
152
|
res.socket(timeout, ssl_options).connect!
|
153
153
|
end
|
154
154
|
rescue IOError, SystemCallError => e
|
data/lib/mongo/address/ipv4.rb
CHANGED
@@ -21,9 +21,12 @@ module Mongo
|
|
21
21
|
# @since 2.0.0
|
22
22
|
class IPv4
|
23
23
|
|
24
|
-
# @return [ String ] host The
|
24
|
+
# @return [ String ] host The host.
|
25
25
|
attr_reader :host
|
26
26
|
|
27
|
+
# @return [ String ] host_name The original host name.
|
28
|
+
attr_reader :host_name
|
29
|
+
|
27
30
|
# @return [ Integer ] port The port.
|
28
31
|
attr_reader :port
|
29
32
|
|
@@ -52,15 +55,16 @@ module Mongo
|
|
52
55
|
# Initialize the IPv4 resolver.
|
53
56
|
#
|
54
57
|
# @example Initialize the resolver.
|
55
|
-
# IPv4.new("127.0.0.1", 27017,
|
58
|
+
# IPv4.new("127.0.0.1", 27017, 'localhost')
|
56
59
|
#
|
57
60
|
# @param [ String ] host The host.
|
58
61
|
# @param [ Integer ] port The port.
|
59
62
|
#
|
60
63
|
# @since 2.0.0
|
61
|
-
def initialize(host, port)
|
64
|
+
def initialize(host, port, host_name=nil)
|
62
65
|
@host = host
|
63
66
|
@port = port
|
67
|
+
@host_name = host_name
|
64
68
|
end
|
65
69
|
|
66
70
|
# Get a socket for the provided address type, given the options.
|
@@ -76,7 +80,7 @@ module Mongo
|
|
76
80
|
# @since 2.0.0
|
77
81
|
def socket(timeout, ssl_options = {})
|
78
82
|
unless ssl_options.empty?
|
79
|
-
Socket::SSL.new(host, port, timeout, Socket::PF_INET, ssl_options)
|
83
|
+
Socket::SSL.new(host, port, host_name, timeout, Socket::PF_INET, ssl_options)
|
80
84
|
else
|
81
85
|
Socket::TCP.new(host, port, timeout, Socket::PF_INET)
|
82
86
|
end
|
data/lib/mongo/address/ipv6.rb
CHANGED
@@ -21,9 +21,12 @@ module Mongo
|
|
21
21
|
# @since 2.0.0
|
22
22
|
class IPv6
|
23
23
|
|
24
|
-
# @return [ String ] host The
|
24
|
+
# @return [ String ] host The host.
|
25
25
|
attr_reader :host
|
26
26
|
|
27
|
+
# @return [ String ] host_name The original host name.
|
28
|
+
attr_reader :host_name
|
29
|
+
|
27
30
|
# @return [ Integer ] port The port.
|
28
31
|
attr_reader :port
|
29
32
|
|
@@ -52,15 +55,16 @@ module Mongo
|
|
52
55
|
# Initialize the IPv6 resolver.
|
53
56
|
#
|
54
57
|
# @example Initialize the resolver.
|
55
|
-
# IPv6.new("::1", 28011,
|
58
|
+
# IPv6.new("::1", 28011, 'localhost')
|
56
59
|
#
|
57
60
|
# @param [ String ] host The host.
|
58
61
|
# @param [ Integer ] port The port.
|
59
62
|
#
|
60
63
|
# @since 2.0.0
|
61
|
-
def initialize(host, port)
|
64
|
+
def initialize(host, port, host_name=nil)
|
62
65
|
@host = host
|
63
66
|
@port = port
|
67
|
+
@host_name = host_name
|
64
68
|
end
|
65
69
|
|
66
70
|
# Get a socket for the provided address type, given the options.
|
@@ -76,7 +80,7 @@ module Mongo
|
|
76
80
|
# @since 2.0.0
|
77
81
|
def socket(timeout, ssl_options = {})
|
78
82
|
unless ssl_options.empty?
|
79
|
-
Socket::SSL.new(host, port, timeout, Socket::PF_INET6, ssl_options)
|
83
|
+
Socket::SSL.new(host, port, host_name, timeout, Socket::PF_INET6, ssl_options)
|
80
84
|
else
|
81
85
|
Socket::TCP.new(host, port, timeout, Socket::PF_INET6)
|
82
86
|
end
|
data/lib/mongo/address/unix.rb
CHANGED
@@ -20,7 +20,7 @@ module Mongo
|
|
20
20
|
# @since 2.0.0
|
21
21
|
class Unix
|
22
22
|
|
23
|
-
# @return [ String ] host The
|
23
|
+
# @return [ String ] host The host.
|
24
24
|
attr_reader :host
|
25
25
|
|
26
26
|
# @return [ nil ] port Will always be nil.
|
@@ -53,7 +53,7 @@ module Mongo
|
|
53
53
|
# @param [ String ] host The host.
|
54
54
|
#
|
55
55
|
# @since 2.0.0
|
56
|
-
def initialize(host)
|
56
|
+
def initialize(host, port=nil, host_name=nil)
|
57
57
|
@host = host
|
58
58
|
end
|
59
59
|
|
data/lib/mongo/auth/user/view.rb
CHANGED
@@ -88,7 +88,11 @@ module Mongo
|
|
88
88
|
#
|
89
89
|
# @since 2.0.0
|
90
90
|
def update(user_or_name, options = {})
|
91
|
-
|
91
|
+
user = generate(user_or_name, options)
|
92
|
+
Operation::Write::UpdateUser.new(
|
93
|
+
user: user,
|
94
|
+
db_name: database.name
|
95
|
+
).execute(next_primary.context)
|
92
96
|
end
|
93
97
|
|
94
98
|
private
|
data/lib/mongo/client.rb
CHANGED
@@ -111,8 +111,10 @@ module Mongo
|
|
111
111
|
# seconds, in the connection pool for a connection to be checked in.
|
112
112
|
# @option options [ Float ] :connect_timeout The timeout, in seconds, to
|
113
113
|
# attempt a connection.
|
114
|
-
# @option options [
|
115
|
-
#
|
114
|
+
# @option options [ Hash ] :read The read preference options. They consist of a
|
115
|
+
# mode specified as a symbol, an array of hashes known as tag_sets,
|
116
|
+
# and two timing options: local_threshold and server_selection_timeout.
|
117
|
+
# :mode can be one of :secondary, :secondary_preferred, :primary,
|
116
118
|
# :primary_preferred, :nearest.
|
117
119
|
# @option options [ Array<Hash, String> ] :roles The list of roles for the
|
118
120
|
# user.
|
@@ -221,6 +223,32 @@ module Mongo
|
|
221
223
|
@write_concern ||= WriteConcern.get(options[:write])
|
222
224
|
end
|
223
225
|
|
226
|
+
# Get the names of all databases.
|
227
|
+
#
|
228
|
+
# @example Get the database names.
|
229
|
+
# client.database_names
|
230
|
+
#
|
231
|
+
# @return [ Array<String> ] The names of the databases.
|
232
|
+
#
|
233
|
+
# @since 2.0.5
|
234
|
+
def database_names
|
235
|
+
list_databases.collect{ |info| info['name'] }
|
236
|
+
end
|
237
|
+
|
238
|
+
# Get info for each database.
|
239
|
+
#
|
240
|
+
# @example Get the info for each database.
|
241
|
+
# client.list_databases
|
242
|
+
#
|
243
|
+
# @return [ Array<Hash> ] The info for each database.
|
244
|
+
#
|
245
|
+
# @since 2.0.5
|
246
|
+
def list_databases
|
247
|
+
use(Database::ADMIN).command(
|
248
|
+
listDatabases: 1
|
249
|
+
).first['databases']
|
250
|
+
end
|
251
|
+
|
224
252
|
private
|
225
253
|
|
226
254
|
def create_from_addresses(addresses, opts = {})
|
@@ -69,16 +69,29 @@ module Mongo
|
|
69
69
|
@options = options.dup
|
70
70
|
end
|
71
71
|
|
72
|
+
# Get the explain plan for the aggregation.
|
73
|
+
#
|
74
|
+
# @example Get the explain plan for the aggregation.
|
75
|
+
# aggregation.explain
|
76
|
+
#
|
77
|
+
# @return [ Hash ] The explain plan.
|
78
|
+
#
|
79
|
+
# @since 2.0.0
|
80
|
+
def explain
|
81
|
+
self.class.new(view, pipeline, options.merge(explain_options)).first
|
82
|
+
end
|
83
|
+
|
72
84
|
private
|
73
85
|
|
74
86
|
def aggregate_spec
|
75
|
-
{ :
|
87
|
+
{ :db_name => database.name,
|
88
|
+
:read => read,
|
89
|
+
:selector => {
|
76
90
|
:aggregate => collection.name,
|
77
91
|
:pipeline => pipeline,
|
78
92
|
:cursor => view.batch_size ? { :batchSize => view.batch_size } : {}
|
79
|
-
}.merge!(options)
|
80
|
-
|
81
|
-
:options => view.options }
|
93
|
+
}.merge!(options)
|
94
|
+
}
|
82
95
|
end
|
83
96
|
|
84
97
|
def explain_options
|
@@ -120,7 +120,7 @@ module Mongo
|
|
120
120
|
#
|
121
121
|
# @param [ Hash ] object The scope object.
|
122
122
|
#
|
123
|
-
# @return [ MapReduce, Hash ] The new MapReduce operation or
|
123
|
+
# @return [ MapReduce, Hash ] The new MapReduce operation or the value
|
124
124
|
# of the scope.
|
125
125
|
#
|
126
126
|
# @since 2.0.0
|
@@ -128,15 +128,32 @@ module Mongo
|
|
128
128
|
configure(:scope, object)
|
129
129
|
end
|
130
130
|
|
131
|
+
# Whether to include the timing information in the result.
|
132
|
+
#
|
133
|
+
# @example Set the verbose value.
|
134
|
+
# map_reduce.verbose(false)
|
135
|
+
#
|
136
|
+
# @param [ true, false ] value Whether to include timing information
|
137
|
+
# in the result.
|
138
|
+
#
|
139
|
+
# @return [ MapReduce, Hash ] The new MapReduce operation or the value
|
140
|
+
# of the verbose option.
|
141
|
+
#
|
142
|
+
# @since 2.0.5
|
143
|
+
def verbose(value = nil)
|
144
|
+
configure(:verbose, value)
|
145
|
+
end
|
146
|
+
|
131
147
|
private
|
132
148
|
|
133
149
|
def inline?
|
134
|
-
out.nil? || out == { inline: 1 }
|
150
|
+
out.nil? || out == { inline: 1 } || out == { 'inline' => 1 }
|
135
151
|
end
|
136
152
|
|
137
153
|
def map_reduce_spec
|
138
154
|
{
|
139
155
|
:db_name => database.name,
|
156
|
+
:read => read,
|
140
157
|
:selector => {
|
141
158
|
:mapreduce => collection.name,
|
142
159
|
:map => map,
|
data/lib/mongo/database.rb
CHANGED
@@ -102,6 +102,18 @@ module Mongo
|
|
102
102
|
View.new(self).collection_names(options)
|
103
103
|
end
|
104
104
|
|
105
|
+
# Get info on all the collections in the database.
|
106
|
+
#
|
107
|
+
# @example Get info on each collection.
|
108
|
+
# database.list_collections
|
109
|
+
#
|
110
|
+
# @return [ Array<Hash> ] Info for each collection in the database.
|
111
|
+
#
|
112
|
+
# @since 2.0.5
|
113
|
+
def list_collections
|
114
|
+
View.new(self).list_collections
|
115
|
+
end
|
116
|
+
|
105
117
|
# Get all the collections that belong to this database.
|
106
118
|
#
|
107
119
|
# @example Get all the collections.
|
data/lib/mongo/database/view.rb
CHANGED
@@ -57,6 +57,18 @@ module Mongo
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
# Get info on all the collections in the database.
|
61
|
+
#
|
62
|
+
# @example Get info on each collection.
|
63
|
+
# database.list_collections
|
64
|
+
#
|
65
|
+
# @return [ Array<Hash> ] Info for each collection in the database.
|
66
|
+
#
|
67
|
+
# @since 2.0.5
|
68
|
+
def list_collections
|
69
|
+
collections_info(next_primary)
|
70
|
+
end
|
71
|
+
|
60
72
|
# Create the new database view.
|
61
73
|
#
|
62
74
|
# @example Create the new database view.
|
data/lib/mongo/grid/fs.rb
CHANGED
@@ -75,12 +75,12 @@ module Mongo
|
|
75
75
|
# @since 2.0.0
|
76
76
|
def insert_one(file)
|
77
77
|
files_collection.insert_one(file.metadata)
|
78
|
-
|
79
|
-
|
80
|
-
validate_md5!(file)
|
81
|
-
else
|
82
|
-
result
|
78
|
+
inserts = file.chunks.reduce([]) do |ops, chunk|
|
79
|
+
ops << { :insert_one => chunk }
|
83
80
|
end
|
81
|
+
result = chunks_collection.bulk_write(inserts, ordered: true)
|
82
|
+
validate_md5!(file) if write_concern.get_last_error
|
83
|
+
file.id
|
84
84
|
end
|
85
85
|
|
86
86
|
# Create the GridFS.
|
data/lib/mongo/loggable.rb
CHANGED
@@ -45,9 +45,11 @@ module Mongo
|
|
45
45
|
rescue Exception => e
|
46
46
|
raise e
|
47
47
|
ensure
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
if Logger.allow?(level)
|
49
|
+
runtime = format("%.4fms", (Time.now.to_f - started.to_f) * 1000.0)
|
50
|
+
operations.each do |operation|
|
51
|
+
Logger.log(level, prefix, log_inspect(operation), runtime)
|
52
|
+
end
|
51
53
|
end
|
52
54
|
end
|
53
55
|
end
|
data/lib/mongo/logger.rb
CHANGED
@@ -34,7 +34,7 @@ module Mongo
|
|
34
34
|
#
|
35
35
|
# @since 2.0.0
|
36
36
|
def debug(prefix, message, runtime)
|
37
|
-
|
37
|
+
self.log(:debug, prefix, message, runtime)
|
38
38
|
end
|
39
39
|
|
40
40
|
# Log a error level message.
|
@@ -48,7 +48,7 @@ module Mongo
|
|
48
48
|
#
|
49
49
|
# @since 2.0.0
|
50
50
|
def error(prefix, message, runtime)
|
51
|
-
|
51
|
+
self.log(:error, prefix, message, runtime)
|
52
52
|
end
|
53
53
|
|
54
54
|
# Log a fatal level message.
|
@@ -62,7 +62,7 @@ module Mongo
|
|
62
62
|
#
|
63
63
|
# @since 2.0.0
|
64
64
|
def fatal(prefix, message, runtime)
|
65
|
-
|
65
|
+
self.log(:fatal, prefix, message, runtime)
|
66
66
|
end
|
67
67
|
|
68
68
|
# Log a info level message.
|
@@ -76,7 +76,7 @@ module Mongo
|
|
76
76
|
#
|
77
77
|
# @since 2.0.0
|
78
78
|
def info(prefix, message, runtime)
|
79
|
-
|
79
|
+
self.log(:info, prefix, message, runtime)
|
80
80
|
end
|
81
81
|
|
82
82
|
# Log a warn level message.
|
@@ -90,7 +90,7 @@ module Mongo
|
|
90
90
|
#
|
91
91
|
# @since 2.0.0
|
92
92
|
def warn(prefix, message, runtime)
|
93
|
-
|
93
|
+
self.log(:warn, prefix, message, runtime)
|
94
94
|
end
|
95
95
|
|
96
96
|
# Get the wrapped logger. If none was set will return a default debug
|
@@ -120,6 +120,22 @@ module Mongo
|
|
120
120
|
@logger = other
|
121
121
|
end
|
122
122
|
|
123
|
+
def log(level, prefix, message, runtime)
|
124
|
+
logger.send(level, format("%s | %s | runtime: %s".freeze, prefix, message, runtime))
|
125
|
+
end
|
126
|
+
|
127
|
+
def allow?(level)
|
128
|
+
logger.send(:"#{level}?")
|
129
|
+
end
|
130
|
+
|
131
|
+
def level
|
132
|
+
logger.level
|
133
|
+
end
|
134
|
+
|
135
|
+
def level=(level)
|
136
|
+
logger.level = level
|
137
|
+
end
|
138
|
+
|
123
139
|
private
|
124
140
|
|
125
141
|
def default_logger
|
@@ -43,6 +43,7 @@ module Mongo
|
|
43
43
|
include Executable
|
44
44
|
include Specifiable
|
45
45
|
include Limited
|
46
|
+
include ReadPreferrable
|
46
47
|
|
47
48
|
# The need primary error message.
|
48
49
|
#
|
@@ -62,7 +63,7 @@ module Mongo
|
|
62
63
|
#
|
63
64
|
# @since 2.0.0
|
64
65
|
def execute(context)
|
65
|
-
unless
|
66
|
+
unless valid_context?(context)
|
66
67
|
raise Error::NeedPrimaryServer.new(ERROR_MESSAGE)
|
67
68
|
end
|
68
69
|
execute_message(context)
|
@@ -76,24 +77,30 @@ module Mongo
|
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
# @return [ true, false ] Whether the operation can be executed on a secondary.
|
84
|
-
#
|
85
|
-
# @since 2.0.0
|
80
|
+
def valid_context?(context)
|
81
|
+
context.standalone? || context.mongos? || context.primary? || secondary_ok?
|
82
|
+
end
|
83
|
+
|
86
84
|
def secondary_ok?
|
87
85
|
selector[:pipeline].none? { |op| op.key?('$out') || op.key?(:$out) }
|
88
86
|
end
|
89
87
|
|
90
|
-
def
|
88
|
+
def query_coll
|
89
|
+
Database::COMMAND
|
90
|
+
end
|
91
|
+
|
92
|
+
def filter_selector(context)
|
91
93
|
return selector if context.features.write_command_enabled?
|
92
94
|
selector.reject{ |option, value| option.to_s == 'cursor' }
|
93
95
|
end
|
94
96
|
|
95
|
-
def
|
96
|
-
|
97
|
+
def update_selector(context)
|
98
|
+
if context.mongos? && read_pref = read.to_mongos
|
99
|
+
sel = selector[:$query] ? filter_selector(context) : { :$query => filter_selector(context) }
|
100
|
+
sel.merge(:$readPreference => read_pref)
|
101
|
+
else
|
102
|
+
filter_selector(context)
|
103
|
+
end
|
97
104
|
end
|
98
105
|
end
|
99
106
|
end
|