Module: Mongoid::Threaded
Relationships & Source Files | |
Namespace Children | |
Modules:
| |
Defined in: | lib/mongoid/threaded.rb, lib/mongoid/threaded/lifecycle.rb |
Overview
This module contains logic for easy access to objects that have a lifecycle on the current thread.
Constant Summary
-
ASSIGN =
# File 'lib/mongoid/threaded/lifecycle.rb', line 7'assign'.freeze
-
AUTOSAVES_KEY =
# File 'lib/mongoid/threaded.rb', line 20'[mongoid]:autosaves'
-
BIND =
# File 'lib/mongoid/threaded/lifecycle.rb', line 6'bind'.freeze
-
BUILD =
# File 'lib/mongoid/threaded/lifecycle.rb', line 8'build'.freeze
-
CLIENTS_KEY =
Constant for the key to store clients.
'[mongoid]:clients'
-
CLIENT_OVERRIDE_KEY =
The key to override the client.
'[mongoid]:client-override'
-
CREATE =
# File 'lib/mongoid/threaded/lifecycle.rb', line 10'create'.freeze
-
CURRENT_SCOPE_KEY =
The key for the current thread’s scope stack.
'[mongoid]:current-scope'
-
DATABASE_OVERRIDE_KEY =
# File 'lib/mongoid/threaded.rb', line 9'[mongoid]:db-override'
-
EXECUTE_CALLBACKS =
The key storing the default value for whether or not callbacks are executed on documents.
'[mongoid]:execute-callbacks'
-
LOAD =
# File 'lib/mongoid/threaded/lifecycle.rb', line 9'load'.freeze
-
MODIFIED_DOCUMENTS_KEY =
The key for storing documents modified inside transactions.
'[mongoid]:modified-documents'
-
SESSIONS_KEY =
The key for the current thread’s sessions.
'[mongoid]:sessions'
-
STACK_KEYS =
# File 'lib/mongoid/threaded.rb', line 23Hash.new do |hash, key| hash[key] = "[mongoid]:#{key}-stack" end
-
VALIDATIONS_KEY =
# File 'lib/mongoid/threaded.rb', line 21'[mongoid]:validations'
Instance Attribute Summary
-
#client_override ⇒ String | Symbol
rw
Get the global client override.
-
#client_override=(name) ⇒ String | Symbol
rw
::Set
the global client override. -
#database_override ⇒ String | Symbol
rw
Get the global database override.
-
#database_override=(name) ⇒ String | Symbol
rw
::Set
the global database override. -
#execute_callbacks=(flag)
rw
Indicates whether document callbacks should be invoked by default for the current thread.
-
#execute_callbacks? ⇒ true | false
rw
Queries whether document callbacks should be executed by default for the current thread.
Instance Method Summary
-
#add_modified_document(session, document)
Store a reference to the document that was modified inside a transaction associated with the session.
-
#autosaved?(document) ⇒ true | false
Is the document autosaved on the current thread?
-
#autosaves ⇒ Hash
Get all autosaves on the current thread.
-
#autosaves_for(klass) ⇒ Array
Get all autosaves on the current thread for the class.
-
#begin_autosave(document)
Begin autosaving a document on the current thread.
-
#begin_execution(name) ⇒ true
Begin entry into a named thread local stack.
-
#begin_validate(document)
Begin validating a document on the current thread.
-
#begin_without_default_scope(klass)
Internal use only
Internal use only
Begin suppressing default scopes for given model on the current thread.
-
#clear_modified_documents(session) ⇒ Set<Mongoid::Document>
Clears the set of modified documents for the given session, and return the content of the set before the clearance.
-
#clear_session(client: nil) ⇒ nil
Clear the cached session for this thread for a client.
-
#current_scope(klass = nil) ⇒ Criteria
Get the current
::Mongoid
scope. - #current_scope=(scope) ⇒ Criteria
-
#executing?(name) ⇒ true
Are in the middle of executing the named stack.
-
#exit_autosave(document)
Exit autosaving a document on the current thread.
-
#exit_execution(name) ⇒ true
Exit from a named thread local stack.
-
#exit_validate(document)
Exit validating a document on the current thread.
-
#exit_without_default_scope(klass)
Internal use only
Internal use only
Exit suppressing default scopes for given model on the current thread.
-
#get_session(client: nil) ⇒ Mongo::Session | nil
Get the cached session for this thread for a client.
-
#modified_documents ⇒ Hash<Mongo::Session, Set<Mongoid::Document>>
Internal use only
Internal use only
Returns the thread store of modified documents.
-
#sessions ⇒ Hash<Integer, Set>
Internal use only
Internal use only
Returns the thread store of sessions.
- #set_current_scope(scope, klass) ⇒ Criteria
-
#set_session(session, client: nil)
Cache a session for this thread for a client.
-
#stack(name) ⇒ Array
Get the named stack.
-
#validated?(document) ⇒ true | false
Is the document validated on the current thread?
-
#validations ⇒ Hash
Get all validations on the current thread.
-
#validations_for(klass) ⇒ Array
Get all validations on the current thread for the class.
-
#without_default_scope?(klass) ⇒ Boolean
Internal use only
Internal use only
Is the given klass’ default scope suppressed on the current thread?
-
#unset_current_scope(klass)
private
Removes the given klass from the current scope, and tidies the current scope list.
Instance Attribute Details
#client_override ⇒ String | Symbol (rw)
Get the global client override.
# File 'lib/mongoid/threaded.rb', line 179
def client_override Thread.current[CLIENT_OVERRIDE_KEY] end
#client_override=(name) ⇒ String | Symbol (rw)
::Set
the global client override.
# File 'lib/mongoid/threaded.rb', line 191
def client_override=(name) Thread.current[CLIENT_OVERRIDE_KEY] = name end
#database_override ⇒ String | Symbol (rw)
Get the global database override.
# File 'lib/mongoid/threaded.rb', line 57
def database_override Thread.current[DATABASE_OVERRIDE_KEY] end
#database_override=(name) ⇒ String | Symbol (rw)
::Set
the global database override.
# File 'lib/mongoid/threaded.rb', line 69
def database_override=(name) Thread.current[DATABASE_OVERRIDE_KEY] = name end
#execute_callbacks=(flag) (rw)
Indicates whether document callbacks should be invoked by default for the current thread. Individual documents may further override the callback behavior, but this will be used for the default behavior.
# File 'lib/mongoid/threaded.rb', line 406
def execute_callbacks=(flag) Thread.current[EXECUTE_CALLBACKS] = flag end
#execute_callbacks? ⇒ true
| false
(rw)
Queries whether document callbacks should be executed by default for the current thread.
Unless otherwise indicated (by #execute_callbacks=), this will return true.
# File 'lib/mongoid/threaded.rb', line 392
def execute_callbacks? if Thread.current.key?(EXECUTE_CALLBACKS) Thread.current[EXECUTE_CALLBACKS] else true end end
Instance Method Details
#add_modified_document(session, document)
Store a reference to the document that was modified inside a transaction associated with the session.
# File 'lib/mongoid/threaded.rb', line 365
def add_modified_document(session, document) return unless session&.in_transaction? modified_documents[session] << document end
#autosaved?(document) ⇒ true
| false
Is the document autosaved on the current thread?
# File 'lib/mongoid/threaded.rb', line 264
def autosaved?(document) autosaves_for(document.class).include?(document._id) end
#autosaves ⇒ Hash
Get all autosaves on the current thread.
# File 'lib/mongoid/threaded.rb', line 286
def autosaves Thread.current[AUTOSAVES_KEY] ||= {} end
#autosaves_for(klass) ⇒ Array
Get all autosaves on the current thread for the class.
# File 'lib/mongoid/threaded.rb', line 308
def autosaves_for(klass) autosaves[klass] ||= [] end
#begin_autosave(document)
Begin autosaving a document on the current thread.
# File 'lib/mongoid/threaded.rb', line 115
def begin_autosave(document) autosaves_for(document.class).push(document._id) end
#begin_execution(name) ⇒ true
Begin entry into a named thread local stack.
# File 'lib/mongoid/threaded.rb', line 47
def begin_execution(name) stack(name).push(true) end
#begin_validate(document)
Begin validating a document on the current thread.
# File 'lib/mongoid/threaded.rb', line 125
def begin_validate(document) validations_for(document.class).push(document._id) end
#begin_without_default_scope(klass)
Begin suppressing default scopes for given model on the current thread.
# File 'lib/mongoid/threaded.rb', line 157
def begin_without_default_scope(klass) stack(:without_default_scope).push(klass) end
#clear_modified_documents(session) ⇒ Set<Mongoid::Document>
Clears the set of modified documents for the given session, and return the content of the set before the clearance.
# File 'lib/mongoid/threaded.rb', line 378
def clear_modified_documents(session) modified_documents[session].dup ensure modified_documents[session].clear end
#clear_session(client: nil) ⇒ nil
For backward compatibility it is allowed to call this method without
Clear the cached session for this thread for a client.
specifying Mongoid#client parameter.
#current_scope(klass = nil) ⇒ Criteria
Get the current ::Mongoid
scope.
# File 'lib/mongoid/threaded.rb', line 204
def current_scope(klass = nil) if klass && Thread.current[CURRENT_SCOPE_KEY].respond_to?(:keys) Thread.current[CURRENT_SCOPE_KEY][ Thread.current[CURRENT_SCOPE_KEY].keys.find { |k| k <= klass } ] else Thread.current[CURRENT_SCOPE_KEY] end end
#current_scope=(scope) ⇒ Criteria
[ GitHub ]# File 'lib/mongoid/threaded.rb', line 222
def current_scope=(scope) Thread.current[CURRENT_SCOPE_KEY] = scope end
#executing?(name) ⇒ true
Are in the middle of executing the named stack
# File 'lib/mongoid/threaded.rb', line 81
def executing?(name) !stack(name).empty? end
#exit_autosave(document)
Exit autosaving a document on the current thread.
# File 'lib/mongoid/threaded.rb', line 135
def exit_autosave(document) autosaves_for(document.class).delete_one(document._id) end
#exit_execution(name) ⇒ true
Exit from a named thread local stack.
# File 'lib/mongoid/threaded.rb', line 93
def exit_execution(name) stack(name).pop end
#exit_validate(document)
Exit validating a document on the current thread.
# File 'lib/mongoid/threaded.rb', line 145
def exit_validate(document) validations_for(document.class).delete_one(document._id) end
#exit_without_default_scope(klass)
Exit suppressing default scopes for given model on the current thread.
# File 'lib/mongoid/threaded.rb', line 169
def exit_without_default_scope(klass) stack(:without_default_scope).delete(klass) end
#get_session(client: nil) ⇒ Mongo::Session
| nil
For backward compatibility it is allowed to call this method without
Get the cached session for this thread for a client.
specifying Mongoid#client parameter.
#modified_documents ⇒ Hash<Mongo::Session
, Set<Mongoid::Document>>
Returns the thread store of modified documents.
# File 'lib/mongoid/threaded.rb', line 425
def modified_documents Thread.current[MODIFIED_DOCUMENTS_KEY] ||= Hash.new do |h, k| h[k] = Set.new end end
#sessions ⇒ Hash<Integer, Set>
Returns the thread store of sessions.
# File 'lib/mongoid/threaded.rb', line 415
def sessions Thread.current[SESSIONS_KEY] ||= {}.compare_by_identity end
#set_current_scope(scope, klass) ⇒ Criteria
[ GitHub ]# File 'lib/mongoid/threaded.rb', line 235
def set_current_scope(scope, klass) if scope.nil? unset_current_scope(klass) else Thread.current[CURRENT_SCOPE_KEY] ||= {} Thread.current[CURRENT_SCOPE_KEY][klass] = scope end end
#set_session(session, client: nil)
For backward compatibility it is allowed to call this method without
Cache a session for this thread for a client.
specifying Mongoid#client parameter.
#stack(name) ⇒ Array
Get the named stack.
# File 'lib/mongoid/threaded.rb', line 105
def stack(name) Thread.current[STACK_KEYS[name]] ||= [] end
#unset_current_scope(klass) (private)
Removes the given klass from the current scope, and tidies the current scope list.
# File 'lib/mongoid/threaded.rb', line 437
def unset_current_scope(klass) return unless Thread.current[CURRENT_SCOPE_KEY] Thread.current[CURRENT_SCOPE_KEY].delete(klass) Thread.current[CURRENT_SCOPE_KEY] = nil if Thread.current[CURRENT_SCOPE_KEY].empty? end
#validated?(document) ⇒ true
| false
Is the document validated on the current thread?
# File 'lib/mongoid/threaded.rb', line 276
def validated?(document) validations_for(document.class).include?(document._id) end
#validations ⇒ Hash
Get all validations on the current thread.
# File 'lib/mongoid/threaded.rb', line 296
def validations Thread.current[VALIDATIONS_KEY] ||= {} end
#validations_for(klass) ⇒ Array
Get all validations on the current thread for the class.
# File 'lib/mongoid/threaded.rb', line 320
def validations_for(klass) validations[klass] ||= [] end
#without_default_scope?(klass) ⇒ Boolean
Is the given klass’ default scope suppressed on the current thread?
# File 'lib/mongoid/threaded.rb', line 252
def without_default_scope?(klass) stack(:without_default_scope).include?(klass) end