Class: EM::Mongo::Database
- Inherits:
-
Object
- Object
- EM::Mongo::Database
- Defined in:
- lib/em-mongo/database.rb
Constant Summary
- SYSTEM_NAMESPACE_COLLECTION =
"system.namespaces"- SYSTEM_INDEX_COLLECTION =
"system.indexes"- SYSTEM_PROFILE_COLLECTION =
"system.profile"- SYSTEM_USER_COLLECTION =
"system.users"- SYSTEM_JS_COLLECTION =
"system.js"- SYSTEM_COMMAND_COLLECTION =
"$cmd"
Instance Attribute Summary (collapse)
-
- (Object) cache_time
The length of time that Collection.ensure_index should cache index calls.
Instance Method Summary (collapse)
-
- (EM::Mongo::RequestResponse) add_user(username, password)
Adds a user to this database for use with authentication.
-
- (EM::Mongo::RequestResponse) authenticate(username, password)
Authenticate with the given username and password.
-
- (EM::Mongo::Collection) collection(name = EM::Mongo::DEFAULT_NS)
Get a collection by name.
-
- (EM::Mongo::RequestResponse) collection_names
Get an array of collection names in this database.
-
- (EM::Mongo::RequestResponse) collections
Get an array of Collection instances, one for each collection in this database.
-
- (EM::Mongo::Cursor) collections_info(coll_name = nil)
Get info on system namespaces (collections).
-
- (EM::Mongo::RequestResponse) command(selector, opts = {})
Send a command to the database.
-
- (EM::Mongo::Connection) connection
Get the connection associated with this database.
-
- (EM::Mongo::RequestResponse) create_collection(name)
Create a collection.
-
- (EM::Mongo::RequestResponse) drop_collection(name)
Drop a collection by name.
-
- (EM::Mongo::RequestResponse) drop_index(collection_name, index_name)
Drop an index from a given collection.
-
- (EM::Mongo::RequestResponse) error?
Return true if an error was caused by the most recently executed database operation.
-
- (String) full_collection_name(collection_name)
A shortcut returning db plus dot plus collection name.
-
- (EM::Mongo::RequestResponse) get_last_error(opts = {})
Run the getlasterror command with the specified replication options.
-
- (EM::Mongo::RequestResponse) index_information(collection_name)
Get information on the indexes for the given collection.
-
- (Database) initialize(name = DEFAULT_DB, connection = nil)
constructor
A new instance of Database.
-
- (String) name
Get the name of this database.
-
- (EM::Mongo::RequestResponse) reset_error_history
Reset the error history of this database.
Constructor Details
- (Database) initialize(name = DEFAULT_DB, connection = nil)
A new instance of Database
19 20 21 22 23 24 25 |
# File 'lib/em-mongo/database.rb', line 19 def initialize(name = DEFAULT_DB, connection = nil) @db_name = name @em_connection = connection || EM::Mongo::Connection.new @collection = nil @collections = {} @cache_time = 300 #5 minutes. end |
Instance Attribute Details
- (Object) cache_time
The length of time that Collection.ensure_index should cache index calls
12 13 14 |
# File 'lib/em-mongo/database.rb', line 12 def cache_time @cache_time end |
Instance Method Details
- (EM::Mongo::RequestResponse) add_user(username, password)
Adds a user to this database for use with authentication. If the user already exists in the system, the password will be updated.
374 375 376 377 378 379 380 381 382 383 384 |
# File 'lib/em-mongo/database.rb', line 374 def add_user(username, password) response = RequestResponse.new user_resp = self.collection(SYSTEM_USER_COLLECTION).first({:user => username}) user_resp.callback do |res| user = res || {:user => username} user['pwd'] = EM::Mongo::Support.hash_password(username, password) response.succeed self.collection(SYSTEM_USER_COLLECTION).save(user) end user_resp.errback { |err| response.fail err } response end |
- (EM::Mongo::RequestResponse) authenticate(username, password)
Authenticate with the given username and password. Note that mongod must be started with the --auth option for authentication to be enabled.
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 |
# File 'lib/em-mongo/database.rb', line 339 def authenticate(username, password) response = RequestResponse.new auth_resp = self.collection(SYSTEM_COMMAND_COLLECTION).first({'getnonce' => 1}) auth_resp.callback do |res| if not res or not res['nonce'] response.succeed false else auth = BSON::OrderedHash.new auth['authenticate'] = 1 auth['user'] = username auth['nonce'] = res['nonce'] auth['key'] = EM::Mongo::Support.auth_key(username, password, res['nonce']) auth_resp2 = self.collection(SYSTEM_COMMAND_COLLECTION).first(auth) auth_resp2.callback do |res| if EM::Mongo::Support.ok?(res) response.succeed true else response.fail res end end auth_resp2.errback { |err| response.fail err } end end auth_resp.errback { |err| response.fail err } response end |
- (EM::Mongo::Collection) collection(name = EM::Mongo::DEFAULT_NS)
Get a collection by name.
32 33 34 |
# File 'lib/em-mongo/database.rb', line 32 def collection(name = EM::Mongo::DEFAULT_NS) @collections[name] ||= EM::Mongo::Collection.new(@db_name, name, @em_connection) end |
- (EM::Mongo::RequestResponse) collection_names
Get an array of collection names in this database.
53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/em-mongo/database.rb', line 53 def collection_names response = RequestResponse.new name_resp = collections_info.to_a name_resp.callback do |docs| names = docs.collect{ |doc| doc['name'] || '' } names = names.delete_if {|name| name.index(self.name).nil? || name.index('$')} names = names.map{ |name| name.sub(self.name + '.','')} response.succeed(names) end name_resp.errback { |err| response.fail err } response end |
- (EM::Mongo::RequestResponse) collections
Get an array of Collection instances, one for each collection in this database.
69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/em-mongo/database.rb', line 69 def collections response = RequestResponse.new name_resp = collection_names name_resp.callback do |names| response.succeed names.map do |name| EM::Mongo::Collection.new(@db_name, name, @em_connection) end end name_resp.errback { |err| response.fail err } response end |
- (EM::Mongo::Cursor) collections_info(coll_name = nil)
Get info on system namespaces (collections). This method returns a cursor which can be iterated over. For each collection, a hash will be yielded containing a 'name' string and, optionally, an 'options' hash.
88 89 90 91 92 |
# File 'lib/em-mongo/database.rb', line 88 def collections_info(coll_name=nil) selector = {} selector[:name] = full_collection_name(coll_name) if coll_name Cursor.new(EM::Mongo::Collection.new(@db_name, SYSTEM_NAMESPACE_COLLECTION, @em_connection), :selector => selector) end |
- (EM::Mongo::RequestResponse) command(selector, opts = {})
Send a command to the database.
Note: DB commands must start with the "command" key. For this reason, any selector containing more than one key must be an OrderedHash.
Note also that a command in MongoDB is just a kind of query that occurs on the system command collection ($cmd). Examine this method's implementation to see how it works.
key, specifying the command to be performed. In Ruby 1.9, OrderedHash isn't necessary since hashes are ordered by default.
command fails.
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 |
# File 'lib/em-mongo/database.rb', line 300 def command(selector, opts={}) check_response = opts.fetch(:check_response, true) raise MongoArgumentError, "command must be given a selector" unless selector.is_a?(Hash) && !selector.empty? if selector.keys.length > 1 && RUBY_VERSION < '1.9' && selector.class != BSON::OrderedHash raise MongoArgumentError, "DB#command requires an OrderedHash when hash contains multiple keys" end response = RequestResponse.new cmd_resp = Cursor.new(self.collection(SYSTEM_COMMAND_COLLECTION), :limit => -1, :selector => selector).next_document cmd_resp.callback do |doc| if doc.nil? response.fail([OperationFailure, "Database command '#{selector.keys.first}' failed: returned null."]) elsif (check_response && !EM::Mongo::Support.ok?(doc)) response.fail([OperationFailure, "Database command '#{selector.keys.first}' failed: #{doc.inspect}"]) else response.succeed(doc) end end cmd_resp.errback do |err| response.fail([OperationFailure, "Database command '#{selector.keys.first}' failed: #{err[1]}"]) end response end |
- (EM::Mongo::Connection) connection
Get the connection associated with this database
39 40 41 |
# File 'lib/em-mongo/database.rb', line 39 def connection @em_connection end |
- (EM::Mongo::RequestResponse) create_collection(name)
Create a collection.
new collection. If strict is true, will raise an error if collection name already exists.
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/em-mongo/database.rb', line 116 def create_collection(name) response = RequestResponse.new names_resp = collection_names names_resp.callback do |names| if names.include?(name.to_s) response.succeed EM::Mongo::Collection.new(@db_name, name, @em_connection) end # Create a new collection. oh = BSON::OrderedHash.new oh[:create] = name cmd_resp = command(oh) cmd_resp.callback do |doc| if EM::Mongo::Support.ok?(doc) response.succeed EM::Mongo::Collection.new(@db_name, name, @em_connection) else response.fail [MongoDBError, "Error creating collection: #{doc.inspect}"] end end cmd_resp.errback { |err| response.fail err } end names_resp.errback { |err| response.fail err } response end |
- (EM::Mongo::RequestResponse) drop_collection(name)
Drop a collection by name.
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/em-mongo/database.rb', line 146 def drop_collection(name) response = RequestResponse.new names_resp = collection_names names_resp.callback do |names| if names.include?(name.to_s) cmd_resp = command(:drop=>name) cmd_resp.callback do |doc| response.succeed EM::Mongo::Support.ok?(doc) end cmd_resp.errback { |err| response.fail err } else response.succeed false end end names_resp.errback { |err| response.fail err } response end |
- (EM::Mongo::RequestResponse) drop_index(collection_name, index_name)
Drop an index from a given collection. Normally called from Collection#drop_index or Collection#drop_indexes.
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/em-mongo/database.rb', line 173 def drop_index(collection_name, index_name) response = RequestResponse.new oh = BSON::OrderedHash.new oh[:deleteIndexes] = collection_name oh[:index] = index_name.to_s cmd_resp = command(oh, :check_response => false) cmd_resp.callback do |doc| if EM::Mongo::Support.ok?(doc) response.succeed(true) else response.fail [MongoDBError, "Error with drop_index command: #{doc.inspect}"] end end cmd_resp.errback do |err| response.fail err end response end |
- (EM::Mongo::RequestResponse) error?
Return true if an error was caused by the most recently executed database operation.
246 247 248 249 250 251 252 253 254 255 256 |
# File 'lib/em-mongo/database.rb', line 246 def error? response = RequestResponse.new err_resp = get_last_error err_resp.callback do |doc| response.succeed doc['err'] != nil end err_resp.errback do |err| response.fail err end response end |
- (String) full_collection_name(collection_name)
A shortcut returning db plus dot plus collection name.
274 275 276 |
# File 'lib/em-mongo/database.rb', line 274 def full_collection_name(collection_name) "#{name}.#{collection_name}" end |
- (EM::Mongo::RequestResponse) get_last_error(opts = {})
Run the getlasterror command with the specified replication options.
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
# File 'lib/em-mongo/database.rb', line 225 def get_last_error(opts={}) response = RequestResponse.new cmd = BSON::OrderedHash.new cmd[:getlasterror] = 1 cmd.merge!(opts) cmd_resp = command(cmd, :check_response => false) cmd_resp.callback do |doc| if EM::Mongo::Support.ok?(doc) response.succeed doc else response.fail [MongoDBError, "error retrieving last error: #{doc.inspect}"] end end cmd_resp.errback { |err| response.fail err } response end |
- (EM::Mongo::RequestResponse) index_information(collection_name)
Get information on the indexes for the given collection. Normally called by Collection#index_information.
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/em-mongo/database.rb', line 199 def index_information(collection_name) response = RequestResponse.new sel = {:ns => full_collection_name(collection_name)} idx_resp = Cursor.new(self.collection(SYSTEM_INDEX_COLLECTION), :selector => sel).to_a idx_resp.callback do |indexes| info = indexes.inject({}) do |info, index| info[index['name']] = index info end response.succeed info end idx_resp.errback do |err| fail err end response end |
- (String) name
Get the name of this database
46 47 48 |
# File 'lib/em-mongo/database.rb', line 46 def name @db_name end |
- (EM::Mongo::RequestResponse) reset_error_history
Reset the error history of this database
Calls to DB#previous_error will only return errors that have occurred since the most recent call to this method.
264 265 266 |
# File 'lib/em-mongo/database.rb', line 264 def reset_error_history command(:reseterror => 1) end |