class Mongo::Error::Parser
@since 2.0.0
command responses.
Class for parsing the various forms that errors can come in from MongoDB
def append(message, error)
def append(message, error) if message.length > 1 message.concat(", #{error}") else message.concat(error) end end
def initialize(document, replies = nil, options = nil)
- Since: - 2.0.0
Options Hash:
(**options)-
:legacy(true | false) -- Whether document and replies
Parameters:
-
options(Hash) -- The options. -
replies(Array) -- The message replies. -
document(BSON::Document) -- The returned document.
Other tags:
- Example: Create the new parser. -
def initialize(document, replies = nil, options = nil) @document = document || {} @replies = replies @options = if options options.dup else {} end.freeze parse! end
def parse!
def parse! @message = "" parse_single(@message, ERR) parse_single(@message, ERROR) parse_single(@message, ERRMSG) parse_multiple(@message, 'writeErrors') if write_concern_error_document parse_single(@message, ERRMSG, write_concern_error_document) end parse_flag(@message) parse_code parse_labels parse_wtimeout end
def parse_code
def parse_code if document['ok'] == 1 || @options[:legacy] @code = @code_name = nil else @code = document['code'] @code_name = document['codeName'] end # Since there is only room for one code, do not replace # codes of the top level response with write concern error codes. # In practice this should never be an issue as a write concern # can only fail after the operation succeeds on the primary. if @code.nil? && @code_name.nil? if subdoc = write_concern_error_document @code = subdoc['code'] @code_name = subdoc['codeName'] end end if @code.nil? && @code_name.nil? # If we have writeErrors, and all of their codes are the same, # use that code. Otherwise don't set the code if write_errors = document['writeErrors'] codes = write_errors.map { |e| e['code'] }.compact if codes.uniq.length == 1 @code = codes.first # code name may not be returned by the server @code_name = write_errors.map { |e| e['codeName'] }.compact.first end end end end
def parse_flag(message)
def parse_flag(message) if replies && replies.first && (replies.first.respond_to?(:cursor_not_found?)) && replies.first.cursor_not_found? append(message, CURSOR_NOT_FOUND) end end
def parse_labels
def parse_labels @labels = document['errorLabels'] || [] end
def parse_multiple(message, key)
def parse_multiple(message, key) if errors = document[key] errors.each do |error| parse_single(message, ERRMSG, error) end end end
def parse_single(message, key, doc = document)
def parse_single(message, key, doc = document) if error = doc[key] append(message ,"#{error} (#{doc[CODE]})") end end
def parse_wtimeout
def parse_wtimeout @wtimeout = write_concern_error_document && write_concern_error_document['errInfo'] && write_concern_error_document['errInfo']['wtimeout'] end
def write_concern_error?
- Api: - experimental
Other tags:
- Since: - 2.10.0
Returns:
-
(true | false)- Whether the document includes a write
def write_concern_error? !!write_concern_error_document end
def write_concern_error_code
- Api: - experimental
Other tags:
- Since: - 2.10.0
Returns:
-
(Integer | nil)- The error code for the write concern error,
def write_concern_error_code write_concern_error_document && write_concern_error_document['code'] end
def write_concern_error_code_name
- Api: - experimental
Other tags:
- Since: - 2.10.0
Returns:
-
(String | nil)- The code name for the write concern error,
def write_concern_error_code_name write_concern_error_document && write_concern_error_document['codeName'] end
def write_concern_error_document
def write_concern_error_document document['writeConcernError'] end