Class: Sequel::MySQL::Dataset

Inherits:
Dataset show all
Includes:
DatasetMethods, StoredProcedures
Defined in:
lib/sequel/adapters/mysql.rb

Overview

Dataset class for MySQL datasets accessed via the native driver.

Defined Under Namespace

Modules: CallableStatementMethods, PreparedStatementMethods, StoredProcedureMethods

Constant Summary

Constants included from DatasetMethods

Sequel::MySQL::DatasetMethods::BOOL_FALSE, Sequel::MySQL::DatasetMethods::BOOL_TRUE, Sequel::MySQL::DatasetMethods::COMMA_SEPARATOR, Sequel::MySQL::DatasetMethods::DELETE_CLAUSE_METHODS, Sequel::MySQL::DatasetMethods::FOR_SHARE, Sequel::MySQL::DatasetMethods::INSERT_CLAUSE_METHODS, Sequel::MySQL::DatasetMethods::SELECT_CLAUSE_METHODS, Sequel::MySQL::DatasetMethods::UPDATE_CLAUSE_METHODS

Constants inherited from Dataset

Dataset::ACTION_METHODS, Dataset::AND_SEPARATOR, Dataset::ARG_BLOCK_ERROR_MSG, Dataset::ARRAY_ACCESS_ERROR_MSG, Dataset::BOOL_FALSE, Dataset::BOOL_TRUE, Dataset::COLUMN_CHANGE_OPTS, Dataset::COLUMN_REF_RE1, Dataset::COLUMN_REF_RE2, Dataset::COLUMN_REF_RE3, Dataset::COMMA_SEPARATOR, Dataset::CONDITIONED_JOIN_TYPES, Dataset::COUNT_FROM_SELF_OPTS, Dataset::COUNT_OF_ALL_AS_COUNT, Dataset::DATASET_ALIAS_BASE_NAME, Dataset::DELETE_CLAUSE_METHODS, Dataset::FOR_UPDATE, Dataset::IMPORT_ERROR_MSG, Dataset::INSERT_CLAUSE_METHODS, Dataset::IS_LITERALS, Dataset::IS_OPERATORS, Dataset::JOIN_METHODS, Dataset::MUTATION_METHODS, Dataset::NON_SQL_OPTIONS, Dataset::NOTIMPL_MSG, Dataset::NULL, Dataset::N_ARITY_OPERATORS, Dataset::PREPARED_ARG_PLACEHOLDER, Dataset::QUALIFY_KEYS, Dataset::QUERY_METHODS, Dataset::QUESTION_MARK, Dataset::SELECT_CLAUSE_METHODS, Dataset::SQL_WITH, Dataset::STANDARD_TIMESTAMP_FORMAT, Dataset::TIMESTAMP_FORMAT, Dataset::TWO_ARITY_OPERATORS, Dataset::UNCONDITIONED_JOIN_TYPES, Dataset::UPDATE_CLAUSE_METHODS, Dataset::WILDCARD, Dataset::WITH_SUPPORTED

Instance Attribute Summary

Attributes inherited from Dataset

#db, #identifier_input_method, #identifier_output_method, #opts, #quote_identifiers, #row_proc

Instance Method Summary collapse

Methods included from DatasetMethods

#complex_expression_sql, #distinct, #for_share, #full_text_search, #full_text_sql, #having, #insert_ignore, #join_table, #join_type_sql, #multi_insert_sql, #on_duplicate_key_update, #provides_accurate_rows_matched?, #quoted_identifier, #replace_sql, #supports_distinct_on?, #supports_intersect_except?, #supports_modifying_joins?, #supports_timestamp_usecs?

Methods inherited from Dataset

