Module: Sequel::MySQL::DatabaseMethods

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
PRIMARY =
'PRIMARY'.freeze
MYSQL_TIMESTAMP_RE =
/\ACURRENT_(?:DATE|TIMESTAMP)?\z/
CAST_TYPES =

.freeze # SEQUEL5

{String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}
COLUMN_DEFINITION_ORDER =

.freeze # SEQUEL5

[:collate, :null, :default, :unique, :primary_key, :auto_increment, :references]

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#default_charsetObject



89
90
91
92
# File 'lib/sequel/adapters/shared/mysql.rb', line 89

def default_charset
  v = @default_charset
  v.nil? ? Sequel::MySQL.instance_variable_get(:@default_charset) : v
end

#default_collateObject



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

def default_collate
  v = @default_collate
  v.nil? ? Sequel::MySQL.instance_variable_get(:@default_collate) : v
end

#default_engineObject



99
100
101
102
# File 'lib/sequel/adapters/shared/mysql.rb', line 99

def default_engine
  v = @default_engine
  v.nil? ? Sequel::MySQL.instance_variable_get(:@default_engine) : v
end

Instance Method Details

#cast_type_literal(type) ⇒ Object

MySQL’s cast rules are restrictive in that you can’t just cast to any possible database type.



106
107
108
# File 'lib/sequel/adapters/shared/mysql.rb', line 106

def cast_type_literal(type)
  CAST_TYPES[type] || super
end

#commit_prepared_transaction(transaction_id, opts = OPTS) ⇒ Object

Commit an existing prepared transaction with the given transaction identifier string.



112
113
114
# File 'lib/sequel/adapters/shared/mysql.rb', line 112

def commit_prepared_transaction(transaction_id, opts=OPTS)
  run("XA COMMIT #{literal(transaction_id)}", opts)
end

#database_typeObject

MySQL uses the :mysql database type



117
118
119
# File 'lib/sequel/adapters/shared/mysql.rb', line 117

def database_type
  :mysql
end

#foreign_key_list(table, opts = OPTS) ⇒ Object

Use the Information Schema’s KEY_COLUMN_USAGE table to get basic information on foreign key columns, but include the constraint name.



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/sequel/adapters/shared/mysql.rb', line 124

def foreign_key_list(table, opts=OPTS)
  m = output_identifier_meth
  im = input_identifier_meth
  ds = .
    from(Sequel[:INFORMATION_SCHEMA][:KEY_COLUMN_USAGE]).
    where(:TABLE_NAME=>im.call(table), :TABLE_SCHEMA=>Sequel.function(:DATABASE)).
    exclude(:CONSTRAINT_NAME=>'PRIMARY').
    exclude(:REFERENCED_TABLE_NAME=>nil).
    select(Sequel[:CONSTRAINT_NAME].as(:name), Sequel[:COLUMN_NAME].as(:column), Sequel[:REFERENCED_TABLE_NAME].as(:table), Sequel[:REFERENCED_COLUMN_NAME].as(:key))
  
  h = {}
  ds.each do |row|
    if r = h[row[:name]]
      r[:columns] << m.call(row[:column])
      r[:key] << m.call(row[:key])
    else
      h[row[:name]] = {:name=>m.call(row[:name]), :columns=>[m.call(row[:column])], :table=>m.call(row[:table]), :key=>[m.call(row[:key])]}
    end
  end
  h.values
end

#freezeObject



146
147
148
149
150
# File 'lib/sequel/adapters/shared/mysql.rb', line 146

def freeze
  server_version
  supports_timestamp_usecs?
  super
end

#global_index_namespace?Boolean

MySQL namespaces indexes per table.

Returns:

  • (Boolean)


153
154
155
# File 'lib/sequel/adapters/shared/mysql.rb', line 153

def global_index_namespace?
  false
end

#indexes(table, opts = OPTS) ⇒ Object

Use SHOW INDEX FROM to get the index information for the table.

By default partial indexes are not included, you can use the option :partial to override this.



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/sequel/adapters/shared/mysql.rb', line 162

