module Sequel::Postgres::StatementCache::AdapterMethods

Constants

DML_RE

A regular expression for the types of queries to cache. Any queries not matching this regular expression are not cached.

Attributes

statement_cache[R]

The StatementCache instance for this connection. Note that each connection has a separate StatementCache, because prepared statements are connection-specific.

Public Class Methods

extended(c) click to toggle source

Set the #statement_cache for the connection, using the database's :statement_cache_opts option.

# File lib/sequel/extensions/pg_statement_cache.rb, line 230
def self.extended(c)
  Sequel::Deprecation.deprecate('The pg_statement_cache extension', 'Please stop loading it') unless defined?(SEQUEL_EXTENSIONS_NO_DEPRECATION_WARNING)
  c.instance_variable_set(:@statement_cache, StatementCache.new(c.sequel_db.opts[:statement_cache_opts] || {}){|name| c.deallocate(name)})
end

Public Instance Methods

deallocate(name) click to toggle source

Deallocate on the server the prepared statement with the given name.

# File lib/sequel/extensions/pg_statement_cache.rb, line 242
def deallocate(name)
  begin
    execute("DEALLOCATE #{name}")
  rescue PGError
    # table probably got removed, just ignore it
  end
end
sequel_db() click to toggle source

pg seems to already use the db method (but not the @db instance variable), so use the #sequel_db method to access the related Sequel::Database object.

# File lib/sequel/extensions/pg_statement_cache.rb, line 237
def sequel_db
  @db
end

Private Instance Methods

execute_query(sql, args=nil) click to toggle source

If the sql query string is one we should cache, cache it. If the query already has a related prepared statement with it, execute the prepared statement instead of executing the query normally.

Calls superclass method
# File lib/sequel/extensions/pg_statement_cache.rb, line 255
def execute_query(sql, args=nil)
  if sql =~ DML_RE
    if name = statement_cache.fetch(sql){|stmt_name| sequel_db.log_yield("PREPARE #{stmt_name} AS #{sql}"){prepare(stmt_name, sql)}}
      if args
        sequel_db.log_yield("EXECUTE #{name} (#{sql})", args){exec_prepared(name, args)}
      else
        sequel_db.log_yield("EXECUTE #{name} (#{sql})"){exec_prepared(name)}
      end
    else
      super
    end
  else
    super
  end
end