Class: Mongo::Connection
Overview
Instantiates and manages connections to MongoDB.
Direct Known Subclasses
Constant Summary
- TCPSocket =
::TCPSocket
- Mutex =
::Mutex
- ConditionVariable =
::ConditionVariable
- DEFAULT_PORT =
27017- STANDARD_HEADER_SIZE =
16- RESPONSE_HEADER_SIZE =
20- BINARY_ENCODING =
Encoding.find("binary")
- @@current_request_id =
Counter for generating unique request ids.
0
Instance Attribute Summary (collapse)
-
- (Object) auths
readonly
Returns the value of attribute auths.
-
- (Object) host_to_try
readonly
Returns the value of attribute host_to_try.
-
- (Object) logger
readonly
Returns the value of attribute logger.
-
- (Object) pool_size
readonly
Returns the value of attribute pool_size.
-
- (Object) primary
readonly
Returns the value of attribute primary.
-
- (Object) primary_pool
readonly
Returns the value of attribute primary_pool.
-
- (Object) safe
readonly
Returns the value of attribute safe.
-
- (Object) size
readonly
Returns the value of attribute size.
Class Method Summary (collapse)
-
+ (Mongo::Connection, Mongo::ReplSetConnection) from_uri(string, extra_opts = {})
Initialize a connection to MongoDB using the MongoDB URI spec:.
- + (Mongo::Connection) multi(nodes, opts = {}) deprecated Deprecated.
Instance Method Summary (collapse)
-
- (Mongo::DB) [](db_name)
Shortcut for returning a database.
-
- (Boolean) active?
Determine if the connection is active.
-
- (Hash) add_auth(db_name, username, password)
Save an authentication to this connection.
-
- (Boolean) apply_saved_authentication(opts = {})
Apply each of the saved database authentications.
- - (Object) authenticate_pools
-
- (Object) checkin_reader(socket)
Checkin a socket used for reading.
-
- (Object) checkin_writer(socket)
Checkin a socket used for writing.
-
- (Object) checkout_reader
Checkout a socket for reading (i.e., a secondary node).
-
- (Object) checkout_writer
Checkout a socket for writing (i.e., a primary node).
-
- (true) clear_auths
Remove all authenication information stored in this connection.
-
- (Object) close
Close the connection to the database.
-
- (Object) connect
(also: #reconnect)
Create a new socket and attempt to connect to master.
-
- (Boolean) connected?
It's possible that we defined connected as all nodes being connected??? NOTE: Do check if this needs to be more stringent.
- - (Boolean) connecting?
-
- (Object) copy_database(from, to, from_host = "localhost", username = nil, password = nil)
Copy the database from to to on localhost.
-
- (Hash) database_info
Return a hash with all database names and their respective sizes on disk.
-
- (Array) database_names
Return an array of database names.
-
- (Mongo::DB) db(db_name, opts = {})
Return a database with the given name.
-
- (Object) drop_database(name)
Drop a database.
-
- (String) host
The host name used for this connection.
-
- (Connection) initialize(host = nil, port = nil, opts = {})
constructor
Create a connection to single MongoDB instance.
-
- (Object) instrument(name, payload = {}, &blk)
Execute the block and log the operation described by name and payload.
-
- (BSON::OrderedHash) lock!
Fsync, then lock the mongod process against writes.
-
- (Boolean) locked?
Is this database locked against writes?.
- - (Object) logout_pools(db)
-
- (Integer) max_bson_size
Returns the maximum BSON object size as returned by the core server.
- - (Object) new_binary_string
-
- (Hash) ping
Checks if a server is alive.
-
- (Integer) port
The port used for this connection.
-
- (Boolean) read_primary?
(also: #primary?)
Determine whether we're reading from a primary node.
-
- (Array) receive_message(operation, message, log_message = nil, socket = nil, command = false)
Sends a message to the database and waits for the response.
-
- (Boolean) remove_auth(db_name)
Remove a saved authentication for this connection.
-
- (Integer) send_message(operation, message, log_message = nil)
Send a message to MongoDB, adding the necessary headers.
-
- (Hash) send_message_with_safe_check(operation, message, db_name, log_message = nil, last_error_params = false)
Sends a message to the database, waits for a response, and raises an exception if the operation has failed.
-
- (Hash) server_info
Get the build information for the current connection.
-
- (Mongo::ServerVersion) server_version
Get the build version of the current server.
-
- (Boolean) slave_ok?
Is it okay to connect to a slave?.
-
- (BSON::OrderedHash) unlock!
Unlock a previously fsync-locked mongod process.
Constructor Details
- (Connection) initialize(host = nil, port = nil, opts = {})
Create a connection to single MongoDB instance.
You may specify whether connection to slave is permitted. In all cases, the default host is "localhost" and the default port is 27017.
If you're connecting to a replica set, you'll need to use ReplSetConnection.new instead.
Once connected to a replica set, you can find out which nodes are primary, secondary, and arbiters with the corresponding accessors: Connection#primary, Connection#secondaries, and Connection#arbiters. This is useful if your application needs to connect manually to nodes other than the primary.
92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/mongo/connection.rb', line 92 def initialize(host=nil, port=nil, opts={}) @host_to_try = format_pair(host, port) # Host and port of current master. @host = @port = nil # slave_ok can be true only if one node is specified @slave_ok = opts[:slave_ok] setup(opts) end |
Instance Attribute Details
- (Object) auths (readonly)
Returns the value of attribute auths
38 39 40 |
# File 'lib/mongo/connection.rb', line 38 def auths @auths end |
- (Object) host_to_try (readonly)
Returns the value of attribute host_to_try
38 39 40 |
# File 'lib/mongo/connection.rb', line 38 def host_to_try @host_to_try end |
- (Object) logger (readonly)
Returns the value of attribute logger
38 39 40 |
# File 'lib/mongo/connection.rb', line 38 def logger @logger end |
- (Object) pool_size (readonly)
Returns the value of attribute pool_size
38 39 40 |
# File 'lib/mongo/connection.rb', line 38 def pool_size @pool_size end |
- (Object) primary (readonly)
Returns the value of attribute primary
38 39 40 |
# File 'lib/mongo/connection.rb', line 38 def primary @primary end |
- (Object) primary_pool (readonly)
Returns the value of attribute primary_pool
38 39 40 |
# File 'lib/mongo/connection.rb', line 38 def primary_pool @primary_pool end |
- (Object) safe (readonly)
Returns the value of attribute safe
38 39 40 |
# File 'lib/mongo/connection.rb', line 38 def safe @safe end |
- (Object) size (readonly)
Returns the value of attribute size
38 39 40 |
# File 'lib/mongo/connection.rb', line 38 def size @size end |
Class Method Details
+ (Mongo::Connection, Mongo::ReplSetConnection) from_uri(string, extra_opts = {})
Initialize a connection to MongoDB using the MongoDB URI spec:
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/mongo/connection.rb', line 145 def self.from_uri(string, extra_opts={}) uri = URIParser.new(string) opts = uri. opts.merge!(extra_opts) if uri.nodes.length == 1 opts.merge!({:auths => uri.auths}) Connection.new(uri.nodes[0][0], uri.nodes[0][1], opts) elsif uri.nodes.length > 1 nodes = uri.nodes.clone nodes_with_opts = nodes << opts ReplSetConnection.new(*nodes_with_opts) else raise MongoArgumentError, "No nodes specified. Please ensure that you've provided at least one node." end end |
+ (Mongo::Connection) multi(nodes, opts = {})
DEPRECATED
Initialize a connection to a MongoDB replica set using an array of seed nodes.
The seed nodes specified will be used on the initial connection to the replica set, but note that this list of nodes will be replced by the list of canonical nodes returned by running the is_master command on the replica set.
130 131 132 133 134 135 |
# File 'lib/mongo/connection.rb', line 130 def self.multi(nodes, opts={}) warn "Connection.multi is now deprecated. Please use ReplSetConnection.new instead." nodes << opts ReplSetConnection.new(*nodes) end |
Instance Method Details
- (Mongo::DB) [](db_name)
Shortcut for returning a database. Use DB#db to accept options.
308 309 310 |
# File 'lib/mongo/connection.rb', line 308 def [](db_name) DB.new(db_name, self, :safe => @safe) end |
- (Boolean) active?
Determine if the connection is active. In a normal case the server_info operation will be performed without issues, but if the connection was dropped by the server or for some reason the sockets are unsynchronized, a ConnectionFailure will be raised and the return will be false.
516 517 518 519 520 521 522 523 524 |
# File 'lib/mongo/connection.rb', line 516 def active? return false unless connected? ping true rescue ConnectionFailure false end |
- (Hash) add_auth(db_name, username, password)
Save an authentication to this connection. When connecting, the connection will attempt to re-authenticate on every db specificed in the list of auths. This method is called automatically by DB#authenticate.
Note: this method will not actually issue an authentication command. To do that, either run Connection#apply_saved_authentication or DB#authenticate.
230 231 232 233 234 235 236 237 238 |
# File 'lib/mongo/connection.rb', line 230 def add_auth(db_name, username, password) remove_auth(db_name) auth = {} auth['db_name'] = db_name auth['username'] = username auth['password'] = password @auths << auth auth end |
- (Boolean) apply_saved_authentication(opts = {})
Apply each of the saved database authentications.
208 209 210 211 212 213 214 215 |
# File 'lib/mongo/connection.rb', line 208 def apply_saved_authentication(opts={}) return false if @auths.empty? @auths.each do |auth| self[auth['db_name']].issue_authentication(auth['username'], auth['password'], false, :socket => opts[:socket]) end true end |
- (Object) authenticate_pools
262 263 264 |
# File 'lib/mongo/connection.rb', line 262 def authenticate_pools @primary_pool.authenticate_existing end |
- (Object) checkin_reader(socket)
Checkin a socket used for reading. Note: this is overridden in ReplSetConnection.
567 568 569 570 571 |
# File 'lib/mongo/connection.rb', line 567 def checkin_reader(socket) if @primary_pool @primary_pool.checkin(socket) end end |
- (Object) checkin_writer(socket)
Checkin a socket used for writing. Note: this is overridden in ReplSetConnection.
575 576 577 578 579 |
# File 'lib/mongo/connection.rb', line 575 def checkin_writer(socket) if @primary_pool @primary_pool.checkin(socket) end end |
- (Object) checkout_reader
Checkout a socket for reading (i.e., a secondary node). Note: this is overridden in ReplSetConnection.
553 554 555 556 |
# File 'lib/mongo/connection.rb', line 553 def checkout_reader connect unless connected? @primary_pool.checkout end |
- (Object) checkout_writer
Checkout a socket for writing (i.e., a primary node). Note: this is overridden in ReplSetConnection.
560 561 562 563 |
# File 'lib/mongo/connection.rb', line 560 def checkout_writer connect unless connected? @primary_pool.checkout end |
- (true) clear_auths
Remove all authenication information stored in this connection.
257 258 259 260 |
# File 'lib/mongo/connection.rb', line 257 def clear_auths @auths = [] true end |
- (Object) close
Close the connection to the database.
536 537 538 539 540 |
# File 'lib/mongo/connection.rb', line 536 def close @primary_pool.close if @primary_pool @primary_pool = nil @primary = nil end |
- (Object) connect Also known as: reconnect
Create a new socket and attempt to connect to master. If successful, sets host and port to master and returns the socket.
If connecting to a replica set, this method will replace the initially-provided seed list with any nodes known to the set.
477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 |
# File 'lib/mongo/connection.rb', line 477 def connect close config = check_is_master(@host_to_try) if config if config['ismaster'] == 1 || config['ismaster'] == true @read_primary = true elsif @slave_ok @read_primary = false end set_primary(@host_to_try) end if connected? BSON::BSON_CODER.update_max_bson_size(self) else raise ConnectionFailure, "Failed to connect to a master node at #{@host_to_try[0]}:#{@host_to_try[1]}" end end |
- (Boolean) connected?
It's possible that we defined connected as all nodes being connected??? NOTE: Do check if this needs to be more stringent. Probably not since if any node raises a connection failure, all nodes will be closed.
506 507 508 |
# File 'lib/mongo/connection.rb', line 506 def connected? @primary_pool && @primary_pool.host && @primary_pool.port end |
- (Boolean) connecting?
499 500 501 |
# File 'lib/mongo/connection.rb', line 499 def connecting? @nodes_to_try.length > 0 end |
- (Object) copy_database(from, to, from_host = "localhost", username = nil, password = nil)
Copy the database from to to on localhost. The from database is assumed to be on localhost, but an alternate host can be specified.
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 |
# File 'lib/mongo/connection.rb', line 327 def copy_database(from, to, from_host="localhost", username=nil, password=nil) oh = BSON::OrderedHash.new oh[:copydb] = 1 oh[:fromhost] = from_host oh[:fromdb] = from oh[:todb] = to if username || password unless username && password raise MongoArgumentError, "Both username and password must be supplied for authentication." end nonce_cmd = BSON::OrderedHash.new nonce_cmd[:copydbgetnonce] = 1 nonce_cmd[:fromhost] = from_host result = self["admin"].command(nonce_cmd) oh[:nonce] = result["nonce"] oh[:username] = username oh[:key] = Mongo::Support.auth_key(username, password, oh[:nonce]) end self["admin"].command(oh) end |
- (Hash) database_info
Return a hash with all database names and their respective sizes on disk.
274 275 276 277 278 279 |
# File 'lib/mongo/connection.rb', line 274 def database_info doc = self['admin'].command({:listDatabases => 1}) doc['databases'].each_with_object({}) do |db, info| info[db['name']] = db['sizeOnDisk'].to_i end end |
- (Array) database_names
Return an array of database names.
284 285 286 |
# File 'lib/mongo/connection.rb', line 284 def database_names database_info.keys end |
- (Mongo::DB) db(db_name, opts = {})
Return a database with the given name. See DB#new for valid options hash parameters.
297 298 299 |
# File 'lib/mongo/connection.rb', line 297 def db(db_name, opts={}) DB.new(db_name, self, opts) end |
- (Object) drop_database(name)
Drop a database.
315 316 317 |
# File 'lib/mongo/connection.rb', line 315 def drop_database(name) self[name].command(:dropDatabase => 1) end |
- (String) host
The host name used for this connection.
165 166 167 |
# File 'lib/mongo/connection.rb', line 165 def host @primary_pool.host end |
- (Object) instrument(name, payload = {}, &blk)
Execute the block and log the operation described by name and payload. TODO: Not sure if this should take a block.
584 585 586 587 588 |
# File 'lib/mongo/connection.rb', line 584 def instrument(name, payload = {}, &blk) res = yield log_operation(name, payload) res end |
- (BSON::OrderedHash) lock!
Fsync, then lock the mongod process against writes. Use this to get the datafiles in a state safe for snapshotting, backing up, etc.
180 181 182 183 184 185 |
# File 'lib/mongo/connection.rb', line 180 def lock! cmd = BSON::OrderedHash.new cmd[:fsync] = 1 cmd[:lock] = true self['admin'].command(cmd) end |
- (Boolean) locked?
Is this database locked against writes?
190 191 192 |
# File 'lib/mongo/connection.rb', line 190 def locked? self['admin']['$cmd.sys.inprog'].find_one['fsyncLock'] == 1 end |
- (Object) logout_pools(db)
266 267 268 |
# File 'lib/mongo/connection.rb', line 266 def logout_pools(db) @primary_pool.logout_existing(db) end |
- (Integer) max_bson_size
Returns the maximum BSON object size as returned by the core server. Use the 4MB default when the server doesn't report this.
546 547 548 549 |
# File 'lib/mongo/connection.rb', line 546 def max_bson_size config = self['admin'].command({:ismaster => 1}) config['maxBsonObjectSize'] || Mongo::DEFAULT_MAX_BSON_SIZE end |
- (Object) new_binary_string
878 879 880 |
# File 'lib/mongo/connection.rb', line 878 def new_binary_string "".force_encoding(BINARY_ENCODING) end |
- (Hash) ping
Checks if a server is alive. This command will return immediately even if the server is in a lock.
352 353 354 |
# File 'lib/mongo/connection.rb', line 352 def ping self["admin"].command({:ping => 1}) end |
- (Integer) port
The port used for this connection.
172 173 174 |
# File 'lib/mongo/connection.rb', line 172 def port @primary_pool.port end |
- (Boolean) read_primary? Also known as: primary?
Determine whether we're reading from a primary node. If false, this connection connects to a secondary node and @slave_ok is true.
530 531 532 |
# File 'lib/mongo/connection.rb', line 530 def read_primary? @read_primary end |
- (Array) receive_message(operation, message, log_message = nil, socket = nil, command = false)
Sends a message to the database and waits for the response.
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 |
# File 'lib/mongo/connection.rb', line 445 def (operation, , =nil, socket=nil, command=false) request_id = (, operation) = .to_s begin if socket sock = socket checkin = false else sock = (command ? checkout_writer : checkout_reader) checkin = true end result = '' @safe_mutexes[sock].synchronize do (, sock) result = receive(sock, request_id) end ensure if checkin command ? checkin_writer(sock) : checkin_reader(sock) end end result end |
- (Boolean) remove_auth(db_name)
Remove a saved authentication for this connection.
245 246 247 248 249 250 251 252 |
# File 'lib/mongo/connection.rb', line 245 def remove_auth(db_name) return unless @auths if @auths.reject! { |a| a['db_name'] == db_name } true else false end end |
- (Integer) send_message(operation, message, log_message = nil)
Send a message to MongoDB, adding the necessary headers.
385 386 387 388 389 390 391 392 393 394 |
# File 'lib/mongo/connection.rb', line 385 def (operation, , =nil) begin (, operation) = .to_s socket = checkout_writer (, socket) ensure checkin_writer(socket) end end |
- (Hash) send_message_with_safe_check(operation, message, db_name, log_message = nil, last_error_params = false)
Sends a message to the database, waits for a response, and raises an exception if the operation has failed.
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
# File 'lib/mongo/connection.rb', line 408 def (operation, , db_name, =nil, last_error_params=false) docs = num_received = cursor_id = '' (, operation) = BSON::ByteBuffer.new (, db_name, last_error_params) last_error_id = (, Mongo::Constants::OP_QUERY) = .append!().to_s begin sock = checkout_writer @safe_mutexes[sock].synchronize do (, sock) docs, num_received, cursor_id = receive(sock, last_error_id) end ensure checkin_writer(sock) end if num_received == 1 && (error = docs[0]['err'] || docs[0]['errmsg']) close if error == "not master" error = "wtimeout" if error == "timeout" raise Mongo::OperationFailure, docs[0]['code'].to_s + ': ' + error end docs[0] end |
- (Hash) server_info
Get the build information for the current connection.
359 360 361 |
# File 'lib/mongo/connection.rb', line 359 def server_info self["admin"].command({:buildinfo => 1}) end |
- (Mongo::ServerVersion) server_version
Get the build version of the current server.
368 369 370 |
# File 'lib/mongo/connection.rb', line 368 def server_version ServerVersion.new(server_info["version"]) end |
- (Boolean) slave_ok?
Is it okay to connect to a slave?
375 376 377 |
# File 'lib/mongo/connection.rb', line 375 def slave_ok? @slave_ok end |
- (BSON::OrderedHash) unlock!
Unlock a previously fsync-locked mongod process.
197 198 199 |
# File 'lib/mongo/connection.rb', line 197 def unlock! self['admin']['$cmd.sys.unlock'].find_one end |