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