mongoid 2.4.10 → 3.0.0
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.
- data/CHANGELOG.md +949 -10
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +3 -17
- data/lib/config/locales/en.yml +455 -51
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/atomic.rb +70 -16
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/callbacks.rb +106 -43
- data/lib/mongoid/components.rb +12 -23
- data/lib/mongoid/config/environment.rb +7 -4
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config.rb +104 -225
- data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +68 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +406 -0
- data/lib/mongoid/contextual/mongo.rb +662 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/copyable.rb +7 -25
- data/lib/mongoid/criteria.rb +515 -245
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +71 -52
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +3 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_metadata.rb +21 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/errors.rb +23 -1
- data/lib/mongoid/evolvable.rb +19 -0
- data/lib/mongoid/extensions/array.rb +164 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -0
- data/lib/mongoid/extensions/date_time.rb +73 -0
- data/lib/mongoid/extensions/false_class.rb +38 -0
- data/lib/mongoid/extensions/float.rb +56 -0
- data/lib/mongoid/extensions/hash.rb +123 -0
- data/lib/mongoid/extensions/integer.rb +66 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +238 -0
- data/lib/mongoid/extensions/object_id.rb +54 -0
- data/lib/mongoid/extensions/range.rb +79 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +181 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +38 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields/foreign_key.rb +150 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields.rb +142 -208
- data/lib/mongoid/finders.rb +45 -50
- data/lib/mongoid/hierarchy.rb +44 -15
- data/lib/mongoid/identity_map.rb +49 -21
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/multi_parameter_attributes.rb +9 -11
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +10 -44
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/persistence/operations/upsert.rb +28 -0
- data/lib/mongoid/persistence/operations.rb +22 -19
- data/lib/mongoid/persistence/upsertion.rb +30 -0
- data/lib/mongoid/persistence.rb +94 -39
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations/accessors.rb +120 -20
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +4 -4
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/cascading/delete.rb +3 -5
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/cascading.rb +10 -7
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +6 -7
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +347 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +100 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -60
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +277 -47
- data/lib/mongoid/relations/nested_builder.rb +4 -6
- data/lib/mongoid/relations/one.rb +2 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +62 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +162 -130
- data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/relations/touchable.rb +32 -0
- data/lib/mongoid/relations.rb +22 -6
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +312 -0
- data/lib/mongoid/serialization.rb +94 -42
- data/lib/mongoid/sessions/factory.rb +108 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions.rb +383 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded/lifecycle.rb +21 -21
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/threaded.rb +219 -59
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +4 -3
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +34 -4
- data/lib/mongoid/validations/uniqueness.rb +11 -12
- data/lib/mongoid/validations.rb +28 -20
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/mongoid.rb +37 -37
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +65 -17
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +73 -26
- metadata +103 -148
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/collections/retry.rb +0 -59
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -108
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -76
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/javascript/functions.yml +0 -63
- data/lib/mongoid/javascript.rb +0 -20
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -36
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
data/lib/mongoid/collection.rb
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require "mongoid/collections/retry"
|
|
3
|
-
require "mongoid/collections/operations"
|
|
4
|
-
require "mongoid/collections/master"
|
|
5
|
-
|
|
6
|
-
module Mongoid #:nodoc
|
|
7
|
-
|
|
8
|
-
# This class is the Mongoid wrapper to the Mongo Ruby driver's collection
|
|
9
|
-
# object.
|
|
10
|
-
class Collection
|
|
11
|
-
attr_reader :counter, :klass, :name
|
|
12
|
-
|
|
13
|
-
# All write operations should delegate to the master connection. These
|
|
14
|
-
# operations mimic the methods on a Mongo:Collection.
|
|
15
|
-
#
|
|
16
|
-
# @example Delegate the operation.
|
|
17
|
-
# collection.save({ :name => "Al" })
|
|
18
|
-
delegate *(Collections::Operations::PROXIED.dup << {:to => :master})
|
|
19
|
-
|
|
20
|
-
# Get the unwrapped driver collection for this mongoid collection.
|
|
21
|
-
#
|
|
22
|
-
# @example Get the driver collection.
|
|
23
|
-
# collection.driver
|
|
24
|
-
#
|
|
25
|
-
# @return [ Mongo::Collection ] The driver collection.
|
|
26
|
-
#
|
|
27
|
-
# @since 2.2.0
|
|
28
|
-
def driver
|
|
29
|
-
master.collection
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Find documents from the database given a selector and options.
|
|
33
|
-
#
|
|
34
|
-
# @example Find documents in the collection.
|
|
35
|
-
# collection.find({ :test => "value" })
|
|
36
|
-
#
|
|
37
|
-
# @param [ Hash ] selector The query selector.
|
|
38
|
-
# @param [ Hash ] options The options to pass to the db.
|
|
39
|
-
#
|
|
40
|
-
# @return [ Cursor ] The results.
|
|
41
|
-
def find(selector = {}, options = {})
|
|
42
|
-
cursor = Mongoid::Cursor.new(klass, self, master(options).find(selector, options))
|
|
43
|
-
if block_given?
|
|
44
|
-
yield cursor; cursor.close
|
|
45
|
-
else
|
|
46
|
-
cursor
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Find the first document from the database given a selector and options.
|
|
51
|
-
#
|
|
52
|
-
# @example Find one document.
|
|
53
|
-
# collection.find_one({ :test => "value" })
|
|
54
|
-
#
|
|
55
|
-
# @param [ Hash ] selector The query selector.
|
|
56
|
-
# @param [ Hash ] options The options to pass to the db.
|
|
57
|
-
#
|
|
58
|
-
# @return [ Document, nil ] A matching document or nil if none found.
|
|
59
|
-
def find_one(selector = {}, options = {})
|
|
60
|
-
master(options).find_one(selector, options)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Initialize a new Mongoid::Collection, setting up the master, slave, and
|
|
64
|
-
# name attributes. Masters will be used for writes, slaves for reads.
|
|
65
|
-
#
|
|
66
|
-
# @example Create the new collection.
|
|
67
|
-
# Collection.new(masters, slaves, "test")
|
|
68
|
-
#
|
|
69
|
-
# @param [ Class ] klass The class the collection is for.
|
|
70
|
-
# @param [ String ] name The name of the collection.
|
|
71
|
-
# @param [ Hash ] options The collection options.
|
|
72
|
-
#
|
|
73
|
-
# @option options [ true, false ] :capped If the collection is capped.
|
|
74
|
-
# @option options [ Integer ] :size The capped collection size.
|
|
75
|
-
# @option options [ Integer ] :max The maximum number of docs in the
|
|
76
|
-
# capped collection.
|
|
77
|
-
def initialize(klass, name, options = {})
|
|
78
|
-
@klass, @name, @options = klass, name, options || {}
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Inserts one or more documents in the collection.
|
|
82
|
-
#
|
|
83
|
-
# @example Insert documents.
|
|
84
|
-
# collection.insert(
|
|
85
|
-
# { "field" => "value" },
|
|
86
|
-
# :safe => true
|
|
87
|
-
# )
|
|
88
|
-
#
|
|
89
|
-
# @param [ Hash, Array<Hash> ] documents A single document or multiples.
|
|
90
|
-
# @param [ Hash ] options The options.
|
|
91
|
-
#
|
|
92
|
-
# @since 2.0.2, batch-relational-insert
|
|
93
|
-
def insert(documents, options = {})
|
|
94
|
-
consumer = Threaded.insert(name)
|
|
95
|
-
if consumer
|
|
96
|
-
consumer.consume(documents, options)
|
|
97
|
-
else
|
|
98
|
-
master(options).insert(documents, options)
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Perform a map/reduce on the documents.
|
|
103
|
-
#
|
|
104
|
-
# @example Perform the map/reduce.
|
|
105
|
-
# collection.map_reduce(map, reduce)
|
|
106
|
-
#
|
|
107
|
-
# @param [ String ] map The map javascript function.
|
|
108
|
-
# @param [ String ] reduce The reduce javascript function.
|
|
109
|
-
# @param [ Hash ] options The options to pass to the db.
|
|
110
|
-
#
|
|
111
|
-
# @return [ Cursor ] The results.
|
|
112
|
-
def map_reduce(map, reduce, options = {})
|
|
113
|
-
master(options).map_reduce(map, reduce, options)
|
|
114
|
-
end
|
|
115
|
-
alias :mapreduce :map_reduce
|
|
116
|
-
|
|
117
|
-
# Return the object responsible for writes to the database. This will
|
|
118
|
-
# always return a collection associated with the Master DB.
|
|
119
|
-
#
|
|
120
|
-
# @example Get the master connection.
|
|
121
|
-
# collection.master
|
|
122
|
-
#
|
|
123
|
-
# @return [ Master ] The master connection.
|
|
124
|
-
def master(options = {})
|
|
125
|
-
options.delete(:cache)
|
|
126
|
-
db = Mongoid.databases[klass.database] || Mongoid.master
|
|
127
|
-
@master ||= Collections::Master.new(db, @name, @options)
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
# Updates one or more documents in the collection.
|
|
131
|
-
#
|
|
132
|
-
# @example Update documents.
|
|
133
|
-
# collection.update(
|
|
134
|
-
# { "_id" => BSON::OjectId.new },
|
|
135
|
-
# { "$push" => { "addresses" => { "_id" => "street" } } },
|
|
136
|
-
# :safe => true
|
|
137
|
-
# )
|
|
138
|
-
#
|
|
139
|
-
# @param [ Hash ] selector The document selector.
|
|
140
|
-
# @param [ Hash ] document The modifier.
|
|
141
|
-
# @param [ Hash ] options The options.
|
|
142
|
-
#
|
|
143
|
-
# @since 2.0.0
|
|
144
|
-
def update(selector, document, options = {})
|
|
145
|
-
updater = Threaded.update_consumer(name)
|
|
146
|
-
if updater
|
|
147
|
-
updater.consume(selector, document, options)
|
|
148
|
-
else
|
|
149
|
-
master(options).update(selector, document, options)
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
def drop(*args)
|
|
154
|
-
@master = nil if master.drop
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Collections #:nodoc:
|
|
4
|
-
|
|
5
|
-
# This class wraps the MongoDB master database.
|
|
6
|
-
class Master
|
|
7
|
-
include Mongoid::Collections::Retry
|
|
8
|
-
|
|
9
|
-
attr_reader :collection
|
|
10
|
-
|
|
11
|
-
# All read and write operations should delegate to the master connection.
|
|
12
|
-
# These operations mimic the methods on a Mongo:Collection.
|
|
13
|
-
#
|
|
14
|
-
# @example Proxy the driver save.
|
|
15
|
-
# collection.save({ :name => "Al" })
|
|
16
|
-
Operations::ALL.each do |name|
|
|
17
|
-
class_eval <<-EOS, __FILE__, __LINE__
|
|
18
|
-
def #{name}(*args)
|
|
19
|
-
retry_on_connection_failure do
|
|
20
|
-
collection.#{name}(*args)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
EOS
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# Create the new database writer. Will create a collection from the
|
|
27
|
-
# master database.
|
|
28
|
-
#
|
|
29
|
-
# @example Create a new wrapped master.
|
|
30
|
-
# Master.new(db, "testing")
|
|
31
|
-
#
|
|
32
|
-
# @param [ Mongo::DB ] master The master database.
|
|
33
|
-
# @param [ String ] name The name of the database.
|
|
34
|
-
# @param [ Hash ] options The collection options.
|
|
35
|
-
#
|
|
36
|
-
# @option options [ true, false ] :capped If the collection is capped.
|
|
37
|
-
# @option options [ Integer ] :size The capped collection size.
|
|
38
|
-
# @option options [ Integer ] :max The maximum number of docs in the
|
|
39
|
-
# capped collection.
|
|
40
|
-
def initialize(master, name, options = {})
|
|
41
|
-
@collection = master.create_collection(name, options)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Collections #:nodoc:
|
|
4
|
-
module Operations #:nodoc:
|
|
5
|
-
|
|
6
|
-
# Constant definining all the read operations available for a
|
|
7
|
-
# Mongo:Collection. This is used in delegation.
|
|
8
|
-
READ = [
|
|
9
|
-
:[],
|
|
10
|
-
:db,
|
|
11
|
-
:count,
|
|
12
|
-
:distinct,
|
|
13
|
-
:find,
|
|
14
|
-
:find_one,
|
|
15
|
-
:group,
|
|
16
|
-
:index_information,
|
|
17
|
-
:map_reduce,
|
|
18
|
-
:mapreduce,
|
|
19
|
-
:stats,
|
|
20
|
-
:options
|
|
21
|
-
]
|
|
22
|
-
|
|
23
|
-
# Constant definining all the write operations available for a
|
|
24
|
-
# Mongo:Collection. This is used in delegation.
|
|
25
|
-
WRITE = [
|
|
26
|
-
:<<,
|
|
27
|
-
:create_index,
|
|
28
|
-
:drop,
|
|
29
|
-
:drop_index,
|
|
30
|
-
:drop_indexes,
|
|
31
|
-
:find_and_modify,
|
|
32
|
-
:insert,
|
|
33
|
-
:remove,
|
|
34
|
-
:rename,
|
|
35
|
-
:save,
|
|
36
|
-
:update
|
|
37
|
-
]
|
|
38
|
-
|
|
39
|
-
# Convenience constant for getting back all collection operations.
|
|
40
|
-
ALL = (READ + WRITE)
|
|
41
|
-
PROXIED = ALL - [ :find, :find_one, :map_reduce, :mapreduce, :update ]
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Collections #:nodoc:
|
|
4
|
-
|
|
5
|
-
# Provides behaviour for retrying commands on connection failure.
|
|
6
|
-
module Retry
|
|
7
|
-
|
|
8
|
-
# Retries command on connection failures.
|
|
9
|
-
#
|
|
10
|
-
# This is useful when using replica sets. When a primary server wents
|
|
11
|
-
# down and a command is issued, the driver will raise a
|
|
12
|
-
# Mongo::ConnectionFailure. We wait a little bit, because nodes are
|
|
13
|
-
# electing themselves, and then retry the given command.
|
|
14
|
-
#
|
|
15
|
-
# By setting Mongoid.max_retries_on_connection_failure to a value of 0,
|
|
16
|
-
# no attempt will be made, immediately raising connection failure.
|
|
17
|
-
# Otherwise it will attempt to make the specified number of retries
|
|
18
|
-
# and then raising the exception to clients.
|
|
19
|
-
#
|
|
20
|
-
# @example Retry the command.
|
|
21
|
-
# retry_on_connection_failure do
|
|
22
|
-
# collection.send(name, *args)
|
|
23
|
-
# end
|
|
24
|
-
#
|
|
25
|
-
# @since 2.0.0
|
|
26
|
-
def retry_on_connection_failure
|
|
27
|
-
retries = 0
|
|
28
|
-
begin
|
|
29
|
-
yield
|
|
30
|
-
rescue Mongo::ConnectionFailure => ex
|
|
31
|
-
retries = increase_retry_attempts(retries, ex)
|
|
32
|
-
retry
|
|
33
|
-
rescue Mongo::OperationFailure => ex
|
|
34
|
-
if ex.message =~ /not master/
|
|
35
|
-
Mongoid.reconnect!
|
|
36
|
-
retries = increase_retry_attempts(retries, ex)
|
|
37
|
-
retry
|
|
38
|
-
else
|
|
39
|
-
raise ex
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
private
|
|
45
|
-
|
|
46
|
-
def increase_retry_attempts(retries, ex)
|
|
47
|
-
retries += 1
|
|
48
|
-
raise ex if retries > Mongoid.max_retries_on_connection_failure
|
|
49
|
-
Kernel.sleep(0.5)
|
|
50
|
-
log_retry retries, ex
|
|
51
|
-
retries
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def log_retry(retry_number, ex)
|
|
55
|
-
Mongoid.logger.warn "A #{ex.class.name} was raised. Retry attempt ##{retry_number}." if Mongoid.logger
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
data/lib/mongoid/collections.rb
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc
|
|
3
|
-
|
|
4
|
-
# The collections module is used for providing functionality around setting
|
|
5
|
-
# up and updating collections.
|
|
6
|
-
module Collections
|
|
7
|
-
extend ActiveSupport::Concern
|
|
8
|
-
|
|
9
|
-
included do
|
|
10
|
-
cattr_accessor :_collection, :collection_name
|
|
11
|
-
self.collection_name = self.name.collectionize
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Get the collection for the class.
|
|
15
|
-
#
|
|
16
|
-
# @note Defining methods instead of delegate to avoid calls to
|
|
17
|
-
# Kernel.caller for class load performance reasons.
|
|
18
|
-
#
|
|
19
|
-
# @example Get the collection.
|
|
20
|
-
# person.collection
|
|
21
|
-
#
|
|
22
|
-
# @return [ Collection ] The class collection.
|
|
23
|
-
#
|
|
24
|
-
# @since 1.0.0
|
|
25
|
-
def collection
|
|
26
|
-
self.class.collection
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Get the database for the class.
|
|
30
|
-
#
|
|
31
|
-
# @note Defining methods instead of delegate to avoid calls to
|
|
32
|
-
# Kernel.caller for class load performance reasons.
|
|
33
|
-
#
|
|
34
|
-
# @example Get the database.
|
|
35
|
-
# person.db
|
|
36
|
-
#
|
|
37
|
-
# @return [ DB ] The class db.
|
|
38
|
-
#
|
|
39
|
-
# @since 1.0.0
|
|
40
|
-
def db
|
|
41
|
-
self.class.db
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
module ClassMethods #:nodoc:
|
|
45
|
-
|
|
46
|
-
# Returns the collection associated with this +Document+. If the
|
|
47
|
-
# document is embedded, there will be no collection associated
|
|
48
|
-
# with it unless it's in a cyclic relation.
|
|
49
|
-
#
|
|
50
|
-
# @example Get the collection.
|
|
51
|
-
# Model.collection
|
|
52
|
-
#
|
|
53
|
-
# @return [ Collection ] The Mongoid collection wrapper.
|
|
54
|
-
def collection
|
|
55
|
-
raise Errors::InvalidCollection.new(self) if embedded? && !cyclic
|
|
56
|
-
self._collection || set_collection
|
|
57
|
-
add_indexes; self._collection
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# Return the database associated with this collection.
|
|
61
|
-
#
|
|
62
|
-
# @example Get the database object.
|
|
63
|
-
# Model.db
|
|
64
|
-
#
|
|
65
|
-
# @return [ Mongo::DB ] The Mongo daatabase object.
|
|
66
|
-
def db
|
|
67
|
-
collection.db
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Convenience method for getting index information from the collection.
|
|
71
|
-
#
|
|
72
|
-
# @example Get the index information from the collection.
|
|
73
|
-
# Model.index_information
|
|
74
|
-
#
|
|
75
|
-
# @return [ Array ] The collection index information.
|
|
76
|
-
def index_information
|
|
77
|
-
collection.index_information
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# Macro for setting the collection name to store in.
|
|
81
|
-
#
|
|
82
|
-
# @example Store in a separate collection than the default.
|
|
83
|
-
# Model.store_in :population
|
|
84
|
-
#
|
|
85
|
-
# @example Store in a capped collection.
|
|
86
|
-
# Model.store_in :population, :capped => true, :max => 10000
|
|
87
|
-
#
|
|
88
|
-
# @param [ Symbol ] name The name of the collection.
|
|
89
|
-
# @param [ Hash ] options The collection options.
|
|
90
|
-
#
|
|
91
|
-
# @option options [ true, false ] :capped If the collection is capped.
|
|
92
|
-
# @option options [ Integer ] :size The capped collection size.
|
|
93
|
-
# @option options [ Integer ] :max The maximum number of docs in the
|
|
94
|
-
# capped collection.
|
|
95
|
-
def store_in(name, options = {})
|
|
96
|
-
self.collection_name = name.to_s
|
|
97
|
-
set_collection(options)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
protected
|
|
101
|
-
|
|
102
|
-
# Set the collection on the class.
|
|
103
|
-
#
|
|
104
|
-
# @example Set the collection.
|
|
105
|
-
# Model.set_collection
|
|
106
|
-
#
|
|
107
|
-
# @param [ Hash ] options The collection options.
|
|
108
|
-
#
|
|
109
|
-
# @option options [ true, false ] :capped If the collection is capped.
|
|
110
|
-
# @option options [ Integer ] :size The capped collection size.
|
|
111
|
-
# @option options [ Integer ] :max The maximum number of docs in the
|
|
112
|
-
# capped collection.
|
|
113
|
-
|
|
114
|
-
# @return [ Collection ] The Mongoid collection wrapper.
|
|
115
|
-
def set_collection(options = {})
|
|
116
|
-
self._collection = Collection.new(self, self.collection_name, options)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Config #:nodoc:
|
|
4
|
-
|
|
5
|
-
# This class handles the configuration and initialization of a mongodb
|
|
6
|
-
# database from options.
|
|
7
|
-
class Database < Hash
|
|
8
|
-
|
|
9
|
-
# Configure the database connections. This will return an array
|
|
10
|
-
# containing the master and an array of slaves.
|
|
11
|
-
#
|
|
12
|
-
# @example Configure the connection.
|
|
13
|
-
# db.configure
|
|
14
|
-
#
|
|
15
|
-
# @return [ Array<Mongo::DB, Array<Mongo:DB>> ] The Mongo databases.
|
|
16
|
-
#
|
|
17
|
-
# @since 2.0.0.rc.1
|
|
18
|
-
def configure
|
|
19
|
-
[ master.db(name), slaves.map { |slave| slave.db(name) } ]
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Create the new db configuration class.
|
|
23
|
-
#
|
|
24
|
-
# @example Initialize the class.
|
|
25
|
-
# Config::Database.new(
|
|
26
|
-
# false, "uri" => { "mongodb://durran:password@localhost:27017/mongoid" }
|
|
27
|
-
# )
|
|
28
|
-
#
|
|
29
|
-
# @param [ Hash ] options The configuration options.
|
|
30
|
-
#
|
|
31
|
-
# @option options [ String ] :database The database name.
|
|
32
|
-
# @option options [ String ] :host The database host.
|
|
33
|
-
# @option options [ String ] :password The password for authentication.
|
|
34
|
-
# @option options [ Integer ] :port The port for the database.
|
|
35
|
-
# @option options [ String ] :uri The uri for the database.
|
|
36
|
-
# @option options [ String ] :username The user for authentication.
|
|
37
|
-
#
|
|
38
|
-
# @since 2.0.0.rc.1
|
|
39
|
-
def initialize(options = {})
|
|
40
|
-
merge!(options)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
private
|
|
44
|
-
|
|
45
|
-
# Do we need to authenticate against the database?
|
|
46
|
-
#
|
|
47
|
-
# @example Are we authenticating?
|
|
48
|
-
# db.authenticating?
|
|
49
|
-
#
|
|
50
|
-
# @return [ true, false ] True if auth is needed, false if not.
|
|
51
|
-
#
|
|
52
|
-
# @since 2.0.0.rc.1
|
|
53
|
-
def authenticating?
|
|
54
|
-
username || password
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Takes the supplied options in the hash and created a URI from them to
|
|
58
|
-
# pass to the Mongo connection object.
|
|
59
|
-
#
|
|
60
|
-
# @example Build the URI.
|
|
61
|
-
# db.build_uri
|
|
62
|
-
#
|
|
63
|
-
# @param [ Hash ] options The options to build with.
|
|
64
|
-
#
|
|
65
|
-
# @return [ String ] A mongo compliant URI string.
|
|
66
|
-
#
|
|
67
|
-
# @since 2.0.0.rc.1
|
|
68
|
-
def build_uri(options = {})
|
|
69
|
-
"mongodb://".tap do |base|
|
|
70
|
-
base << "#{username}:#{password}@" if authenticating?
|
|
71
|
-
base << "#{options["host"] || "localhost"}:#{options["port"] || 27017}"
|
|
72
|
-
base << "/#{self["database"]}" if authenticating?
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Create the mongo master connection from either the supplied URI
|
|
77
|
-
# or a generated one, while setting pool size and logging.
|
|
78
|
-
#
|
|
79
|
-
# @example Create the connection.
|
|
80
|
-
# db.connection
|
|
81
|
-
#
|
|
82
|
-
# @return [ Mongo::Connection ] The mongo connection.
|
|
83
|
-
#
|
|
84
|
-
# @since 2.0.0.rc.1
|
|
85
|
-
def master
|
|
86
|
-
Mongo::Connection.from_uri(uri(self), optional.symbolize_keys).tap do |conn|
|
|
87
|
-
conn.apply_saved_authentication
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# Create the mongo slave connections from either the supplied URI
|
|
92
|
-
# or a generated one, while setting pool size and logging.
|
|
93
|
-
#
|
|
94
|
-
# @example Create the connection.
|
|
95
|
-
# db.connection
|
|
96
|
-
#
|
|
97
|
-
# @return [ Array<Mongo::Connection> ] The mongo slave connections.
|
|
98
|
-
#
|
|
99
|
-
# @since 2.0.0.rc.1
|
|
100
|
-
def slaves
|
|
101
|
-
(self["slaves"] || []).map do |options|
|
|
102
|
-
Mongo::Connection.from_uri(uri(options), optional(true).symbolize_keys).tap do |conn|
|
|
103
|
-
conn.apply_saved_authentication
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# Should we use a logger?
|
|
109
|
-
#
|
|
110
|
-
# @example Should we use a logger?
|
|
111
|
-
# database.logger?
|
|
112
|
-
#
|
|
113
|
-
# @return [ true, false ] Defaults to true, false if specifically
|
|
114
|
-
# defined.
|
|
115
|
-
#
|
|
116
|
-
# @since 2.2.0
|
|
117
|
-
def logger?
|
|
118
|
-
self[:logger].nil? || self[:logger] ? true : false
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Convenience for accessing the hash via dot notation.
|
|
122
|
-
#
|
|
123
|
-
# @example Access a value in alternate syntax.
|
|
124
|
-
# db.host
|
|
125
|
-
#
|
|
126
|
-
# @return [ Object ] The value in the hash.
|
|
127
|
-
#
|
|
128
|
-
# @since 2.0.0.rc.1
|
|
129
|
-
def method_missing(name, *args, &block)
|
|
130
|
-
self[name.to_s]
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Get the name of the database, from either the URI supplied or the
|
|
134
|
-
# database value in the options.
|
|
135
|
-
#
|
|
136
|
-
# @example Get the database name.
|
|
137
|
-
# db.name
|
|
138
|
-
#
|
|
139
|
-
# @return [ String ] The database name.
|
|
140
|
-
#
|
|
141
|
-
# @since 2.0.0.rc.1
|
|
142
|
-
def name
|
|
143
|
-
db_name = URI.parse(uri(self)).path.to_s.sub("/", "")
|
|
144
|
-
db_name.blank? ? database : db_name
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
# Get the options used in creating the database connection.
|
|
148
|
-
#
|
|
149
|
-
# @example Get the options.
|
|
150
|
-
# db.options
|
|
151
|
-
#
|
|
152
|
-
# @param [ true, false ] slave Are the options for a slave db?
|
|
153
|
-
#
|
|
154
|
-
# @return [ Hash ] The hash of configuration options.
|
|
155
|
-
#
|
|
156
|
-
# @since 2.0.0.rc.1
|
|
157
|
-
def optional(slave = false)
|
|
158
|
-
({
|
|
159
|
-
:pool_size => pool_size,
|
|
160
|
-
:logger => logger? ? Mongoid::Logger.new : nil,
|
|
161
|
-
:slave_ok => slave
|
|
162
|
-
}).merge(self).reject { |k,v| Config.blacklisted_options.include? k }.
|
|
163
|
-
inject({}) { |memo, (k, v)| memo[k.to_sym] = v; memo}
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
# Get a Mongo compliant URI for the database connection.
|
|
167
|
-
#
|
|
168
|
-
# @example Get the URI.
|
|
169
|
-
# db.uri
|
|
170
|
-
#
|
|
171
|
-
# @param [ Hash ] options The options hash.
|
|
172
|
-
#
|
|
173
|
-
# @return [ String ] The URI for the connection.
|
|
174
|
-
#
|
|
175
|
-
# @since 2.0.0.rc.1
|
|
176
|
-
def uri(options = {})
|
|
177
|
-
options["uri"] || build_uri(options)
|
|
178
|
-
end
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
end
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Config #:nodoc:
|
|
4
|
-
class ReplsetDatabase < Hash
|
|
5
|
-
|
|
6
|
-
# Configure the database connections. This will return an array
|
|
7
|
-
# containing one Mongo::DB and nil (to keep compatibility with Mongoid::Config::Database)
|
|
8
|
-
# If you want the reads to go to a secondary node use the :read_secondary(true): option
|
|
9
|
-
#
|
|
10
|
-
# @example Configure the connection.
|
|
11
|
-
# db.configure
|
|
12
|
-
#
|
|
13
|
-
# @return [ Array<Mongo::DB, nil ] The Mongo databases.
|
|
14
|
-
#
|
|
15
|
-
# @since 2.0.0.rc.5
|
|
16
|
-
def configure
|
|
17
|
-
# yes, construction is weird but the driver wants
|
|
18
|
-
# "A list of host-port pairs ending with a hash containing any options"
|
|
19
|
-
# mongo likes symbols
|
|
20
|
-
options = reject{ |key, value| Config.blacklisted_options.include?(key.to_s) }
|
|
21
|
-
options["logger"] = Mongoid::Logger.new
|
|
22
|
-
connection = Mongo::ReplSetConnection.new(*(hosts.clone << options.symbolize_keys))
|
|
23
|
-
|
|
24
|
-
if authenticating?
|
|
25
|
-
connection.add_auth(database, username, password)
|
|
26
|
-
connection.apply_saved_authentication
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
[ connection.db(database), nil ]
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Do we need to authenticate against the database?
|
|
33
|
-
#
|
|
34
|
-
# @example Are we authenticating?
|
|
35
|
-
# db.authenticating?
|
|
36
|
-
#
|
|
37
|
-
# @return [ true, false ] True if auth is needed, false if not.
|
|
38
|
-
#
|
|
39
|
-
# @since 2.0.2
|
|
40
|
-
def authenticating?
|
|
41
|
-
username || password
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# Convenience for accessing the hash via dot notation.
|
|
45
|
-
#
|
|
46
|
-
# @example Access a value in alternate syntax.
|
|
47
|
-
# db.host
|
|
48
|
-
#
|
|
49
|
-
# @return [ Object ] The value in the hash.
|
|
50
|
-
#
|
|
51
|
-
# @since 2.0.2
|
|
52
|
-
def method_missing(name, *args, &block)
|
|
53
|
-
self[name.to_s]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# Create the new db configuration class.
|
|
57
|
-
#
|
|
58
|
-
# @example Initialize the class.
|
|
59
|
-
# Config::ReplsetDatabase.new(
|
|
60
|
-
# "hosts" => [[host1,port1],[host2,port2]]
|
|
61
|
-
# )
|
|
62
|
-
#
|
|
63
|
-
# replSet does not supports auth
|
|
64
|
-
#
|
|
65
|
-
# @param [ Hash ] options The configuration options.
|
|
66
|
-
#
|
|
67
|
-
# @option options [ Array ] :hosts The database host.
|
|
68
|
-
# @option options [ String ] :database The database name.
|
|
69
|
-
# @option options [ Boolean ] :read_secondary Tells the driver to read from secondaries.
|
|
70
|
-
# ...
|
|
71
|
-
#
|
|
72
|
-
# @see Mongo::ReplSetConnection for all options
|
|
73
|
-
#
|
|
74
|
-
# @since 2.0.0.rc.5
|
|
75
|
-
def initialize(options = {})
|
|
76
|
-
merge!(options)
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|