Module: Sequel::Dataset::PreparedStatementMethods

Defined in:
lib/sequel/dataset/prepared_statements.rb

Overview

Backbone of the prepared statement support. Grafts bind variable support into datasets by hijacking #literal and using placeholders. By default, emulates prepared statements and bind variables by taking the hash of bind variables and directly substituting them into the query, which works on all databases, as it is no different from using the dataset without bind variables.

Constant Summary collapse

PLACEHOLDER_RE =
/\A\$(.*)\z/

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#log_sqlObject

Whether to log the full SQL query. By default, just the prepared statement name is generally logged on adapters that support native prepared statements.



80
81
82
# File 'lib/sequel/dataset/prepared_statements.rb', line 80

def log_sql
  @log_sql
end

#orig_datasetObject

The dataset that created this prepared statement.



90
91
92
# File 'lib/sequel/dataset/prepared_statements.rb', line 90

def orig_dataset
  @orig_dataset
end

#prepared_argsObject

The array/hash of bound variable placeholder names.



87
88
89
# File 'lib/sequel/dataset/prepared_statements.rb', line 87

def prepared_args
  @prepared_args
end

#prepared_modify_valuesObject

The argument to supply to insert and update, which may use placeholders specified by prepared_args



94
95
96
# File 'lib/sequel/dataset/prepared_statements.rb', line 94

def prepared_modify_values
  @prepared_modify_values
end

#prepared_typeObject

The type of prepared statement, should be one of :select, :first, :insert, :update, or :delete



84
85
86
# File 'lib/sequel/dataset/prepared_statements.rb', line 84

def prepared_type
  @prepared_type
end

Instance Method Details

#call(bind_vars = {}, &block) ⇒ Object

Sets the prepared_args to the given hash and runs the prepared statement.



98
99
100
# File 'lib/sequel/dataset/prepared_statements.rb', line 98

def call(bind_vars={}, &block)
  bind(bind_vars).run(&block)
end

#columnsObject

Send the columns to the original dataset, as calling it on the prepared statement can cause problems.



111
112
113
# File 'lib/sequel/dataset/prepared_statements.rb', line 111

def columns
  orig_dataset.columns
end

#inspectObject

Programmer friendly string showing this is a prepared statement, with the prepared SQL it represents (which in general won’t have substituted variables).



156
157
158
# File 'lib/sequel/dataset/prepared_statements.rb', line 156

def inspect
  "<#{visible_class_name}/PreparedStatement #{prepared_sql.inspect}>"
end

#literal_symbol_append(sql, v) ⇒ Object

Changes the values of symbols if they start with $ and prepared_args is present. If so, they are considered placeholders, and they are substituted using prepared_arg.



140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/sequel/dataset/prepared_statements.rb', line 140

def literal_symbol_append(sql, v)
  if @opts[:bind_vars] and match = PLACEHOLDER_RE.match(v.to_s)
    s = match[1].to_sym
    if prepared_arg?(s)
      literal_append(sql, prepared_arg(s))
    else
      sql << v.to_s
    end
  else
    super
  end
end

#prepareObject

Raise an error if attempting to call prepare on an already prepared statement.

Raises:



104
105
106
107
# File 'lib/sequel/dataset/prepared_statements.rb', line 104

def prepare(*)
  raise Error, "cannot prepare an already prepared statement" unless allow_preparing_prepared_statements?
  super
end

#prepared_sqlObject

Returns the SQL for the prepared statement, depending on the type of the statement and the prepared_modify_values.



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/sequel/dataset/prepared_statements.rb', line 117

def prepared_sql
  case @prepared_type
  when :select, :all, :each
    # Most common scenario, so listed first.
    select_sql
  when :first
    clone(:limit=>1).select_sql
  when :insert_select
    insert_select_sql(*@prepared_modify_values)
  when :insert
    insert_sql(*@prepared_modify_values)
  when :update
    update_sql(*@prepared_modify_values)
  when :delete
    delete_sql
  else
    select_sql
  end
end