# File lib/sequel/plugins/prepared_statements.rb, line 134 def primary_key_lookup(pk) prepared_lookup.call(primary_key_hash(pk)) end
module Sequel::Plugins::PreparedStatements::ClassMethods
Private Instance Methods
If a prepared statement has already been cached for the given type and subtype, return it. Otherwise, yield to the block to get the prepared statement, and cache it.
# File lib/sequel/plugins/prepared_statements.rb, line 140 def cached_prepared_statement(type, subtype) h = @prepared_statements[type] Sequel.synchronize do if v = h[subtype] return v end end ps = yield Sequel.synchronize{h[subtype] = ps} end
Create a prepared statement, but modify the SQL used so that the model's columns are explicitly selected instead of using *, assuming that the dataset selects from a single table.
# File lib/sequel/plugins/prepared_statements.rb, line 54 def prepare_explicit_statement(ds, type, vals=OPTS) f = ds.opts[:from] meth = type == :insert_select ? :returning : :select s = ds.opts[meth] if f && f.length == 1 && !ds.opts[:join] && (!s || s.empty?) ds = ds.send(meth, *columns.map{|c| Sequel.identifier(c)}) end prepare_statement(ds, type, vals) end
Create a prepared statement based on the given dataset with a unique name for the given type of query and values.
# File lib/sequel/plugins/prepared_statements.rb, line 67 def prepare_statement(ds, type, vals=OPTS) ps = ds.prepare(type, :"smpsp_#{NEXT.call}", vals) ps.log_sql = true ps end
Return a sorted array of columns for use as a hash key.
# File lib/sequel/plugins/prepared_statements.rb, line 74 def prepared_columns(cols) RUBY_VERSION >= '1.9' ? cols.sort : cols.sort_by{|c| c.to_s} end
Return a prepared statement that can be used to delete a row from this model's dataset.
# File lib/sequel/plugins/prepared_statements.rb, line 79 def prepared_delete cached_prepared_statement(:fixed, :delete){prepare_statement(filter(prepared_statement_key_array(primary_key)), :delete)} end
Return a prepared statement that can be used to insert a row using the given columns.
# File lib/sequel/plugins/prepared_statements.rb, line 84 def prepared_insert(cols) cached_prepared_statement(:insert, prepared_columns(cols)){prepare_statement(dataset, :insert, prepared_statement_key_hash(cols))} end
Return a prepared statement that can be used to insert a row using the given columns and return that column values for the row created.
# File lib/sequel/plugins/prepared_statements.rb, line 90 def prepared_insert_select(cols) if dataset.supports_insert_select? cached_prepared_statement(:insert_select, prepared_columns(cols)){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)), :insert_select, prepared_statement_key_hash(cols))} end end
Return a prepared statement that can be used to lookup a row solely based on the primary key.
# File lib/sequel/plugins/prepared_statements.rb, line 97 def prepared_lookup cached_prepared_statement(:fixed, :lookup){prepare_explicit_statement(filter(prepared_statement_key_array(primary_key)), :first)} end
Return a prepared statement that can be used to refresh a row to get new column values after insertion.
# File lib/sequel/plugins/prepared_statements.rb, line 102 def prepared_refresh cached_prepared_statement(:fixed, :refresh){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)).filter(prepared_statement_key_array(primary_key)), :first)} end
Return an array of two element arrays with the column symbol as the first entry and the placeholder symbol as the second entry.
# File lib/sequel/plugins/prepared_statements.rb, line 108 def prepared_statement_key_array(keys) if dataset.requires_placeholder_type_specifiers? sch = db_schema Array(keys).map do |k| if (s = sch[k]) && (t = s[:type]) [k, :"$#{k}__#{t}"] else [k, :"$#{k}"] end end else Array(keys).map{|k| [k, :"$#{k}"]} end end
Return a hash mapping column symbols to placeholder symbols.
# File lib/sequel/plugins/prepared_statements.rb, line 124 def prepared_statement_key_hash(keys) Hash[*(prepared_statement_key_array(keys).flatten)] end
Return a prepared statement that can be used to update row using the given columns.
# File lib/sequel/plugins/prepared_statements.rb, line 129 def prepared_update(cols) cached_prepared_statement(:update, prepared_columns(cols)){prepare_statement(filter(prepared_statement_key_array(primary_key)), :update, prepared_statement_key_hash(cols))} end
Use a prepared statement to query the database for the row matching the given primary key.