mongo 2.0.6 → 2.1.0.beta
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.rb +2 -0
- data/lib/mongo/bulk_write.rb +1 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
- data/lib/mongo/bulk_write/deletable.rb +8 -7
- data/lib/mongo/bulk_write/insertable.rb +4 -3
- data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
- data/lib/mongo/bulk_write/replacable.rb +4 -3
- data/lib/mongo/bulk_write/result.rb +138 -0
- data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
- data/lib/mongo/bulk_write/updatable.rb +8 -7
- data/lib/mongo/client.rb +36 -4
- data/lib/mongo/cluster.rb +39 -4
- data/lib/mongo/cluster/topology/replica_set.rb +20 -4
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/collection.rb +282 -29
- data/lib/mongo/collection/view/aggregation.rb +32 -4
- data/lib/mongo/collection/view/iterable.rb +2 -1
- data/lib/mongo/collection/view/map_reduce.rb +3 -1
- data/lib/mongo/collection/view/readable.rb +89 -14
- data/lib/mongo/collection/view/writable.rb +11 -5
- data/lib/mongo/cursor.rb +11 -3
- data/lib/mongo/dbref.rb +113 -0
- data/lib/mongo/error.rb +6 -2
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/grid/file.rb +1 -1
- data/lib/mongo/grid/fs.rb +2 -5
- data/lib/mongo/monitoring.rb +199 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
- data/lib/mongo/monitoring/event.rb +17 -0
- data/lib/mongo/monitoring/event/command_failed.rb +96 -0
- data/lib/mongo/monitoring/event/command_started.rb +88 -0
- data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
- data/lib/mongo/monitoring/publishable.rb +96 -0
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/operation/executable.rb +1 -1
- data/lib/mongo/operation/parallel_scan.rb +76 -0
- data/lib/mongo/operation/parallel_scan/result.rb +72 -0
- data/lib/mongo/operation/specifiable.rb +18 -0
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
- data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
- data/lib/mongo/protocol/delete.rb +8 -13
- data/lib/mongo/protocol/get_more.rb +13 -13
- data/lib/mongo/protocol/insert.rb +8 -13
- data/lib/mongo/protocol/kill_cursors.rb +7 -11
- data/lib/mongo/protocol/query.rb +58 -20
- data/lib/mongo/protocol/reply.rb +12 -0
- data/lib/mongo/protocol/update.rb +13 -14
- data/lib/mongo/server.rb +23 -2
- data/lib/mongo/server/connectable.rb +0 -22
- data/lib/mongo/server/connection.rb +29 -0
- data/lib/mongo/server/description.rb +23 -1
- data/lib/mongo/server/monitor.rb +17 -1
- data/lib/mongo/server/monitor/connection.rb +24 -0
- data/lib/mongo/socket/ssl.rb +28 -16
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/uri.rb +12 -5
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/auth/cr_spec.rb +9 -1
- data/spec/mongo/auth/ldap_spec.rb +9 -1
- data/spec/mongo/auth/scram_spec.rb +9 -1
- data/spec/mongo/auth/x509_spec.rb +9 -1
- data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
- data/spec/mongo/client_spec.rb +42 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
- data/spec/mongo/cluster/topology/single_spec.rb +12 -4
- data/spec/mongo/cluster_spec.rb +55 -10
- data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
- data/spec/mongo/collection/view/readable_spec.rb +251 -6
- data/spec/mongo/collection/view/writable_spec.rb +4 -4
- data/spec/mongo/collection/view_spec.rb +233 -71
- data/spec/mongo/collection_spec.rb +905 -9
- data/spec/mongo/crud_spec.rb +2 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/dbref_spec.rb +149 -0
- data/spec/mongo/monitoring_spec.rb +168 -0
- data/spec/mongo/operation/map_reduce_spec.rb +1 -1
- data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
- data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
- data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
- data/spec/mongo/operation/write/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/insert_spec.rb +2 -2
- data/spec/mongo/operation/write/update_spec.rb +1 -1
- data/spec/mongo/protocol/query_spec.rb +0 -29
- data/spec/mongo/server/connection_pool_spec.rb +18 -6
- data/spec/mongo/server/connection_spec.rb +12 -4
- data/spec/mongo/server/description_spec.rb +7 -3
- data/spec/mongo/server/monitor_spec.rb +30 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
- data/spec/mongo/server_selection_spec.rb +14 -6
- data/spec/mongo/server_spec.rb +27 -8
- data/spec/mongo/socket/ssl_spec.rb +94 -8
- data/spec/mongo/uri_spec.rb +25 -9
- data/spec/spec_helper.rb +29 -20
- data/spec/support/authorization.rb +19 -4
- data/spec/support/certificates/client.pem +4 -4
- data/spec/support/crud/read.rb +9 -10
- data/spec/support/crud/write.rb +24 -20
- data/spec/support/sdam/rs/equal_electionids.yml +45 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
- data/spec/support/sdam/rs/null_election_id.yml +144 -0
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
- data/spec/support/server_discovery_and_monitoring.rb +19 -2
- data/spec/support/shared/bulk_write.rb +26 -22
- data/spec/support/shared/server_selector.rb +2 -1
- metadata +31 -7
- metadata.gz.sig +0 -0
- data/lib/mongo/error/invalid_uri_option.rb +0 -38
| @@ -76,6 +76,11 @@ module Mongo | |
| 76 76 | 
             
                  # @since 2.0.0
         | 
