| Module | Sequel::Postgres::StaticCacheUpdater |
| In: |
lib/sequel/extensions/pg_static_cache_updater.rb
|
Add the static cache update function to the PostgreSQL database. This must be added before any triggers using this function are added.
Options:
| :channel_name : | Override the channel name to use. |
| :function_name : | Override the function name to use. |
# File lib/sequel/extensions/pg_static_cache_updater.rb, line 80
80: def create_static_cache_update_function(opts=OPTS)
81: create_function(opts[:function_name]||default_static_cache_update_name, "BEGIN\n PERFORM pg_notify(\#{literal((opts[:channel_name]||default_static_cache_update_name).to_s)}, TG_RELID::text);\n RETURN NULL;\nEND\n", :returns=>:trigger, :language=>:plpgsql)
82: end
Add a trigger to the given table that calls the function which will notify about table changes.
Options:
| :function_name : | Override the function name to use. |
| :trigger_name : | Override the trigger name to use. |
# File lib/sequel/extensions/pg_static_cache_updater.rb, line 96
96: def create_static_cache_update_trigger(table, opts=OPTS)
97: create_trigger(table, opts[:trigger_name]||default_static_cache_update_name, opts[:function_name]||default_static_cache_update_name, :after=>true)
98: end
The default name for the function, trigger, and notification channel for this extension.
# File lib/sequel/extensions/pg_static_cache_updater.rb, line 102
102: def default_static_cache_update_name
103: :sequel_static_cache_update
104: end
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. |
# File lib/sequel/extensions/pg_static_cache_updater.rb, line 118
118: def listen_for_static_cache_updates(models, opts=OPTS)
119: raise Error, "this database object does not respond to listen, use the postgres adapter with the pg driver" unless respond_to?(:listen)
120: models = [models] unless models.is_a?(Array)
121: raise Error, "array of models to listen for changes cannot be empty" if models.empty?
122:
123: oid_map = {}
124: models.each do |model|
125: raise Error, "#{model.inspect} does not use the static_cache plugin" unless model.respond_to?(:load_cache, true)
126: oid_map[get(regclass_oid(model.dataset.first_source_table))] = model
127: end
128:
129: Thread.new do
130: begin
131: listen(opts[:channel_name]||default_static_cache_update_name, {:loop=>true}.merge!(opts)) do |_, _, oid|
132: if model = oid_map[oid.to_i]
133: model.send(:load_cache)
134: end
135: end
136: ensure
137: opts[:before_thread_exit].call if opts[:before_thread_exit]
138: end
139: end
140: end