225: def fetch_rows(sql)
226: execute(sql) do |recordset|
227: cols = []
228: conversion_procs = db.conversion_procs
229:
230: i = -1
231: ts_cp = nil
232: recordset.Fields.each do |field|
233: type = field.Type
234: cp = if type == AdDBTimeStamp
235: ts_cp ||= begin
236: nsec_div = 1000000000.0/(10**(timestamp_precision))
237: nsec_mul = 10**(timestamp_precision+3)
238: meth = db.method(:to_application_timestamp)
239: lambda do |v|
240:
241: meth.call([v.year, v.month, v.day, v.hour, v.min, v.sec, (v.nsec/nsec_div).round * nsec_mul])
242: end
243: end
244: else
245: conversion_procs[type]
246: end
247: cols << [output_identifier(field.Name), cp, i+=1]
248: end
249:
250: self.columns = cols.map(&:first)
251: return if recordset.EOF
252:
253: recordset.GetRows.transpose.each do |field_values|
254: h = {}
255:
256: cols.each do |name, cp, i|
257: h[name] = if (v = field_values[i]) && cp
258: cp[v]
259: else
260: v
261: end
262: end
263:
264: yield h
265: end
266: end
267: end