Module: Sequel::MySQL::DatabaseMethods

Included in:
DataObjects::MySQL::DatabaseMethods, JDBC::MySQL::DatabaseMethods, Database
Defined in:
lib/sequel_core/adapters/shared/mysql.rb

Overview

Methods shared by Database instances that connect to MySQL, currently supported by the native and JDBC adapters.

Constant Summary collapse

AUTO_INCREMENT =
'AUTO_INCREMENT'.freeze
NOT_NULL =
Sequel::Schema::SQL::NOT_NULL
NULL =
Sequel::Schema::SQL::NULL
PRIMARY_KEY =
Sequel::Schema::SQL::PRIMARY_KEY
TYPES =
Sequel::Schema::SQL::TYPES.merge(DateTime=>'datetime', \
TrueClass=>'tinyint', FalseClass=>'tinyint')
UNIQUE =
Sequel::Schema::SQL::UNIQUE
UNSIGNED =
Sequel::Schema::SQL::UNSIGNED

Instance Method Summary collapse

Instance Method Details

#alter_table_sql(table, op) ⇒ Object

Use MySQL specific syntax for rename column, set column type, and drop index cases.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/sequel_core/adapters/shared/mysql.rb', line 26

def alter_table_sql(table, op)
  case op[:op]
  when :add_column
    if related = op.delete(:table)
      sql = super(table, op)
      op[:table] = related
      [sql, "ALTER TABLE #{quote_schema_table(table)} ADD FOREIGN KEY (#{quote_identifier(op[:name])})#{default_column_references_sql(op)}"]
    else
      super(table, op)
    end
  when :rename_column
    "ALTER TABLE #{quote_schema_table(table)} CHANGE COLUMN #{quote_identifier(op[:name])} #{quote_identifier(op[:new_name])} #{type_literal(op)}"
  when :set_column_type
    "ALTER TABLE #{quote_schema_table(table)} CHANGE COLUMN #{quote_identifier(op[:name])} #{quote_identifier(op[:name])} #{type_literal(op)}"
  when :drop_index
    "#{drop_index_sql(table, op)} ON #{quote_schema_table(table)}"
  else
    super(table, op)
  end
end

#auto_increment_sqlObject

Use MySQL specific AUTO_INCREMENT text.



48
49
50
# File 'lib/sequel_core/adapters/shared/mysql.rb', line 48

def auto_increment_sql
  AUTO_INCREMENT
end

#column_references_sql(column) ⇒ Object

Handle MySQL specific syntax for column references



53
54
55
# File 'lib/sequel_core/adapters/shared/mysql.rb', line 53

def column_references_sql(column)
  "#{", FOREIGN KEY (#{quote_identifier(column[:name])})" unless column[:type] == :check}#{super(column)}"
end

#create_table_sql_list(name, columns, indexes = nil, options = {}) ⇒ Object

Use MySQL specific syntax for engine type and character encoding



58
59
60
61
62
63
64
65
# File 'lib/sequel_core/adapters/shared/mysql.rb', line 58

def create_table_sql_list(name, columns, indexes = nil, options = {})
  options[:engine] = Sequel::MySQL.default_engine unless options.include?(:engine)
  options[:charset] = Sequel::MySQL.default_charset unless options.include?(:charset)
  options[:collate] = Sequel::MySQL.default_collate unless options.include?(:collate)
  sql = ["CREATE TABLE #{quote_schema_table(name)} (#{column_list_sql(columns)})#{" ENGINE=#{options[:engine]}" if options[:engine]}#{" DEFAULT CHARSET=#{options[:charset]}" if options[:charset]}#{" DEFAULT COLLATE=#{options[:collate]}" if options[:collate]}"]
  sql.concat(index_list_sql_list(name, indexes)) if indexes && !indexes.empty?
  sql
end

#index_definition_sql(table_name, index) ⇒ Object

Handle MySQL specific index SQL syntax



68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/sequel_core/adapters/shared/mysql.rb', line 68

def index_definition_sql(table_name, index)
  index_name = quote_identifier(index[:name] || default_index_name(table_name, index[:columns]))
  index_type = case index[:type]
  when :full_text
    "FULLTEXT "
  when :spatial
    "SPATIAL "
  else
    using = " USING #{index[:type]}" unless index[:type] == nil
    "UNIQUE " if index[:unique]
  end
  "CREATE #{index_type}INDEX #{index_name} ON #{quote_schema_table(table_name)} #{literal(index[:columns])}#{using}"
end

#server_versionObject

Get version of MySQL server, used for determined capabilities.



83
84
85
86
# File 'lib/sequel_core/adapters/shared/mysql.rb', line 83

def server_version
  m = /(\d+)\.(\d+)\.(\d+)/.match(get(SQL::Function.new(:version)))
  @server_version ||= (m[1].to_i * 10000) + (m[2].to_i * 100) + m[3].to_i
end

#tables(opts = {}) ⇒ Object

Return an array of symbols specifying table names in the current database.

Options:

  • :server - Set the server to use



92
93
94
95
96
97
# File 'lib/sequel_core/adapters/shared/mysql.rb', line 92

def tables(opts={})
  ds = self['SHOW TABLES'].server(opts[:server])
  ds.identifier_output_method = nil
  ds2 = dataset
  ds.map{|r| ds2.send(:output_identifier, r.values.first)}
end

#use(db_name) ⇒ Object

Changes the database in use by issuing a USE statement. I would be very careful if I used this.



101
102
103
104
105
106
# File 'lib/sequel_core/adapters/shared/mysql.rb', line 101

def use(db_name)
  disconnect
  @opts[:database] = db_name if self << "USE #{db_name}"
  @schemas = nil
  self
end