Module: Sequel::Postgres::StaticCacheUpdater
- Defined in:
- lib/sequel/extensions/pg_static_cache_updater.rb
Instance Method Summary collapse
- 
  
    
      #create_static_cache_update_function(opts = OPTS)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Add the static cache update function to the PostgreSQL database. 
- 
  
    
      #create_static_cache_update_trigger(table, opts = OPTS)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Add a trigger to the given table that calls the function which will notify about table changes. 
- 
  
    
      #default_static_cache_update_name  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    The default name for the function, trigger, and notification channel for this extension. 
- 
  
    
      #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. 
Instance Method Details
#create_static_cache_update_function(opts = OPTS) ⇒ Object
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. 
| 80 81 82 83 84 85 86 87 | # File 'lib/sequel/extensions/pg_static_cache_updater.rb', line 80 def create_static_cache_update_function(opts=OPTS) create_function(opts[:function_name]||default_static_cache_update_name, <<SQL, :returns=>:trigger, :language=>:plpgsql) BEGIN PERFORM pg_notify(#{literal((opts[:channel_name]||default_static_cache_update_name).to_s)}, TG_RELID::text); RETURN NULL; END SQL end | 
#create_static_cache_update_trigger(table, opts = OPTS) ⇒ Object
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. 
| 95 96 97 | # File 'lib/sequel/extensions/pg_static_cache_updater.rb', line 95 def create_static_cache_update_trigger(table, opts=OPTS) create_trigger(table, opts[:trigger_name]||default_static_cache_update_name, opts[:function_name]||default_static_cache_update_name, :after=>true) end | 
#default_static_cache_update_name ⇒ Object
The default name for the function, trigger, and notification channel for this extension.
| 101 102 103 | # File 'lib/sequel/extensions/pg_static_cache_updater.rb', line 101 def default_static_cache_update_name :sequel_static_cache_update end | 
#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 callthat is called before the the created thread exits.
| 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 |