Method: RSQL::MySQLResults.query

Defined in:
lib/rsql/mysql_results.rb

.query(sql, eval_context, raw = false, max_rows = @@max_rows) ⇒ Object

Get results from a query.



199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# File 'lib/rsql/mysql_results.rb', line 199

def query(sql, eval_context, raw=false, max_rows=@@max_rows)
    if @@conn.reconnected?
        # make sure we stick with the user's last database in case
        # we had to reconnect (probably because the query thread was
        # killed
        @@conn.select_db(@@database_name) if @@database_name
    end

    @@history.shift if @@max_history <= @@history.size
    @@history << sql

    start   = Time.now.to_f
    results = @@conn.query(sql)
    elapsed = Time.now.to_f - start.to_f

    affected_rows = @@conn.affected_rows
    unless results && 0 < results.num_rows
        return new(nil, nil, affected_rows, sql, elapsed)
    end

    if max_rows < results.num_rows
        raise MaxRowsException.new(results.num_rows, max_rows)
    end

    # extract mysql results into our own table so we can
    # predetermine the lengths of columns and give users a chance to
    # reformat column data before it's displayed (via the bang maps)

    fields = results.fetch_fields
    extend_fields!(fields)

    results_table = []
    while vals = results.fetch_row
        row = []
        fields.each_with_index do |field, i|
            val = vals[i]
            orig_vlen = val.respond_to?(:length) ? val.length : 0
            if val && field.is_num?
                val = field.decimals == 0 ? val.to_i : val.to_f
            end
            unless raw
                val = eval_context.bang_eval(field.name, val)
                if val.nil?
                    val = 'NULL'
                elsif HEX_RANGE.include?(field.type) && val =~ /[^[:print:]\s]/
                    val = eval_context.to_hexstr(val)
                end
            end
            update_longest!(field, val, orig_vlen)
            row << val
        end
        results_table << row
    end

    return new(fields, results_table, affected_rows, sql, elapsed)
end