| 77 77 | 
             
                  INDEX_NAME = :index_name.freeze
         | 
| 78 78 |  | 
| 79 | 
            +
                  # The operation id constant.
         | 
| 80 | 
            +
                  #
         | 
| 81 | 
            +
                  # @since 2.1.0
         | 
| 82 | 
            +
                  OPERATION_ID = :operation_id.freeze
         | 
| 83 | 
            +
             | 
| 79 84 | 
             
                  # The field for options.
         | 
| 80 85 | 
             
                  #
         | 
| 81 86 | 
             
                  # @since 2.0.0
         | 
| @@ -287,6 +292,19 @@ module Mongo | |
| 287 292 | 
             
                    @spec = spec
         | 
| 288 293 | 
             
                  end
         | 
| 289 294 |  | 
| 295 | 
            +
                  # Get the operation id for the operation. Used for linking operations in
         | 
| 296 | 
            +
                  # monitoring.
         | 
| 297 | 
            +
                  #
         | 
| 298 | 
            +
                  # @example Get the operation id.
         | 
| 299 | 
            +
                  #   specifiable.operation_id
         | 
| 300 | 
            +
                  #
         | 
| 301 | 
            +
                  # @return [ Integer ] The operation id.
         | 
| 302 | 
            +
                  #
         | 
| 303 | 
            +
                  # @since 2.1.0
         | 
| 304 | 
            +
                  def operation_id
         | 
| 305 | 
            +
                    spec[OPERATION_ID]
         | 
| 306 | 
            +
                  end
         | 
| 307 | 
            +
             | 
| 290 308 | 
             
                  # Get the options for the operation.
         | 
| 291 309 | 
             
                  #
         | 
| 292 310 | 
             
                  # @example Get the options.
         | 
| @@ -94,7 +94,7 @@ module Mongo | |
| 94 94 | 
             
                    def execute_message(context)
         | 
| 95 95 | 
             
                      replies = messages.map do |m|
         | 
| 96 96 | 
             
                        context.with_connection do |connection|
         | 
| 97 | 
            -
                          result = LegacyResult.new(connection.dispatch([ m, gle ].compact))
         | 
| 97 | 
            +
                          result = LegacyResult.new(connection.dispatch([ m, gle ].compact, operation_id))
         | 
| 98 98 | 
             
                          if stop_sending?(result)
         | 
| 99 99 | 
             
                            return result
         | 
| 100 100 | 
             
                          else
         | 
| @@ -79,7 +79,7 @@ module Mongo | |
| 79 79 | 
             
                      replies = []
         | 
| 80 80 | 
             
                      messages.map do |m|
         | 
| 81 81 | 
             
                        context.with_connection do |connection|
         | 
