class Sequel::MySQL::Dataset
Dataset class for MySQL datasets accessed via the native driver.
Public Instance Methods
Yield all rows matching this dataset. If the dataset is set to split multiple statements, yield arrays of hashes one per statement instead of yielding results for all statements as hashes.
# File lib/sequel/adapters/mysql.rb, line 306 def fetch_rows(sql) execute(sql) do |r| i = -1 cps = db.conversion_procs cols = r.fetch_fields.map do |f| # Pretend tinyint is another integer type if its length is not 1, to # avoid casting to boolean if Sequel::MySQL.convert_tinyint_to_bool # is set. type_proc = f.type == 1 && cast_tinyint_integer?(f) ? cps[2] : cps[f.type] [output_identifier(f.name), type_proc, i+=1] end self.columns = cols.map(&:first) if opts[:split_multiple_result_sets] s = [] yield_rows(r, cols){|h| s << h} yield s else yield_rows(r, cols){|h| yield h} end end self end
Don't allow graphing a dataset that splits multiple statements
# File lib/sequel/adapters/mysql.rb, line 330 def graph(*) raise(Error, "Can't graph a dataset that splits multiple result sets") if opts[:split_multiple_result_sets] super end
Makes each yield arrays of rows, with each array containing the rows for a given result set. Does not work with graphing. So you can submit SQL with multiple statements and easily determine which statement returned which results.
Modifies the row_proc of the returned dataset so that it still works as expected (running on the hashes instead of on the arrays of hashes). If you modify the row_proc afterward, note that it will receive an array of hashes instead of a hash.
# File lib/sequel/adapters/mysql.rb, line 344 def split_multiple_result_sets raise(Error, "Can't split multiple statements on a graphed dataset") if opts[:graph] ds = clone(:split_multiple_result_sets=>true) ds = ds.with_row_proc(proc{|x| x.map{|h| row_proc.call(h)}}) if row_proc ds end
Private Instance Methods
Whether a tinyint field should be casted as an integer. By default, casts to integer if the field length is not 1. Can be overwritten to make tinyint casting dataset dependent.
# File lib/sequel/adapters/mysql.rb, line 356 def cast_tinyint_integer?(field) field.length != 1 end
Set the :type option to :select if it hasn't been set.
# File lib/sequel/adapters/mysql.rb, line 361 def execute(sql, opts=OPTS) opts = Hash[opts] opts[:type] = :select super end
Handle correct quoting of strings using ::MySQL.quote.
# File lib/sequel/adapters/mysql.rb, line 368 def literal_string_append(sql, v) sql << "'" sql << ::Mysql.quote(v) sql << "'" end
Yield each row of the given result set r with columns cols as a hash with symbol keys
# File lib/sequel/adapters/mysql.rb, line 376 def yield_rows(r, cols) while row = r.fetch_row h = {} cols.each{|n, p, i| v = row[i]; h[n] = (v && p) ? p.call(v) : v} yield h end end