mongo 0.18.3 → 0.19
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/README.rdoc +41 -50
- data/Rakefile +14 -4
- data/examples/gridfs.rb +25 -70
- data/lib/mongo.rb +4 -2
- data/lib/mongo/collection.rb +70 -89
- data/lib/mongo/connection.rb +203 -43
- data/lib/mongo/cursor.rb +7 -7
- data/lib/mongo/db.rb +61 -18
- data/lib/mongo/exceptions.rb +7 -1
- data/lib/mongo/gridfs.rb +8 -1
- data/lib/mongo/gridfs/chunk.rb +2 -1
- data/lib/mongo/gridfs/grid.rb +90 -0
- data/lib/mongo/gridfs/grid_file_system.rb +113 -0
- data/lib/mongo/gridfs/grid_io.rb +339 -0
- data/lib/mongo/gridfs/grid_store.rb +43 -18
- data/lib/mongo/types/binary.rb +5 -1
- data/lib/mongo/types/code.rb +1 -1
- data/lib/mongo/types/dbref.rb +3 -1
- data/lib/mongo/types/min_max_keys.rb +1 -1
- data/lib/mongo/types/objectid.rb +16 -55
- data/lib/mongo/types/regexp_of_holding.rb +1 -1
- data/lib/mongo/util/bson_c.rb +2 -2
- data/lib/mongo/util/bson_ruby.rb +22 -11
- data/lib/mongo/util/byte_buffer.rb +1 -1
- data/lib/mongo/util/conversions.rb +1 -1
- data/lib/mongo/util/ordered_hash.rb +6 -1
- data/lib/mongo/util/server_version.rb +1 -1
- data/lib/mongo/util/support.rb +1 -1
- data/mongo-ruby-driver.gemspec +1 -1
- data/test/auxillary/authentication_test.rb +68 -0
- data/test/auxillary/autoreconnect_test.rb +41 -0
- data/test/binary_test.rb +15 -0
- data/test/{test_bson.rb → bson_test.rb} +63 -6
- data/test/{test_byte_buffer.rb → byte_buffer_test.rb} +0 -0
- data/test/{test_chunk.rb → chunk_test.rb} +0 -0
- data/test/{test_collection.rb → collection_test.rb} +35 -39
- data/test/{test_connection.rb → connection_test.rb} +33 -3
- data/test/{test_conversions.rb → conversions_test.rb} +0 -0
- data/test/{test_cursor.rb → cursor_test.rb} +0 -7
- data/test/{test_db_api.rb → db_api_test.rb} +3 -6
- data/test/{test_db_connection.rb → db_connection_test.rb} +0 -0
- data/test/{test_db.rb → db_test.rb} +33 -15
- data/test/grid_file_system_test.rb +210 -0
- data/test/grid_io_test.rb +78 -0
- data/test/{test_grid_store.rb → grid_store_test.rb} +33 -2
- data/test/grid_test.rb +87 -0
- data/test/{test_objectid.rb → objectid_test.rb} +2 -33
- data/test/{test_ordered_hash.rb → ordered_hash_test.rb} +4 -0
- data/test/{test_slave_connection.rb → slave_connection_test.rb} +0 -0
- data/test/test_helper.rb +2 -2
- data/test/{test_threading.rb → threading_test.rb} +0 -0
- data/test/unit/collection_test.rb +12 -3
- data/test/unit/connection_test.rb +85 -24
- data/test/unit/cursor_test.rb +1 -2
- data/test/unit/db_test.rb +70 -69
- metadata +27 -23
- data/bin/objectid_benchmark.rb +0 -23
- data/bin/perf.rb +0 -30
- data/lib/mongo/admin.rb +0 -95
- data/lib/mongo/util/xml_to_ruby.rb +0 -112
- data/test/test_admin.rb +0 -67
- data/test/test_round_trip.rb +0 -114
data/lib/mongo/connection.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# --
|
2
|
-
# Copyright (C) 2008-
|
2
|
+
# Copyright (C) 2008-2010 10gen Inc.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -30,7 +30,10 @@ module Mongo
|
|
30
30
|
STANDARD_HEADER_SIZE = 16
|
31
31
|
RESPONSE_HEADER_SIZE = 20
|
32
32
|
|
33
|
-
|
33
|
+
MONGODB_URI_MATCHER = /(([.\w\d]+):([\w\d]+)@)?([.\w\d]+)(:([\w\d]+))?(\/([-\d\w]+))?/
|
34
|
+
MONGODB_URI_SPEC = "mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/database]"
|
35
|
+
|
36
|
+
attr_reader :logger, :size, :host, :port, :nodes, :auths, :sockets, :checked_out
|
34
37
|
|
35
38
|
# Counter for generating unique request ids.
|
36
39
|
@@current_request_id = 0
|
@@ -74,19 +77,26 @@ module Mongo
|
|
74
77
|
# @example localhost, 3000, where this node may be a slave
|
75
78
|
# Connection.new("localhost", 3000, :slave_ok => true)
|
76
79
|
#
|
77
|
-
# @example
|
78
|
-
# # On connection errors, Mongo::ConnectionFailure will be raised.
|
80
|
+
# @example DEPRECATED. To initialize a paired connection, use Connection.paired instead.
|
79
81
|
# Connection.new({:left => ["db1.example.com", 27017],
|
80
82
|
# :right => ["db2.example.com", 27017]})
|
81
83
|
#
|
82
|
-
# @example
|
84
|
+
# @example DEPRECATED. To initialize a paired connection, use Connection.paired instead.
|
83
85
|
# Connection.new({:left => ["db1.example.com", 27017],
|
84
86
|
# :right => ["db2.example.com", 27017]}, nil,
|
85
87
|
# :pool_size => 20, :timeout => 5)
|
86
88
|
#
|
87
89
|
# @see http://www.mongodb.org/display/DOCS/Replica+Pairs+in+Ruby Replica pairs in Ruby
|
90
|
+
#
|
91
|
+
# @core connections
|
88
92
|
def initialize(pair_or_host=nil, port=nil, options={})
|
89
|
-
@
|
93
|
+
@auths = []
|
94
|
+
|
95
|
+
if block_given?
|
96
|
+
@nodes = yield self
|
97
|
+
else
|
98
|
+
@nodes = format_pair(pair_or_host, port)
|
99
|
+
end
|
90
100
|
|
91
101
|
# Host and port of current master.
|
92
102
|
@host = @port = nil
|
@@ -121,12 +131,109 @@ module Mongo
|
|
121
131
|
connect_to_master if should_connect
|
122
132
|
end
|
123
133
|
|
134
|
+
# Initialize a paired connection to MongoDB.
|
135
|
+
#
|
136
|
+
# @param nodes [Array] An array of arrays, each of which specified a host and port.
|
137
|
+
# @param opts Takes the same options as Connection.new
|
138
|
+
#
|
139
|
+
# @example
|
140
|
+
# Connection.new([["db1.example.com", 27017],
|
141
|
+
# ["db2.example.com", 27017]])
|
142
|
+
#
|
143
|
+
# @example
|
144
|
+
# Connection.new([["db1.example.com", 27017],
|
145
|
+
# ["db2.example.com", 27017]],
|
146
|
+
# :pool_size => 20, :timeout => 5)
|
147
|
+
#
|
148
|
+
# @return [Mongo::Connection]
|
149
|
+
def self.paired(nodes, opts={})
|
150
|
+
unless nodes.length == 2 && nodes.all? {|n| n.is_a? Array}
|
151
|
+
raise MongoArgumentError, "Connection.paired requires that exactly two nodes be specified."
|
152
|
+
end
|
153
|
+
# Block returns an array, the first element being an array of nodes and the second an array
|
154
|
+
# of authorizations for the database.
|
155
|
+
new(nil, nil, opts) do |con|
|
156
|
+
[con.pair_val_to_connection(nodes[0]), con.pair_val_to_connection(nodes[1])]
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# Initialize a connection to MongoDB using the MongoDB URI spec:
|
161
|
+
#
|
162
|
+
# @param uri [String]
|
163
|
+
# A string of the format mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/database]
|
164
|
+
#
|
165
|
+
# @param opts Any of the options available for Connection.new
|
166
|
+
#
|
167
|
+
# @return [Mongo::Connection]
|
168
|
+
def self.from_uri(uri, opts={})
|
169
|
+
new(nil, nil, opts) do |con|
|
170
|
+
con.parse_uri(uri)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
# Apply each of the saved database authentications.
|
175
|
+
#
|
176
|
+
# @return [Boolean] returns true if authentications exist and succeeed, false
|
177
|
+
# if none exists.
|
178
|
+
#
|
179
|
+
# @raise [AuthenticationError] raises an exception if any one
|
180
|
+
# authentication fails.
|
181
|
+
def apply_saved_authentication
|
182
|
+
return false if @auths.empty?
|
183
|
+
@auths.each do |auth|
|
184
|
+
self[auth['db_name']].authenticate(auth['username'], auth['password'], false)
|
185
|
+
end
|
186
|
+
true
|
187
|
+
end
|
188
|
+
|
189
|
+
# Save an authentication to this connection. When connecting,
|
190
|
+
# the connection will attempt to re-authenticate on every db
|
191
|
+
# specificed in the list of auths. This method is called automatically
|
192
|
+
# by DB#authenticate.
|
193
|
+
#
|
194
|
+
# @param [String] db_name
|
195
|
+
# @param [String] username
|
196
|
+
# @param [String] password
|
197
|
+
#
|
198
|
+
# @return [Hash] a hash representing the authentication just added.
|
199
|
+
def add_auth(db_name, username, password)
|
200
|
+
remove_auth(db_name)
|
201
|
+
auth = {}
|
202
|
+
auth['db_name'] = db_name
|
203
|
+
auth['username'] = username
|
204
|
+
auth['password'] = password
|
205
|
+
@auths << auth
|
206
|
+
auth
|
207
|
+
end
|
208
|
+
|
209
|
+
# Remove a saved authentication for this connection.
|
210
|
+
#
|
211
|
+
# @param [String] db_name
|
212
|
+
#
|
213
|
+
# @return [Boolean]
|
214
|
+
def remove_auth(db_name)
|
215
|
+
return unless @auths
|
216
|
+
if @auths.reject! { |a| a['db_name'] == db_name }
|
217
|
+
true
|
218
|
+
else
|
219
|
+
false
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
# Remove all authenication information stored in this connection.
|
224
|
+
#
|
225
|
+
# @return [true] this operation return true because it always succeeds.
|
226
|
+
def clear_auths
|
227
|
+
@auths = []
|
228
|
+
true
|
229
|
+
end
|
230
|
+
|
124
231
|
# Return a hash with all database names
|
125
232
|
# and their respective sizes on disk.
|
126
233
|
#
|
127
234
|
# @return [Hash]
|
128
235
|
def database_info
|
129
|
-
doc = self['admin'].command(:listDatabases => 1)
|
236
|
+
doc = self['admin'].command({:listDatabases => 1}, false, true)
|
130
237
|
returning({}) do |info|
|
131
238
|
doc['databases'].each { |db| info[db['name']] = db['sizeOnDisk'].to_i }
|
132
239
|
end
|
@@ -145,6 +252,8 @@ module Mongo
|
|
145
252
|
# @param [String] db_name a valid database name.
|
146
253
|
#
|
147
254
|
# @return [Mongo::DB]
|
255
|
+
#
|
256
|
+
# @core databases db-instance_method
|
148
257
|
def db(db_name, options={})
|
149
258
|
DB.new(db_name, self, options.merge(:logger => @logger))
|
150
259
|
end
|
@@ -154,6 +263,8 @@ module Mongo
|
|
154
263
|
# @param [String] db_name a valid database name.
|
155
264
|
#
|
156
265
|
# @return [Mongo::DB]
|
266
|
+
#
|
267
|
+
# @core databases []-instance_method
|
157
268
|
def [](db_name)
|
158
269
|
DB.new(db_name, self, :logger => @logger)
|
159
270
|
end
|
@@ -177,7 +288,7 @@ module Mongo
|
|
177
288
|
oh[:fromhost] = from_host
|
178
289
|
oh[:fromdb] = from
|
179
290
|
oh[:todb] = to
|
180
|
-
self["admin"].command(oh)
|
291
|
+
self["admin"].command(oh, false, true)
|
181
292
|
end
|
182
293
|
|
183
294
|
# Increment and return the next available request id.
|
@@ -195,7 +306,7 @@ module Mongo
|
|
195
306
|
#
|
196
307
|
# @return [Hash]
|
197
308
|
def server_info
|
198
|
-
|
309
|
+
self["admin"].command({:buildinfo => 1}, false, true)
|
199
310
|
end
|
200
311
|
|
201
312
|
# Get the build version of the current server.
|
@@ -310,6 +421,7 @@ module Mongo
|
|
310
421
|
result = self['admin'].command({:ismaster => 1}, false, false, socket)
|
311
422
|
if result['ok'] == 1 && ((is_master = result['ismaster'] == 1) || @slave_ok)
|
312
423
|
@host, @port = host, port
|
424
|
+
apply_saved_authentication
|
313
425
|
end
|
314
426
|
|
315
427
|
# Note: slave_ok can be true only when connecting to a single node.
|
@@ -321,6 +433,7 @@ module Mongo
|
|
321
433
|
break if is_master || @slave_ok
|
322
434
|
rescue SocketError, SystemCallError, IOError => ex
|
323
435
|
socket.close if socket
|
436
|
+
close
|
324
437
|
false
|
325
438
|
end
|
326
439
|
end
|
@@ -343,6 +456,86 @@ module Mongo
|
|
343
456
|
@checked_out.clear
|
344
457
|
end
|
345
458
|
|
459
|
+
## Configuration helper methods
|
460
|
+
|
461
|
+
# Returns an array of host-port pairs.
|
462
|
+
#
|
463
|
+
# @private
|
464
|
+
def format_pair(pair_or_host, port)
|
465
|
+
case pair_or_host
|
466
|
+
when String
|
467
|
+
[[pair_or_host, port ? port.to_i : DEFAULT_PORT]]
|
468
|
+
when Hash
|
469
|
+
warn "Initializing a paired connection with Connection.new is deprecated. Use Connection.pair instead."
|
470
|
+
connections = []
|
471
|
+
connections << pair_val_to_connection(pair_or_host[:left])
|
472
|
+
connections << pair_val_to_connection(pair_or_host[:right])
|
473
|
+
connections
|
474
|
+
when nil
|
475
|
+
[['localhost', DEFAULT_PORT]]
|
476
|
+
end
|
477
|
+
end
|
478
|
+
|
479
|
+
# Convert an argument containing a host name string and a
|
480
|
+
# port number integer into a [host, port] pair array.
|
481
|
+
#
|
482
|
+
# @private
|
483
|
+
def pair_val_to_connection(a)
|
484
|
+
case a
|
485
|
+
when nil
|
486
|
+
['localhost', DEFAULT_PORT]
|
487
|
+
when String
|
488
|
+
[a, DEFAULT_PORT]
|
489
|
+
when Integer
|
490
|
+
['localhost', a]
|
491
|
+
when Array
|
492
|
+
a
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
# Parse a MongoDB URI. This method is used by Connection.from_uri.
|
497
|
+
# Returns an array of nodes and an array of db authorizations, if applicable.
|
498
|
+
#
|
499
|
+
# @private
|
500
|
+
def parse_uri(string)
|
501
|
+
if string =~ /^mongodb:\/\//
|
502
|
+
string = string[10..-1]
|
503
|
+
else
|
504
|
+
raise MongoArgumentError, "MongoDB URI must match this spec: #{MONGODB_URI_SPEC}"
|
505
|
+
end
|
506
|
+
|
507
|
+
nodes = []
|
508
|
+
auths = []
|
509
|
+
specs = string.split(',')
|
510
|
+
specs.each do |spec|
|
511
|
+
matches = MONGODB_URI_MATCHER.match(spec)
|
512
|
+
if !matches
|
513
|
+
raise MongoArgumentError, "MongoDB URI must match this spec: #{MONGODB_URI_SPEC}"
|
514
|
+
end
|
515
|
+
|
516
|
+
uname = matches[2]
|
517
|
+
pwd = matches[3]
|
518
|
+
host = matches[4]
|
519
|
+
port = matches[6] || DEFAULT_PORT
|
520
|
+
if !(port.to_s =~ /^\d+$/)
|
521
|
+
raise MongoArgumentError, "Invalid port #{port}; port must be specified as digits."
|
522
|
+
end
|
523
|
+
port = port.to_i
|
524
|
+
db = matches[8]
|
525
|
+
|
526
|
+
if (uname || pwd || db) && !(uname && pwd && db)
|
527
|
+
raise MongoArgumentError, "MongoDB URI must include all three of username, password, " +
|
528
|
+
"and db if any one of these is specified."
|
529
|
+
else
|
530
|
+
add_auth(db, uname, pwd)
|
531
|
+
end
|
532
|
+
|
533
|
+
nodes << [host, port]
|
534
|
+
end
|
535
|
+
|
536
|
+
nodes
|
537
|
+
end
|
538
|
+
|
346
539
|
private
|
347
540
|
|
348
541
|
# Return a socket to the pool.
|
@@ -513,43 +706,10 @@ module Mongo
|
|
513
706
|
message += chunk
|
514
707
|
end
|
515
708
|
rescue => ex
|
709
|
+
close
|
516
710
|
raise ConnectionFailure, "Operation failed with the following exception: #{ex}"
|
517
711
|
end
|
518
712
|
message
|
519
713
|
end
|
520
|
-
|
521
|
-
|
522
|
-
## Private helper methods
|
523
|
-
|
524
|
-
# Returns an array of host-port pairs.
|
525
|
-
def format_pair(pair_or_host, port)
|
526
|
-
case pair_or_host
|
527
|
-
when String
|
528
|
-
[[pair_or_host, port ? port.to_i : DEFAULT_PORT]]
|
529
|
-
when Hash
|
530
|
-
connections = []
|
531
|
-
connections << pair_val_to_connection(pair_or_host[:left])
|
532
|
-
connections << pair_val_to_connection(pair_or_host[:right])
|
533
|
-
connections
|
534
|
-
when nil
|
535
|
-
[['localhost', DEFAULT_PORT]]
|
536
|
-
end
|
537
|
-
end
|
538
|
-
|
539
|
-
# Turns an array containing a host name string and a
|
540
|
-
# port number integer into a [host, port] pair array.
|
541
|
-
def pair_val_to_connection(a)
|
542
|
-
case a
|
543
|
-
when nil
|
544
|
-
['localhost', DEFAULT_PORT]
|
545
|
-
when String
|
546
|
-
[a, DEFAULT_PORT]
|
547
|
-
when Integer
|
548
|
-
['localhost', a]
|
549
|
-
when Array
|
550
|
-
a
|
551
|
-
end
|
552
|
-
end
|
553
|
-
|
554
714
|
end
|
555
715
|
end
|
data/lib/mongo/cursor.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2008-
|
1
|
+
# Copyright (C) 2008-2010 10gen Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -29,6 +29,8 @@ module Mongo
|
|
29
29
|
# similar methods. Application developers shouldn't have to create cursors manually.
|
30
30
|
#
|
31
31
|
# @return [Cursor]
|
32
|
+
#
|
33
|
+
# @core cursors constructor_details
|
32
34
|
def initialize(collection, options={})
|
33
35
|
@db = collection.db
|
34
36
|
@collection = collection
|
@@ -76,12 +78,6 @@ module Mongo
|
|
76
78
|
doc
|
77
79
|
end
|
78
80
|
|
79
|
-
# @deprecated use Cursor#next_document instead.
|
80
|
-
def next_object
|
81
|
-
warn "Cursor#next_object is deprecated; please use Cursor#next_document instead."
|
82
|
-
next_document
|
83
|
-
end
|
84
|
-
|
85
81
|
# Get the size of the result set for this query.
|
86
82
|
#
|
87
83
|
# @return [Integer] the number of objects in the result set for this query. Does
|
@@ -131,6 +127,8 @@ module Mongo
|
|
131
127
|
# @return [Integer] the current number_to_return if no parameter is given.
|
132
128
|
#
|
133
129
|
# @raise [InvalidOperation] if this cursor has already been used.
|
130
|
+
#
|
131
|
+
# @core limit limit-instance_method
|
134
132
|
def limit(number_to_return=nil)
|
135
133
|
return @limit unless number_to_return
|
136
134
|
check_modifiable
|
@@ -200,6 +198,8 @@ module Mongo
|
|
200
198
|
# Get the explain plan for this cursor.
|
201
199
|
#
|
202
200
|
# @return [Hash] a document containing the explain plan for this cursor.
|
201
|
+
#
|
202
|
+
# @core explain explain-instance_method
|
203
203
|
def explain
|
204
204
|
c = Cursor.new(@collection, query_options_hash.merge(:limit => -@limit.abs, :explain => true))
|
205
205
|
explanation = c.next_document
|
data/lib/mongo/db.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# --
|
2
|
-
# Copyright (C) 2008-
|
2
|
+
# Copyright (C) 2008-2010 10gen Inc.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -62,6 +62,8 @@ module Mongo
|
|
62
62
|
# which should take a hash and return a hash which merges the original hash with any primary key
|
63
63
|
# fields the factory wishes to inject. (NOTE: if the object already has a primary key,
|
64
64
|
# the factory should not inject a new key).
|
65
|
+
#
|
66
|
+
# @core databases constructor_details
|
65
67
|
def initialize(db_name, connection, options={})
|
66
68
|
@name = validate_db_name(db_name)
|
67
69
|
@connection = connection
|
@@ -74,9 +76,16 @@ module Mongo
|
|
74
76
|
#
|
75
77
|
# @param [String] username
|
76
78
|
# @param [String] password
|
79
|
+
# @param [Boolean] save_auth
|
80
|
+
# Save this authentication to the connection object using Connection#add_auth. This
|
81
|
+
# will ensure that the authentication will be applied on database reconnect.
|
77
82
|
#
|
78
83
|
# @return [Boolean]
|
79
|
-
|
84
|
+
#
|
85
|
+
# @raise [AuthenticationError]
|
86
|
+
#
|
87
|
+
# @core authenticate authenticate-instance_method
|
88
|
+
def authenticate(username, password, save_auth=true)
|
80
89
|
doc = command(:getnonce => 1)
|
81
90
|
raise "error retrieving nonce: #{doc}" unless ok?(doc)
|
82
91
|
nonce = doc['nonce']
|
@@ -86,18 +95,60 @@ module Mongo
|
|
86
95
|
auth['user'] = username
|
87
96
|
auth['nonce'] = nonce
|
88
97
|
auth['key'] = Digest::MD5.hexdigest("#{nonce}#{username}#{hash_password(username, password)}")
|
89
|
-
ok?(command(auth))
|
98
|
+
if ok?(command(auth))
|
99
|
+
if save_auth
|
100
|
+
@connection.add_auth(@name, username, password)
|
101
|
+
end
|
102
|
+
true
|
103
|
+
else
|
104
|
+
raise(Mongo::AuthenticationError, "Failed to authenticate user '#{username}' on db '#{self.name}'")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Adds a user to this database for use with authentication. If the user already
|
109
|
+
# exists in the system, the password will be updated.
|
110
|
+
#
|
111
|
+
# @param [String] username
|
112
|
+
# @param [String] password
|
113
|
+
#
|
114
|
+
# @return [Hash] an object representing the user.
|
115
|
+
def add_user(username, password)
|
116
|
+
users = self[SYSTEM_USER_COLLECTION]
|
117
|
+
user = users.find_one({:user => username}) || {:user => username}
|
118
|
+
user['pwd'] = hash_password(username, password)
|
119
|
+
users.save(user)
|
120
|
+
return user
|
121
|
+
end
|
122
|
+
|
123
|
+
# Remove the given user from this database. Returns false if the user
|
124
|
+
# doesn't exist in the system.
|
125
|
+
#
|
126
|
+
# @param [String] username
|
127
|
+
#
|
128
|
+
# @return [Boolean]
|
129
|
+
def remove_user(username)
|
130
|
+
if self[SYSTEM_USER_COLLECTION].find_one({:user => username})
|
131
|
+
self[SYSTEM_USER_COLLECTION].remove({:user => username}, :safe => true)
|
132
|
+
else
|
133
|
+
return false
|
134
|
+
end
|
90
135
|
end
|
91
136
|
|
92
|
-
# Deauthorizes use for this database for this connection.
|
137
|
+
# Deauthorizes use for this database for this connection. Also removes
|
138
|
+
# any saved authorization in the connection class associated with this
|
139
|
+
# database.
|
93
140
|
#
|
94
141
|
# @raise [MongoDBError] if logging out fails.
|
95
142
|
#
|
96
143
|
# @return [Boolean]
|
97
144
|
def logout
|
98
145
|
doc = command(:logout => 1)
|
99
|
-
|
100
|
-
|
146
|
+
if ok?(doc)
|
147
|
+
@connection.remove_auth(@name)
|
148
|
+
true
|
149
|
+
else
|
150
|
+
raise MongoDBError, "error logging out: #{doc.inspect}"
|
151
|
+
end
|
101
152
|
end
|
102
153
|
|
103
154
|
# Get an array of collection names in this database.
|
@@ -170,12 +221,6 @@ module Mongo
|
|
170
221
|
raise MongoDBError, "Error creating collection: #{doc.inspect}"
|
171
222
|
end
|
172
223
|
|
173
|
-
# @deprecated all the admin methods are now included in the DB class.
|
174
|
-
def admin
|
175
|
-
warn "DB#admin has been DEPRECATED. All the admin functions are now available in the DB class itself."
|
176
|
-
Admin.new(self)
|
177
|
-
end
|
178
|
-
|
179
224
|
# Get a collection by name.
|
180
225
|
#
|
181
226
|
# @param [String] name the collection name.
|
@@ -386,6 +431,8 @@ module Mongo
|
|
386
431
|
# @param [Socket] sock a socket to use. This is mainly for internal use.
|
387
432
|
#
|
388
433
|
# @return [Hash]
|
434
|
+
#
|
435
|
+
# @core commands command_instance-method
|
389
436
|
def command(selector, admin=false, check_response=false, sock=nil)
|
390
437
|
raise MongoArgumentError, "command must be given a selector" unless selector.is_a?(Hash) && !selector.empty?
|
391
438
|
if selector.class.eql?(Hash) && selector.keys.length > 1
|
@@ -402,12 +449,6 @@ module Mongo
|
|
402
449
|
end
|
403
450
|
end
|
404
451
|
|
405
|
-
# @deprecated please use DB#command instead.
|
406
|
-
def db_command(*args)
|
407
|
-
warn "DB#db_command has been DEPRECATED. Please use DB#command instead."
|
408
|
-
command(args[0], args[1])
|
409
|
-
end
|
410
|
-
|
411
452
|
# A shortcut returning db plus dot plus collection name.
|
412
453
|
#
|
413
454
|
# @param [String] collection_name
|
@@ -439,6 +480,8 @@ module Mongo
|
|
439
480
|
# get the results using DB#profiling_info.
|
440
481
|
#
|
441
482
|
# @return [Symbol] :off, :slow_only, or :all
|
483
|
+
#
|
484
|
+
# @core profiling profiling_level-instance_method
|
442
485
|
def profiling_level
|
443
486
|
oh = OrderedHash.new
|
444
487
|
oh[:profile] = -1
|