| 82 | 
            -
                          result = LegacyResult.new(connection.dispatch([ m, gle ].compact), @ids)
         | 
| 82 | 
            +
                          result = LegacyResult.new(connection.dispatch([ m, gle ].compact, operation_id), @ids)
         | 
| 83 83 | 
             
                          replies << result.reply
         | 
| 84 84 | 
             
                          if stop_sending?(result)
         | 
| 85 85 | 
             
                            return LegacyResult.new(replies, @ids)
         | 
| @@ -32,7 +32,7 @@ module Mongo | |
| 32 32 | 
             
                    def aggregate_write_errors(indexes)
         | 
| 33 33 | 
             
                      @replies.reduce(nil) do |errors, reply|
         | 
| 34 34 | 
             
                        if reply.documents.first['writeErrors']
         | 
| 35 | 
            -
                          write_errors = reply.documents.first[ | 
| 35 | 
            +
                          write_errors = reply.documents.first[Error::WRITE_ERRORS].collect do |we|
         | 
| 36 36 | 
             
                            we.merge!('index' => indexes[we['index']])
         | 
| 37 37 | 
             
                          end
         | 
| 38 38 | 
             
                          (errors || []) << write_errors if write_errors
         | 
| @@ -53,7 +53,7 @@ module Mongo | |
| 53 53 | 
             
                    # @since 2.0.0
         | 
| 54 54 | 
             
                    def aggregate_write_concern_errors(indexes)
         | 
| 55 55 | 
             
                      @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
         | 
| 56 | 
            -
                        if write_concern_errors = reply.documents.first[ | 
| 56 | 
            +
                        if write_concern_errors = reply.documents.first[Error::WRITE_CONCERN_ERRORS]
         | 
| 57 57 | 
             
                          (errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
         | 
| 58 58 | 
             
                              wce.merge!('index' => indexes[wce['index']])
         | 
| 59 59 | 
             
                              (errs || []) << write_concern_error
         | 
| @@ -101,7 +101,7 @@ module Mongo | |
| 101 101 | 
             
                    def execute_message(context)
         | 
| 102 102 | 
             
                      replies = messages.map do |m|
         | 
| 103 103 | 
             
                        context.with_connection do |connection|
         | 
| 104 | 
            -
                          result = LegacyResult.new(connection.dispatch([ m, gle ].compact))
         | 
| 104 | 
            +
                          result = LegacyResult.new(connection.dispatch([ m, gle ].compact, operation_id))
         | 
| 105 105 | 
             
                          if stop_sending?(result)
         | 
| 106 106 | 
             
                            return result
         | 
| 107 107 | 
             
                          else
         | 
| @@ -89,10 +89,22 @@ module Mongo | |
| 89 89 | 
             
                        end
         | 
| 90 90 | 
             
                      end
         | 
| 91 91 |  | 
| 92 | 
            +
                      # Get the upserted documents.
         | 
| 93 | 
            +
                      #
         | 
| 94 | 
            +
                      # @example Get upserted documents.
         | 
| 95 | 
            +
                      #   result.upserted
         | 
| 96 | 
            +
                      #
         | 
| 97 | 
            +
                      # @return [ Array<BSON::Document> ] The upserted document info
         | 
| 98 | 
            +
                      #
         | 
| 99 | 
            +
                      # @since 2.1.0
         | 
| 100 | 
            +
                      def upserted
         | 
| 101 | 
            +
                        reply.documents.first[UPSERTED] || []
         | 
| 102 | 
            +
                      end
         | 
| 103 | 
            +
             | 
| 92 104 | 
             
                      private
         | 
| 93 105 |  | 
| 94 106 | 
             
                      def upsert?(reply)
         | 
| 95 | 
            -
                         | 
| 107 | 
            +
                        upserted.any?
         | 
| 96 108 | 
             
                      end
         | 
| 97 109 | 
             
                    end
         | 
| 98 110 |  | 
| @@ -41,27 +41,22 @@ module Mongo | |
| 41 41 | 
             
                  #
         | 
| 42 42 | 
             
                  #   Supported flags: +:single_remove+
         | 
| 43 43 | 
             
                  def initialize(database, collection, selector, options = {})
         | 
| 44 | 
            +
                    @database = database
         | 
| 44 45 | 
             
                    @namespace = "#{database}.#{collection}"
         | 
| 45 46 | 
             
                    @selector  = selector
         | 
| 46 47 | 
             
                    @flags     = options[:flags] || []
         | 
| 47 48 | 
             
                  end
         | 
| 48 49 |  | 
| 49 | 
            -
                  #  | 
| 50 | 
            +
                  # Return the event payload for monitoring.
         | 
| 50 51 | 
             
                  #
         | 
| 51 | 
            -
                  # @example  | 
| 52 | 
            -
                  #    | 
| 52 | 
            +
                  # @example Return the event payload.
         | 
| 53 | 
            +
                  #   message.payload
         | 
| 53 54 | 
             
                  #
         | 
| 54 | 
            -
                  # @return [  | 
| 55 | 
            +
                  # @return [ Hash ] The event payload.
         | 
| 55 56 | 
             
                  #
         | 
| 56 | 
            -
                  # @since 2. | 
| 57 | 
            -
                  def  | 
| 58 | 
            -
                     | 
| 59 | 
            -
                    fields << ["%s |", "DELETE"]
         | 
| 60 | 
            -
                    fields << ["namespace=%s", namespace]
         | 
| 61 | 
            -
                    fields << ["selector=%s", selector.inspect]
         | 
| 62 | 
            -
                    fields << ["flags=%s", flags.inspect]
         | 
| 63 | 
            -
                    f, v = fields.transpose
         | 
| 64 | 
            -
                    f.join(" ") % v
         | 
| 57 | 
            +
                  # @since 2.1.0
         | 
| 58 | 
            +
                  def payload
         | 
| 59 | 
            +
                    { command_name: 'delete', database_name: @database, command: selector, request_id: request_id }
         | 
| 65 60 | 
             
                  end
         | 
| 66 61 |  | 
| 67 62 | 
             
                  private
         | 
| @@ -37,27 +37,27 @@ module Mongo | |
| 37 37 | 
             
                  # @param number_to_return [Integer] The number of documents to return.
         | 
| 38 38 | 
             
                  # @param cursor_id [Integer] The cursor id returned in a reply.
         | 
| 39 39 | 
             
                  def initialize(database, collection, number_to_return, cursor_id)
         | 
| 40 | 
            +
                    @database = database
         | 
| 40 41 | 
             
                    @namespace = "#{database}.#{collection}"
         | 
| 41 42 | 
             
                    @number_to_return = number_to_return
         | 
| 42 43 | 
             
                    @cursor_id = cursor_id
         | 
| 43 44 | 
             
                  end
         | 
| 44 45 |  | 
| 45 | 
            -
                  #  | 
| 46 | 
            +
                  # Return the event payload for monitoring.
         | 
| 46 47 | 
             
                  #
         | 
| 47 | 
            -
                  # @example  | 
| 48 | 
            -
                  #    | 
| 48 | 
            +
                  # @example Return the event payload.
         | 
| 49 | 
            +
                  #   message.payload
         | 
| 49 50 | 
             
                  #
         | 
| 50 | 
            -
                  # @return [  | 
| 51 | 
            +
                  # @return [ Hash ] The event payload.
         | 
| 51 52 | 
             
                  #
         | 
| 52 | 
            -
                  # @since 2. | 
| 53 | 
            -
                  def  | 
| 54 | 
            -
                     | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
                     | 
| 60 | 
            -
                    f.join(" ") % v
         | 
| 53 | 
            +
                  # @since 2.1.0
         | 
| 54 | 
            +
                  def payload
         | 
| 55 | 
            +
                    {
         | 
| 56 | 
            +
                      command_name: 'getmore',
         | 
| 57 | 
            +
                      database_name: @database,
         | 
| 58 | 
            +
                      command: { cursor_id: cursor_id, number_to_return: number_to_return },
         | 
| 59 | 
            +
                      request_id: request_id
         | 
| 60 | 
            +
                    }
         | 
| 61 61 | 
             
                  end
         | 
| 62 62 |  | 
| 63 63 | 
             
                  # Get more messages require replies from the database.
         | 
| @@ -49,27 +49,22 @@ module Mongo | |
| 49 49 | 
             
                  #
         | 
| 50 50 | 
             
                  #   Supported flags: +:continue_on_error+
         | 
| 51 51 | 
             
                  def initialize(database, collection, documents, options = {})
         | 
| 52 | 
            +
                    @database = database
         | 
| 52 53 | 
             
                    @namespace = "#{database}.#{collection}"
         | 
| 53 54 | 
             
                    @documents = documents
         | 
| 54 55 | 
             
                    @flags = options[:flags] || []
         | 
| 55 56 | 
             
                  end
         | 
| 56 57 |  | 
| 57 | 
            -
                  #  | 
| 58 | 
            +
                  # Return the event payload for monitoring.
         | 
| 58 59 | 
             
                  #
         | 
| 59 | 
            -
                  # @example  | 
| 60 | 
            -
                  #    | 
| 60 | 
            +
                  # @example Return the event payload.
         | 
| 61 | 
            +
                  #   message.payload
         | 
| 61 62 | 
             
                  #
         | 
| 62 | 
            -
                  # @return [  | 
| 63 | 
            +
                  # @return [ Hash ] The event payload.
         | 
| 63 64 | 
             
                  #
         | 
| 64 | 
            -
                  # @since 2. | 
| 65 | 
            -
                  def  | 
| 66 | 
            -
                     | 
| 67 | 
            -
                    fields << ["%s |", "INSERT"]
         | 
| 68 | 
            -
                    fields << ["namespace=%s", namespace]
         | 
| 69 | 
            -
                    fields << ["documents=%s", documents.inspect]
         | 
| 70 | 
            -
                    fields << ["flags=%s", flags.inspect]
         | 
| 71 | 
            -
                    f, v = fields.transpose
         | 
| 72 | 
            -
                    f.join(" ") % v
         | 
| 65 | 
            +
                  # @since 2.1.0
         | 
| 66 | 
            +
                  def payload
         | 
| 67 | 
            +
                    { command_name: 'insert', database_name: @database, command: documents, request_id: request_id }
         | 
| 73 68 | 
             
                  end
         | 
| 74 69 |  | 
| 75 70 | 
             
                  private
         | 
| @@ -35,20 +35,16 @@ module Mongo | |
| 35 35 | 
             
                    @id_count   = @cursor_ids.size
         | 
| 36 36 | 
             
                  end
         | 
| 37 37 |  | 
| 38 | 
            -
                  #  | 
| 38 | 
            +
                  # Return the event payload for monitoring.
         | 
| 39 39 | 
             
                  #
         | 
| 40 | 
            -
                  # @example  | 
| 41 | 
            -
                  #    | 
| 40 | 
            +
                  # @example Return the event payload.
         | 
| 41 | 
            +
                  #   message.payload
         | 
| 42 42 | 
             
                  #
         | 
| 43 | 
            -
                  # @return [  | 
| 43 | 
            +
                  # @return [ Hash ] The event payload.
         | 
| 44 44 | 
             
                  #
         | 
| 45 | 
            -
                  # @since 2. | 
| 46 | 
            -
                  def  | 
| 47 | 
            -
                     | 
| 48 | 
            -
                    fields << ["%s |", "KILLCURSORS"]
         | 
| 49 | 
            -
                    fields << ["cursor_ids=%s", cursor_ids.inspect]
         | 
| 50 | 
            -
                    f, v = fields.transpose
         | 
| 51 | 
            -
                    f.join(" ") % v
         | 
| 45 | 
            +
                  # @since 2.1.0
         | 
| 46 | 
            +
                  def payload
         | 
| 47 | 
            +
                    { command_name: 'killcursors', command: { cursor_ids: cursor_ids }, request_id: request_id }
         | 
| 52 48 | 
             
                  end
         | 
| 53 49 |  | 
| 54 50 | 
             
                  private
         | 
    
        data/lib/mongo/protocol/query.rb
    CHANGED
    
    | @@ -64,33 +64,75 @@ module Mongo | |
| 64 64 | 
             
                  #   Supported flags: +:tailable_cursor+, +:slave_ok+, +:oplog_replay+,
         | 
| 65 65 | 
             
                  #   +:no_cursor_timeout+, +:await_data+, +:exhaust+, +:partial+
         | 
| 66 66 | 
             
                  def initialize(database, collection, selector, options = {})
         | 
| 67 | 
            +
                    @database    = database
         | 
| 67 68 | 
             
                    @namespace   = "#{database}.#{collection}"
         | 
| 68 69 | 
             
                    @selector    = selector
         | 
| 70 | 
            +
                    @options     = options
         | 
| 69 71 | 
             
                    @project     = options[:project]
         | 
| 70 72 | 
             
                    @skip        = options[:skip]  || 0
         | 
| 71 73 | 
             
                    @limit       = options[:limit] || 0
         | 
| 72 74 | 
             
                    @flags       = options[:flags] || []
         | 
| 73 75 | 
             
                  end
         | 
| 74 76 |  | 
| 75 | 
            -
                  #  | 
| 77 | 
            +
                  # Return the event payload for monitoring.
         | 
| 76 78 | 
             
                  #
         | 
| 77 | 
            -
                  # @example  | 
| 78 | 
            -
                  #    | 
| 79 | 
            +
                  # @example Return the event payload.
         | 
| 80 | 
            +
                  #   message.payload
         | 
| 79 81 | 
             
                  #
         | 
| 80 | 
            -
                  # @return [  | 
| 82 | 
            +
                  # @return [ Hash ] The event payload.
         | 
| 81 83 | 
             
                  #
         | 
| 82 | 
            -
                  # @since 2. | 
| 83 | 
            -
                  def  | 
| 84 | 
            -
                     | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
                     | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 84 | 
            +
                  # @since 2.1.0
         | 
| 85 | 
            +
                  def payload
         | 
| 86 | 
            +
                    {
         | 
| 87 | 
            +
                      command_name: command_name,
         | 
| 88 | 
            +
                      database_name: @database,
         | 
| 89 | 
            +
                      command: arguments,
         | 
| 90 | 
            +
                      request_id: request_id
         | 
| 91 | 
            +
                    }
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  # If the message a command?
         | 
| 95 | 
            +
                  #
         | 
| 96 | 
            +
                  # @example Is the message a command?
         | 
| 97 | 
            +
                  #   message.command?
         | 
| 98 | 
            +
                  #
         | 
| 99 | 
            +
                  # @return [ true, false ] If the message is a command.
         | 
| 100 | 
            +
                  #
         | 
| 101 | 
            +
                  # @since 2.1.0
         | 
| 102 | 
            +
                  def command?
         | 
| 103 | 
            +
                    namespace.include?(Database::COMMAND)
         | 
| 104 | 
            +
                  end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                  # Returns the name of the command.
         | 
| 107 | 
            +
                  #
         | 
| 108 | 
            +
                  # @example Get the command name.
         | 
| 109 | 
            +
                  #   message.command_name
         | 
| 110 | 
            +
                  #
         | 
| 111 | 
            +
                  # @return [ String ] The name of the command, or 'find' if a query.
         | 
| 112 | 
            +
                  #
         | 
| 113 | 
            +
                  # @since 2.1.0
         | 
| 114 | 
            +
                  def command_name
         | 
| 115 | 
            +
                    if command?
         | 
| 116 | 
            +
                      selector.keys.first
         | 
| 117 | 
            +
                    else
         | 
| 118 | 
            +
                      'find'
         | 
| 119 | 
            +
                    end
         | 
| 120 | 
            +
                  end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                  # Get the command arguments.
         | 
| 123 | 
            +
                  #
         | 
| 124 | 
            +
                  # @example Get the command arguments.
         | 
| 125 | 
            +
                  #   message.arguments
         | 
| 126 | 
            +
                  #
         | 
| 127 | 
            +
                  # @return [ Hash ] The command arguments.
         | 
| 128 | 
            +
                  #
         | 
| 129 | 
            +
                  # @since 2.1.0
         | 
| 130 | 
            +
                  def arguments
         | 
| 131 | 
            +
                    if command?
         | 
| 132 | 
            +
                      selector
         | 
| 133 | 
            +
                    else
         | 
| 134 | 
            +
                      { filter: selector }.merge(@options)
         | 
| 135 | 
            +
                    end
         | 
| 94 136 | 
             
                  end
         | 
| 95 137 |  | 
| 96 138 | 
             
                  # Query messages require replies from the database.
         | 
| @@ -113,10 +155,6 @@ module Mongo | |
| 113 155 | 
             
                    2004
         | 
| 114 156 | 
             
                  end
         | 
| 115 157 |  | 
| 116 | 
            -
                  def query_type
         | 
| 117 | 
            -
                    namespace.include?(Database::COMMAND) ? 'COMMAND' : 'QUERY'
         | 
| 118 | 
            -
                  end
         | 
| 119 | 
            -
             | 
| 120 158 | 
             
                  def formatted_selector
         | 
| 121 159 | 
             
                    ( (str = selector.inspect).length > LOG_STRING_LIMIT ) ?
         | 
| 122 160 | 
             
                      "#{str[0..LOG_STRING_LIMIT]}..." : str
         | 
    
        data/lib/mongo/protocol/reply.rb
    CHANGED
    
    | @@ -38,6 +38,18 @@ module Mongo | |
| 38 38 | 
             
                    flags.include?(:query_failure)
         | 
| 39 39 | 
             
                  end
         | 
| 40 40 |  | 
| 41 | 
            +
                  # Return the event payload for monitoring.
         | 
| 42 | 
            +
                  #
         | 
| 43 | 
            +
                  # @example Return the event payload.
         | 
| 44 | 
            +
                  #   message.payload
         | 
| 45 | 
            +
                  #
         | 
| 46 | 
            +
                  # @return [ Hash ] The event payload.
         | 
| 47 | 
            +
                  #
         | 
| 48 | 
            +
                  # @since 2.1.0
         | 
| 49 | 
            +
                  def payload
         | 
| 50 | 
            +
                    { reply: documents, request_id: request_id }
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 41 53 | 
             
                  private
         | 
| 42 54 |  | 
| 43 55 | 
             
                  # The operation code required to specify a Reply message.
         | 
| @@ -52,29 +52,28 @@ module Mongo | |
| 52 52 | 
             
                  #
         | 
| 53 53 | 
             
                  #   Supported flags: +:upsert+, +:multi_update+
         | 
| 54 54 | 
             
                  def initialize(database, collection, selector, update, options = {})
         | 
| 55 | 
            +
                    @database    = database
         | 
| 55 56 | 
             
                    @namespace   = "#{database}.#{collection}"
         | 
| 56 57 | 
             
                    @selector    = selector
         | 
| 57 58 | 
             
                    @update      = update
         | 
| 58 59 | 
             
                    @flags       = options[:flags] || []
         | 
| 59 60 | 
             
                  end
         | 
| 60 61 |  | 
| 61 | 
            -
                  #  | 
| 62 | 
            +
                  # Return the event payload for monitoring.
         | 
| 62 63 | 
             
                  #
         | 
| 63 | 
            -
                  # @example  | 
| 64 | 
            -
                  #    | 
| 64 | 
            +
                  # @example Return the event payload.
         | 
| 65 | 
            +
                  #   message.payload
         | 
| 65 66 | 
             
                  #
         | 
| 66 | 
            -
                  # @return [  | 
| 67 | 
            +
                  # @return [ Hash ] The event payload.
         | 
| 67 68 | 
             
                  #
         | 
| 68 | 
            -
                  # @since 2. | 
| 69 | 
            -
                  def  | 
| 70 | 
            -
                     | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
                     | 
| 76 | 
            -
                    f, v = fields.transpose
         | 
| 77 | 
            -
                    f.join(" ") % v
         | 
| 69 | 
            +
                  # @since 2.1.0
         | 
| 70 | 
            +
                  def payload
         | 
| 71 | 
            +
                    {
         | 
| 72 | 
            +
                      command_name: 'update',
         | 
| 73 | 
            +
                      database_name: @database,
         | 
| 74 | 
            +
                      command: { filter: selector, update: update },
         | 
| 75 | 
            +
                      request_id: request_id
         | 
| 76 | 
            +
                    }
         | 
| 78 77 | 
             
                  end
         | 
| 79 78 |  | 
| 80 79 | 
             
                  private
         | 
    
        data/lib/mongo/server.rb
    CHANGED
    
    | @@ -40,6 +40,9 @@ module Mongo | |
| 40 40 | 
             
                # @return [ Hash ] The options hash.
         | 
| 41 41 | 
             
                attr_reader :options
         | 
| 42 42 |  | 
| 43 | 
            +
                # @return [ Monitoring ] monitoring The monitoring.
         | 
| 44 | 
            +
                attr_reader :monitoring
         | 
| 45 | 
            +
             | 
| 43 46 | 
             
                # Get the description from the monitor and scan on monitor.
         | 
| 44 47 | 
             
                def_delegators :monitor, :description, :scan!
         | 
| 45 48 |  | 
| @@ -107,18 +110,24 @@ module Mongo | |
| 107 110 | 
             
                # Instantiate a new server object. Will start the background refresh and
         | 
| 108 111 | 
             
                # subscribe to the appropriate events.
         | 
| 109 112 | 
             
                #
         | 
| 113 | 
            +
                # @api private
         | 
| 114 | 
            +
                #
         | 
| 110 115 | 
             
                # @example Initialize the server.
         | 
| 111 | 
            -
                #   Mongo::Server.new('127.0.0.1:27017', cluster, listeners)
         | 
| 116 | 
            +
                #   Mongo::Server.new('127.0.0.1:27017', cluster, monitoring, listeners)
         | 
| 117 | 
            +
                #
         | 
| 118 | 
            +
                # @note Server must never be directly instantiated outside of a Cluster.
         | 
| 112 119 | 
             
                #
         | 
| 113 120 | 
             
                # @param [ Address ] address The host:port address to connect to.
         | 
| 114 121 | 
             
                # @param [ Cluster ] cluster  The cluster the server belongs to.
         | 
| 122 | 
            +
                # @param [ Monitoring ] monitoring The monitoring.
         | 
| 115 123 | 
             
                # @param [ Event::Listeners ] event_listeners The event listeners.
         | 
| 116 124 | 
             
                # @param [ Hash ] options The server options.
         | 
| 117 125 | 
             
                #
         | 
| 118 126 | 
             
                # @since 2.0.0
         | 
| 119 | 
            -
                def initialize(address, cluster, event_listeners, options = {})
         | 
| 127 | 
            +
                def initialize(address, cluster, monitoring, event_listeners, options = {})
         | 
| 120 128 | 
             
                  @address = address
         | 
| 121 129 | 
             
                  @cluster = cluster
         | 
| 130 | 
            +
                  @monitoring = monitoring
         | 
| 122 131 | 
             
                  @options = options.freeze
         | 
| 123 132 | 
             
                  @monitor = Monitor.new(address, event_listeners, options)
         | 
| 124 133 | 
             
                  monitor.scan!
         | 
| @@ -164,5 +173,17 @@ module Mongo | |
| 164 173 | 
             
                    tags[k] && tags[k] == tag_set[k]
         | 
| 165 174 | 
             
                  end
         | 
| 166 175 | 
             
                end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                # Restart the server monitor.
         | 
| 178 | 
            +
                #
         | 
| 179 | 
            +
                # @example Restart the server monitor.
         | 
| 180 | 
            +
                #   server.reconnect!
         | 
| 181 | 
            +
                #
         | 
| 182 | 
            +
                # @return [ true ] Always true.
         | 
| 183 | 
            +
                #
         | 
| 184 | 
            +
                # @since 2.1.0
         | 
| 185 | 
            +
                def reconnect!
         | 
| 186 | 
            +
                  monitor.restart! and true
         | 
| 187 | 
            +
                end
         | 
| 167 188 | 
             
              end
         | 
| 168 189 | 
             
            end
         |