Module | Sequel::Dataset::PreparedStatementMethods |
In: |
lib/sequel/dataset/prepared_statements.rb
|
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.
Sets the prepared_args to the given hash and runs the prepared statement.
# File lib/sequel/dataset/prepared_statements.rb, line 109 109: def call(bind_vars={}, &block) 110: bind(bind_vars).run(&block) 111: end
Disallow use of delayed evaluations in prepared statements.
# File lib/sequel/dataset/prepared_statements.rb, line 127 127: def delayed_evaluation_sql_append(sql, delay) 128: raise Error, "delayed evaluations cannot be used in prepared statements" if @opts[:no_delayed_evaluations] 129: super 130: end
Programmer friendly string showing this is a prepared statement, with the prepared SQL it represents (which in general won‘t have substituted variables).
# File lib/sequel/dataset/prepared_statements.rb, line 173 173: def inspect 174: "<#{visible_class_name}/PreparedStatement #{prepared_sql.inspect}>" 175: end
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.
# File lib/sequel/dataset/prepared_statements.rb, line 157 157: def literal_symbol_append(sql, v) 158: if @opts[:bind_vars] and match = /\A\$(.*)\z/.match(v.to_s) 159: s = match[1].to_sym 160: if prepared_arg?(s) 161: literal_append(sql, prepared_arg(s)) 162: else 163: sql << v.to_s 164: end 165: else 166: super 167: end 168: end
The dataset that created this prepared statement.
# File lib/sequel/dataset/prepared_statements.rb, line 97 97: def orig_dataset 98: @opts[:orig_dataset] 99: end
The array/hash of bound variable placeholder names.
# File lib/sequel/dataset/prepared_statements.rb, line 92 92: def prepared_args 93: @opts[:prepared_args] 94: end
The argument to supply to insert and update, which may use placeholders specified by prepared_args
# File lib/sequel/dataset/prepared_statements.rb, line 103 103: def prepared_modify_values 104: @opts[:prepared_modify_values] 105: end
Returns the SQL for the prepared statement, depending on the type of the statement and the prepared_modify_values.
# File lib/sequel/dataset/prepared_statements.rb, line 134 134: def prepared_sql 135: case prepared_type 136: when :select, :all, :each 137: # Most common scenario, so listed first. 138: select_sql 139: when :first 140: clone(:limit=>1).select_sql 141: when :insert_select 142: insert_select_sql(*prepared_modify_values) 143: when :insert, :insert_pk 144: insert_sql(*prepared_modify_values) 145: when :update 146: update_sql(*prepared_modify_values) 147: when :delete 148: delete_sql 149: else 150: select_sql 151: end 152: end
The type of prepared statement, should be one of :select, :first, :insert, :update, or :delete
# File lib/sequel/dataset/prepared_statements.rb, line 87 87: def prepared_type 88: @opts[:prepared_type] 89: end
Run the method based on the type of prepared statement.
# File lib/sequel/dataset/prepared_statements.rb, line 180 180: def run(&block) 181: case prepared_type 182: when :select, :all 183: all(&block) 184: when :each 185: each(&block) 186: when :insert_select 187: with_sql(prepared_sql).first 188: when :first 189: first 190: when :insert, :update, :delete 191: if opts[:returning] && supports_returning?(prepared_type) 192: returning_fetch_rows(prepared_sql) 193: elsif prepared_type == :delete 194: delete 195: else 196: public_send(prepared_type, *prepared_modify_values) 197: end 198: when :insert_pk 199: fetch_rows(prepared_sql){|r| return r.values.first} 200: when Array 201: case prepared_type[0] 202: when :map, :as_hash, :to_hash, :to_hash_groups 203: public_send(*prepared_type, &block) 204: end 205: else 206: raise Error, "unsupported prepared statement type used: #{prepared_type.inspect}" 207: end 208: end