lib/mini_sql/builder.rb in mini_sql-1.1.3 vs lib/mini_sql/builder.rb in mini_sql-1.2.0

- old
+ new

@@ -9,36 +9,50 @@ @connection = connection @count_variables = 1 @is_prepared = false end - [:set, :where2, :where, :order_by, :left_join, :join, :select, :group_by].each do |k| - define_method k do |sql_part, *args| - if Hash === args[0] - @args.merge!(args[0]) - else # convert simple params to hash - args.each do |v| - # for compatability with AR param encoded we keep a non _ - # prefix (must be [a-z]) - param = "mq_auto_#{@count_variables += 1}" - sql_part = sql_part.sub('?', ":#{param}") - @args[param.to_sym] = v + literals1 = + [:set, :where2, :where, :order_by, :left_join, :join, :select, :group_by].each do |k| + define_method k do |sql_part, *args| + if Hash === args[0] + @args.merge!(args[0]) + else # convert simple params to hash + args.each do |v| + # for compatability with AR param encoded we keep a non _ + # prefix (must be [a-z]) + param = "mq_auto_#{@count_variables += 1}" + sql_part = sql_part.sub('?', ":#{param}") + @args[param.to_sym] = v + end end + + @sections[k] ||= [] + @sections[k] << sql_part + self end + end - @sections[k] ||= [] - @sections[k] << sql_part - self + literals2 = + [:limit, :offset].each do |k| + define_method k do |value| + @args["mq_auto_#{k}".to_sym] = value + @sections[k] = true + self + end end - end - [:limit, :offset].each do |k| - define_method k do |value| - @args["mq_auto_#{k}".to_sym] = value - @sections[k] = true - self + PREDEFINED_SQL_LITERALS = (literals1 | literals2).to_set + + def sql_literal(literals) + literals.each do |name, part_sql| + if PREDEFINED_SQL_LITERALS.include?(name) + raise "/*#{name}*/ is predefined, use method `.#{name}` instead `sql_literal`" + end + @sections[name] = part_sql.is_a?(::MiniSql::Builder) ? part_sql.to_sql : part_sql end + self end [:query, :query_single, :query_hash, :query_array, :exec].each do |m| class_eval <<~RUBY def #{m}(hash_args = nil) @@ -91,12 +105,16 @@ joined = (+"ORDER BY ") << v.join(" , ") when :group_by joined = (+"GROUP BY ") << v.join(" , ") when :set joined = (+"SET ") << v.join(" , ") + else # for sql_literal + joined = v end - sql.sub!("/*#{k}*/", joined) + unless sql.sub!("/*#{k}*/", joined) + raise "The section for the /*#{k}*/ clause was not found!" + end end sql end