Method: Sequel::Postgres::StaticCacheUpdater#listen_for_static_cache_updates

Defined in:
lib/sequel/extensions/pg_static_cache_updater.rb

#listen_for_static_cache_updates(models, opts = OPTS) ⇒ Object

Listen on the notification channel for changes to any of tables for the models given in a new thread. If notified about a change to one of the tables, reload the cache for the related model. Options given are also passed to Database#listen.

Note that this implementation does not currently support multiple models that use the same underlying table.

Options:

:channel_name

Override the channel name to use.

:before_thread_exit

An object that responds to call that is called before the the created thread exits.

Raises:

  • (Error)
[View source]

117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/sequel/extensions/pg_static_cache_updater.rb', line 117

def listen_for_static_cache_updates(models, opts=OPTS)
  raise Error, "this database object does not respond to listen, use the postgres adapter with the pg driver" unless respond_to?(:listen)
  models = [models] unless models.is_a?(Array)
  raise Error, "array of models to listen for changes cannot be empty" if models.empty?

  oid_map = {}
  models.each do |model|
    raise Error, "#{model.inspect} does not use the static_cache plugin" unless model.respond_to?(:load_cache)
    oid_map[get(regclass_oid(model.dataset.first_source_table))] = model
  end

  Thread.new do
    begin
      listen(opts[:channel_name]||default_static_cache_update_name, {:loop=>true}.merge!(opts)) do |_, _, oid|
        if model = oid_map[oid.to_i]
          model.load_cache
        end
      end
    ensure
      opts[:before_thread_exit].call if opts[:before_thread_exit]
    end
  end
end