def indexes(table, opts=OPTS)
  indexes = {}
  remove_indexes = []
  m = output_identifier_meth
  im = input_identifier_meth
  schema, table = schema_and_table(table)

  table = Sequel::SQL::Identifier.new(table)
  sql = "SHOW INDEX FROM #{literal(table)}"
  if schema
    schema = Sequel::SQL::Identifier.new(schema)
    sql += " FROM #{literal(schema)}"
  end

  .with_sql(sql).each do |r|
    name = r[:Key_name]
    next if name == 'PRIMARY'
    name = m.call(name)
    remove_indexes << name if r[:Sub_part] && ! opts[:partial]
    i = indexes[name] ||= {:columns=>[], :unique=>r[:Non_unique] != 1}
    i[:columns] << m.call(r[:Column_name])
  end
  indexes.reject{|k,v| remove_indexes.include?(k)}
end

#rollback_prepared_transaction(transaction_id, opts = OPTS) ⇒ Object

Rollback an existing prepared transaction with the given transaction identifier string.



189
190
191
# File 'lib/sequel/adapters/shared/mysql.rb', line 189

def rollback_prepared_transaction(transaction_id, opts=OPTS)
  run("XA ROLLBACK #{literal(transaction_id)}", opts)
end

#server_versionObject

Get version of MySQL server, used for determined capabilities.



194
195
196
197
198
199
# File 'lib/sequel/adapters/shared/mysql.rb', line 194

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

#supports_create_table_if_not_exists?Boolean

MySQL supports CREATE TABLE IF NOT EXISTS syntax.

Returns:

  • (Boolean)


202
203
204
# File 'lib/sequel/adapters/shared/mysql.rb', line 202

def supports_create_table_if_not_exists?
  true
end

#supports_prepared_transactions?Boolean

MySQL 5+ supports prepared transactions (two-phase commit) using XA

Returns:

  • (Boolean)


207
208
209
# File 'lib/sequel/adapters/shared/mysql.rb', line 207

def supports_prepared_transactions?
  server_version >= 50000
end

#supports_savepoints?Boolean

MySQL 5+ supports savepoints

Returns:

  • (Boolean)


212
213
214
# File 'lib/sequel/adapters/shared/mysql.rb', line 212

def supports_savepoints?
  server_version >= 50000
end

#supports_savepoints_in_prepared_transactions?Boolean

MySQL doesn’t support savepoints inside prepared transactions in from 5.5.12 to 5.5.23, see bugs.mysql.com/bug.php?id=64374

Returns:

  • (Boolean)


218
219
220
# File 'lib/sequel/adapters/shared/mysql.rb', line 218

def supports_savepoints_in_prepared_transactions?
  super && (server_version <= 50512 || server_version >= 50523)
end

#supports_timestamp_usecs?Boolean

Support fractional timestamps on MySQL 5.6.5+ if the :fractional_seconds Database option is used. Technically, MySQL 5.6.4+ supports them, but automatic initialization of datetime values wasn’t supported to 5.6.5+, and this is related to that.

Returns:

  • (Boolean)


226
227
228
229
# File 'lib/sequel/adapters/shared/mysql.rb', line 226

def supports_timestamp_usecs?
  return @supports_timestamp_usecs if defined?(@supports_timestamp_usecs)
  @supports_timestamp_usecs = server_version >= 50605 && typecast_value_boolean(opts[:fractional_seconds])
end

#supports_transaction_isolation_levels?Boolean

MySQL supports transaction isolation levels

Returns:

  • (Boolean)


232
233
234
# File 'lib/sequel/adapters/shared/mysql.rb', line 232

def supports_transaction_isolation_levels?
  true
end

#tables(opts = OPTS) ⇒ Object

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

Options:

:server

Set the server to use



240
241
242
# File 'lib/sequel/adapters/shared/mysql.rb', line 240

def tables(opts=OPTS)
  full_tables('BASE TABLE', opts)
end

#use(db_name) ⇒ Object

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



246
247
248
249
250
251
252
# File 'lib/sequel/adapters/shared/mysql.rb', line 246

def use(db_name)
  Sequel::Deprecation.deprecate("Database#use", "Create a new Sequel::Database instance instead of using Database#use")
  disconnect
  @opts[:database] = db_name if self << "USE #{db_name}"
  @schemas = {}
  self
end

#views(opts = OPTS) ⇒ Object

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

Options:

:server

Set the server to use



258
259
260
# File 'lib/sequel/adapters/shared/mysql.rb', line 258

def views(opts=OPTS)
  full_tables('VIEW', opts)
end