class Sequel::Dataset::PlaceholderLiteralizer::Recorder
the SQL query.
Records the offsets at which the placeholder arguments are used in
def arg(v=(no_arg_given = true; @argn+=1))
general you shouldn't mix calls with an argument and calls without an
Return an Argument with the specified position, or the next position. In
def arg(v=(no_arg_given = true; @argn+=1)) unless no_arg_given @argn = v if @argn < v end Argument.new(self, v) end
def loader(dataset, &block)
call #arg on the receiver for each placeholder argument, and
Yields the receiver and the dataset to the block, which should
def loader(dataset, &block) PlaceholderLiteralizer.new(*process(dataset, &block)) end
def prepared_sql_and_frags(dataset, prepared_args, &block)
Sequel::SQL::PlaceholderLiteralString. Designed for use with
SQL fragments suitable for using for creating a
(suitable for inspect), the the second being an array of
SQL string with interpolated prepared argument placeholders
Return an array with two elements, the first being an
def prepared_sql_and_frags(dataset, prepared_args, &block) _, frags, final_sql, _ = process(dataset, &block) frags = frags.map(&:first) prepared_sql = String.new frags.each_with_index do |sql, i| prepared_sql << sql prepared_sql << "$#{prepared_args[i]}" end frags << final_sql prepared_sql << final_sql [prepared_sql, frags] end
def process(dataset)
def process(dataset) @argn = -1 @args = [] ds = yield self, dataset sql = ds.clone(:placeholder_literalizer=>self).sql last_offset = 0 fragments = @args.map do |used_sql, offset, arg, t| raise Error, "placeholder literalizer argument literalized into different string than dataset returned" unless used_sql.equal?(sql) a = [sql[last_offset...offset], arg, t] last_offset = offset a end final_sql = sql[last_offset..-1] arity = @argn+1 [ds, fragments, final_sql, arity] end
def use(sql, arg, transformer)
Record the offset at which the argument is used in the SQL query, and any
def use(sql, arg, transformer) @args << [sql, sql.length, arg, transformer] end