Class: RedisMemo::AfterCommit
- Inherits:
-
Object
- Object
- RedisMemo::AfterCommit
- Defined in:
- lib/redis_memo/after_commit.rb
Overview
TODO: -> RedisMemo::Memoizable::AfterCommit
Defined Under Namespace
Classes: Callback
Constant Summary collapse
- @@callback_added =
We assume there’s only one ActiveRecord DB connection used for opening transactions
false
- @@pending_memo_versions =
{}
- @@previous_memo_versions =
{}
Class Method Summary collapse
- .after_commit(&blk) ⇒ Object
- .after_rollback(&blk) ⇒ Object
- .bump_memo_version_after_commit(key, version, previous_version:) ⇒ Object
- .connection ⇒ Object
-
.in_transaction? ⇒ Boolean
github.com/Envek/after_commit_everywhere/blob/be8602f9fbb8e40b0fc8a04a47e4c2bc6b560ad5/lib/after_commit_everywhere.rb#L93 Helper method to determine whether we’re currently in transaction or not.
- .pending_memo_versions ⇒ Object
- .reset(commited:) ⇒ Object
- .reset_after_transaction ⇒ Object
Class Method Details
.after_commit(&blk) ⇒ Object
38 39 40 41 42 |
# File 'lib/redis_memo/after_commit.rb', line 38 def self.after_commit(&blk) connection.add_transaction_record( RedisMemo::AfterCommit::Callback.new(connection, committed: blk), ) end |
.after_rollback(&blk) ⇒ Object
44 45 46 47 48 |
# File 'lib/redis_memo/after_commit.rb', line 44 def self.after_rollback(&blk) connection.add_transaction_record( RedisMemo::AfterCommit::Callback.new(connection, rolledback: blk), ) end |
.bump_memo_version_after_commit(key, version, previous_version:) ⇒ Object
24 25 26 27 28 29 |
# File 'lib/redis_memo/after_commit.rb', line 24 def self.bump_memo_version_after_commit(key, version, previous_version:) @@pending_memo_versions[key] = version @@previous_memo_versions[key] = previous_version reset_after_transaction end |
.connection ⇒ Object
12 13 14 |
# File 'lib/redis_memo/after_commit.rb', line 12 def self.connection ActiveRecord::Base.connection end |
.in_transaction? ⇒ Boolean
github.com/Envek/after_commit_everywhere/blob/be8602f9fbb8e40b0fc8a04a47e4c2bc6b560ad5/lib/after_commit_everywhere.rb#L93 Helper method to determine whether we’re currently in transaction or not
33 34 35 36 |
# File 'lib/redis_memo/after_commit.rb', line 33 def self.in_transaction? # service transactions (tests and database_cleaner) are not joinable connection.transaction_open? && connection.current_transaction.joinable? end |
.pending_memo_versions ⇒ Object
16 17 18 19 20 21 22 |
# File 'lib/redis_memo/after_commit.rb', line 16 def self.pending_memo_versions # In DB transactions, the pending memo version should be used immediately # as part of method checksums. method_cache_keys made of # pending_memo_versions are not referencable until we bump the # pending_memo_versions after commiting the current transaction @@pending_memo_versions end |
.reset(commited:) ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/redis_memo/after_commit.rb', line 64 def self.reset(commited:) if commited @@pending_memo_versions.each do |key, version| invalidation_queue = RedisMemo::Memoizable::Invalidation.class_variable_get(:@@invalidation_queue) invalidation_queue << RedisMemo::Memoizable::Invalidation::Task.new( key, version, @@previous_memo_versions[key], ) end RedisMemo::Memoizable::Invalidation.drain_invalidation_queue else @@pending_memo_versions.each_key do |key| RedisMemo::Cache.local_cache&.delete(key) end end @@callback_added = false @@pending_memo_versions.clear @@previous_memo_versions.clear end |
.reset_after_transaction ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/redis_memo/after_commit.rb', line 50 def self.reset_after_transaction return if @@callback_added @@callback_added = true after_commit do reset(commited: true) end after_rollback do reset(commited: false) end end |