Module: Mongoid::MongoidRetry
- Defined in:
- lib/mongoid/mongoid_retry.rb
Constant Summary collapse
- DUPLICATE_KEY_ERROR_CODES =
[11000,11001]
- MAX_RETRIES =
3
Class Method Summary collapse
- .error_code(exception) ⇒ Object
- .error_message(exception) ⇒ Object
- .is_a_duplicate_key_error?(exception) ⇒ Boolean
Instance Method Summary collapse
- #retry_if_duplicate_key_error(e, options) ⇒ Object
-
#save_and_retry(options = {}) ⇒ Object
Catch a duplicate key error.
Class Method Details
.error_code(exception) ⇒ Object
14 15 16 |
# File 'lib/mongoid/mongoid_retry.rb', line 14 def self.error_code(exception) exception.error_code end |
.error_message(exception) ⇒ Object
10 11 12 |
# File 'lib/mongoid/mongoid_retry.rb', line 10 def self.(exception) exception. end |
.is_a_duplicate_key_error?(exception) ⇒ Boolean
27 28 29 |
# File 'lib/mongoid/mongoid_retry.rb', line 27 def self.is_a_duplicate_key_error?(exception) DUPLICATE_KEY_ERROR_CODES.include?(error_code(exception)) end |
Instance Method Details
#retry_if_duplicate_key_error(e, options) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/mongoid/mongoid_retry.rb', line 48 def retry_if_duplicate_key_error(e, ) retries = .fetch(:retries, MAX_RETRIES) if ::Mongoid::MongoidRetry.is_a_duplicate_key_error?(e) && retries > 0 keys = duplicate_key(e) if (duplicate = find_duplicate(keys)) if [:allow_delete] duplicate.delete save_and_retry() else update_document!(duplicate, .merge(retries: retries - 1)) end end else raise e end end |
#save_and_retry(options = {}) ⇒ Object
Catch a duplicate key error
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/mongoid/mongoid_retry.rb', line 32 def save_and_retry( = {}) if ::Mongoid::VERSION < '3' begin safely.save! rescue Mongo::OperationFailure => e retry_if_duplicate_key_error(e, ) end else begin with(safe: true).save! rescue Moped::Errors::OperationFailure => e retry_if_duplicate_key_error(e, ) end end end |