Module | Sequel::Access |
In: |
lib/sequel/adapters/shared/access.rb
|
EXTRACT_MAP | = | {:year=>"'yyyy'", :month=>"'m'", :day=>"'d'", :hour=>"'h'", :minute=>"'n'", :second=>"'s'"}.freeze |
OPS | = | {:'%'=>' Mod '.freeze, :'||'=>' & '.freeze}.freeze |
CAST_TYPES | = | {String=>:CStr, Integer=>:CLng, Date=>:CDate, Time=>:CDate, DateTime=>:CDate, Numeric=>:CDec, BigDecimal=>:CDec, File=>:CStr, Float=>:CDbl, TrueClass=>:CBool, FalseClass=>:CBool}.freeze |
Access doesn‘t support CASE, so emulate it with nested IIF function calls.
# File lib/sequel/adapters/shared/access.rb, line 93 93: def case_expression_sql_append(sql, ce) 94: literal_append(sql, ce.with_merged_expression.conditions.reverse.inject(ce.default){|exp,(cond,val)| Sequel::SQL::Function.new(:IIF, cond, val, exp)}) 95: end
# File lib/sequel/adapters/shared/access.rb, line 106 106: def complex_expression_sql_append(sql, op, args) 107: case op 108: when :ILIKE 109: complex_expression_sql_append(sql, :LIKE, args) 110: when 'NOT ILIKE''NOT ILIKE' 111: complex_expression_sql_append(sql, 'NOT LIKE''NOT LIKE', args) 112: when '!=''!=' 113: sql << '(' 114: literal_append(sql, args[0]) 115: sql << ' <> ' 116: literal_append(sql, args[1]) 117: sql << ')' 118: when '%''%', '||''||' 119: sql << '(' 120: c = false 121: op_str = OPS[op] 122: args.each do |a| 123: sql << op_str if c 124: literal_append(sql, a) 125: c ||= true 126: end 127: sql << ')' 128: when :** 129: sql << '(' 130: literal_append(sql, args[0]) 131: sql << ' ^ ' 132: literal_append(sql, args[1]) 133: sql << ')' 134: when :extract 135: part = args[0] 136: raise(Sequel::Error, "unsupported extract argument: #{part.inspect}") unless format = EXTRACT_MAP[part] 137: sql << "datepart(" << format.to_s << ', ' 138: literal_append(sql, args[1]) 139: sql << ')' 140: else 141: super 142: end 143: end
Use Date(), Now(), and Time() for CURRENT_DATE, CURRENT_TIMESTAMP, and CURRENT_TIME
# File lib/sequel/adapters/shared/access.rb, line 146 146: def constant_sql_append(sql, constant) 147: case constant 148: when :CURRENT_DATE 149: sql << 'Date()' 150: when :CURRENT_TIMESTAMP 151: sql << 'Now()' 152: when :CURRENT_TIME 153: sql << 'Time()' 154: else 155: super 156: end 157: end
Emulate cross join by using multiple tables in the FROM clause.
# File lib/sequel/adapters/shared/access.rb, line 160 160: def cross_join(table) 161: clone(:from=>@opts[:from] + [table]) 162: end
Specify a table for a SELECT … INTO query.
# File lib/sequel/adapters/shared/access.rb, line 170 170: def into(table) 171: clone(:into => table) 172: end