Module Sequel::Access
In: lib/sequel/adapters/shared/access.rb

Methods

Included Modules

EmulateOffsetWithReverseAndCount

Classes and Modules

Module Sequel::Access::DatabaseMethods
Module Sequel::Access::DatasetMethods

Constants

DATE_FORMAT = '#%Y-%m-%d#'.freeze
TIMESTAMP_FORMAT = '#%Y-%m-%d %H:%M:%S#'.freeze
TOP = " TOP ".freeze
BRACKET_CLOSE = Dataset::BRACKET_CLOSE
BRACKET_OPEN = Dataset::BRACKET_OPEN
PAREN_CLOSE = Dataset::PAREN_CLOSE
PAREN_OPEN = Dataset::PAREN_OPEN
INTO = Dataset::INTO
FROM = Dataset::FROM
SPACE = Dataset::SPACE
NOT_EQUAL = ' <> '.freeze
OPS = {:'%'=>' Mod '.freeze, :'||'=>' & '.freeze}
BOOL_FALSE = '0'.freeze
BOOL_TRUE = '-1'.freeze
DATE_FUNCTION = 'Date()'.freeze
NOW_FUNCTION = 'Now()'.freeze
TIME_FUNCTION = 'Time()'.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}
EMULATED_FUNCTION_MAP = {:char_length=>:len}
EXTRACT_MAP = {:year=>"'yyyy'", :month=>"'m'", :day=>"'d'", :hour=>"'h'", :minute=>"'n'", :second=>"'s'"}
COMMA = Dataset::COMMA
DATEPART_OPEN = "datepart(".freeze

Public Instance methods

Access doesn‘t support CASE, but it can be emulated with nested IIF function calls.

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 121
121:       def case_expression_sql_append(sql, ce)
122:         literal_append(sql, ce.with_merged_expression.conditions.reverse.inject(ce.default){|exp,(cond,val)| Sequel::SQL::Function.new(:IIF, cond, val, exp)})
123:       end

Access doesn‘t support CAST, it uses separate functions for type conversion

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 127
127:       def cast_sql_append(sql, expr, type)
128:         sql << CAST_TYPES.fetch(type, type).to_s
129:         sql << PAREN_OPEN
130:         literal_append(sql, expr)
131:         sql << PAREN_CLOSE
132:       end

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 134
134:       def complex_expression_sql_append(sql, op, args)
135:         case op
136:         when :ILIKE
137:           complex_expression_sql_append(sql, :LIKE, args)
138:         when 'NOT ILIKE''NOT ILIKE'
139:           complex_expression_sql_append(sql, 'NOT LIKE''NOT LIKE', args)
140:         when :LIKE, 'NOT LIKE''NOT LIKE'
141:           sql << PAREN_OPEN
142:           literal_append(sql, args.at(0))
143:           sql << SPACE << op.to_s << SPACE
144:           literal_append(sql, args.at(1))
145:           sql << PAREN_CLOSE
146:         when '!=''!='
147:           sql << PAREN_OPEN
148:           literal_append(sql, args.at(0))
149:           sql << NOT_EQUAL
150:           literal_append(sql, args.at(1))
151:           sql << PAREN_CLOSE
152:         when '%''%', '||''||'
153:           sql << PAREN_OPEN
154:           c = false
155:           op_str = OPS[op]
156:           args.each do |a|
157:             sql << op_str if c
158:             literal_append(sql, a)
159:             c ||= true
160:           end
161:           sql << PAREN_CLOSE
162:         when :**
163:           sql << PAREN_OPEN
164:           literal_append(sql, args[0])
165:           sql << ' ^ '
166:           literal_append(sql, args[1])
167:           sql << PAREN_CLOSE
168:         when :extract
169:           part = args.at(0)
170:           raise(Sequel::Error, "unsupported extract argument: #{part.inspect}") unless format = EXTRACT_MAP[part]
171:           sql << DATEPART_OPEN << format.to_s << COMMA
172:           literal_append(sql, args.at(1))
173:           sql << PAREN_CLOSE
174:         else
175:           super
176:         end
177:       end

Use Date() and Now() for CURRENT_DATE and CURRENT_TIMESTAMP

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 180
180:       def constant_sql_append(sql, constant)
181:         case constant
182:         when :CURRENT_DATE
183:           sql << DATE_FUNCTION
184:         when :CURRENT_TIMESTAMP
185:           sql << NOW_FUNCTION
186:         when :CURRENT_TIME
187:           sql << TIME_FUNCTION
188:         else
189:           super
190:         end
191:       end

Emulate cross join by using multiple tables in the FROM clause.

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 194
194:       def cross_join(table)
195:         clone(:from=>@opts[:from] + [table])
196:       end

Access uses [] to escape metacharacters, instead of backslashes.

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 199
199:       def escape_like(string)
200:         string.gsub(/[\\*#?\[]/){|m| "[#{m}]"}
201:       end

Specify a table for a SELECT … INTO query.

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 204
204:       def into(table)
205:         clone(:into => table)
206:       end

Access does not support derived column lists.

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 209
209:       def supports_derived_column_lists?
210:         false
211:       end

Access doesn‘t support INTERSECT or EXCEPT

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 214
214:       def supports_intersect_except?
215:         false
216:       end

Access does not support IS TRUE

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 219
219:       def supports_is_true?
220:         false
221:       end

Access doesn‘t support JOIN USING

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 224
224:       def supports_join_using?
225:         false
226:       end

Access does not support multiple columns for the IN/NOT IN operators

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 229
229:       def supports_multiple_column_in?
230:         false
231:       end

Access doesn‘t support truncate, so do a delete instead.

[Source]

     # File lib/sequel/adapters/shared/access.rb, line 234
234:       def truncate
235:         delete
236:         nil
237:       end

[Validate]