#<<, #==, #[], #[]=, #add_graph_aliases, #aliased_expression_sql, #all, #and, #array_sql, #as, #avg, #bind, #boolean_constant_sql, #case_expression_sql, #cast_sql, clause_methods, #clone, #column_all_sql, #columns, #columns!, #complex_expression_sql, #constant_sql, #count, def_mutation_method, #def_mutation_method, #delete_sql, #distinct, #each, #each_page, #each_server, #empty?, #eql?, #except, #exclude, #exists, #filter, #first, #first_source, #first_source_alias, #first_source_table, #for_update, #from, #from_self, #function_sql, #get, #grep, #group, #group_and_count, #group_by, #hash, #having, #import, #initialize, #insert_multiple, #insert_sql, #inspect, #intersect, #interval, #invert, #join, #join_clause_sql, #join_on_clause_sql, #join_table, #join_using_clause_sql, #last, #limit, #literal, #lock_style, #map, #max, #min, #multi_insert, #multi_insert_sql, #naked, #negative_boolean_constant_sql, #or, #order, #order_append, #order_by, #order_more, #order_prepend, #ordered_expression_sql, #paginate, #placeholder_literal_string_sql, #print, #provides_accurate_rows_matched?, #qualified_identifier_sql, #qualify, #qualify_to, #qualify_to_first_source, #query, #quote_identifier, #quote_identifiers?, #quote_schema_table, #quoted_identifier, #range, #requires_sql_standard_datetimes?, #reverse, #reverse_order, #schema_and_table, #select, #select_all, #select_append, #select_hash, #select_map, #select_more, #select_order_map, #select_sql, #server, #set, #set_defaults, #set_graph_aliases, #set_overrides, #single_record, #single_value, #split_alias, #sql, #subscript_sql, #sum, #supports_cte?, #supports_distinct_on?, #supports_intersect_except?, #supports_intersect_except_all?, #supports_is_true?, #supports_join_using?, #supports_modifying_joins?, #supports_multiple_column_in?, #supports_timestamp_timezones?, #supports_timestamp_usecs?, #supports_window_functions?, #to_csv, #to_hash, #truncate, #truncate_sql, #unfiltered, #ungraphed, #ungrouped, #union, #unlimited, #unordered, #unused_table_alias, #update_sql, #where, #window_function_sql, #window_sql, #with, #with_recursive, #with_sql

Methods included from Sequel::Metaprogramming

#meta_def

Constructor Details

This class inherits a constructor from Sequel::Dataset

Instance Method Details

#call(type, bind_arguments = {}, *values, &block) ⇒ Object

MySQL is different in that it supports prepared statements but not bound variables outside of prepared statements. The default implementation breaks the use of subselects in prepared statements, so extend the temporary prepared statement that this creates with a module that fixes it.



314
315
316
317
318
# File 'lib/sequel/adapters/mysql.rb', line 314

def call(type, bind_arguments={}, *values, &block)
  ps = to_prepared_statement(type, values)
  ps.extend(CallableStatementMethods)
  ps.call(bind_arguments, &block)
end

#deleteObject

Delete rows matching this dataset



321
322
323
# File 'lib/sequel/adapters/mysql.rb', line 321

def delete
  execute_dui(delete_sql){|c| return c.affected_rows}
end

#fetch_rows(sql, &block) ⇒ Object

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.



328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
# File 'lib/sequel/adapters/mysql.rb', line 328

def fetch_rows(sql, &block)
  execute(sql) do |r|
    i = -1
    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 && f.length != 1 ? MYSQL_TYPES[2] : MYSQL_TYPES[f.type]
      [output_identifier(f.name), type_proc, i+=1]
    end
    @columns = cols.map{|c| c.first}
    if opts[:split_multiple_result_sets]
      s = []
      yield_rows(r, cols){|h| s << h}
      yield s
    else
      yield_rows(r, cols, &block)
    end
  end
  self
end

#graphObject

Don’t allow graphing a dataset that splits multiple statements

Raises:



351
352
353
354
# File 'lib/sequel/adapters/mysql.rb', line 351

def graph(*)
  raise(Error, "Can't graph a dataset that splits multiple result sets") if opts[:split_multiple_result_sets]
  super
end

#insert(*values) ⇒ Object

Insert a new value into this dataset



357
358
359
# File 'lib/sequel/adapters/mysql.rb', line 357

def insert(*values)
  execute_dui(insert_sql(*values)){|c| return c.insert_id}
end

#prepare(type, name = nil, *values) ⇒ Object

Store the given type of prepared statement in the associated database with the given name.



363
364
365
366
367
368
369
370
371
# File 'lib/sequel/adapters/mysql.rb', line 363

def prepare(type, name=nil, *values)
  ps = to_prepared_statement(type, values)
  ps.extend(PreparedStatementMethods)
  if name
    ps.prepared_statement_name = name
    db.prepared_statements[name] = ps
  end
  ps
end

#replace(*args) ⇒ Object

Replace (update or insert) the matching row.



374
375
376
# File 'lib/sequel/adapters/mysql.rb', line 374

def replace(*args)
  execute_dui(replace_sql(*args)){|c| return c.insert_id}
end

#split_multiple_result_setsObject

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.

Raises:



387
388
389
390
391
392
# File 'lib/sequel/adapters/mysql.rb', line 387

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.row_proc = proc{|x| x.map{|h| row_proc.call(h)}} if row_proc
  ds
end

#update(values = {}) ⇒ Object

Update the matching rows.



395
396
397
# File 'lib/sequel/adapters/mysql.rb', line 395

def update(values={})
  execute_dui(update_sql(values)){|c| return c.affected_rows}
end