lib/sequel/adapters/shared/mysql.rb in sequel-3.34.1 vs lib/sequel/adapters/shared/mysql.rb in sequel-3.35.0
- old
+ new
@@ -221,11 +221,11 @@
end
# Use XA START to start a new prepared transaction if the :prepare
# option is given.
def begin_transaction(conn, opts={})
- if (s = opts[:prepare]) && (th = @transactions[conn])[:savepoint_level] == 0
+ if (s = opts[:prepare]) && (th = _trans(conn))[:savepoint_level] == 0
log_connection_execute(conn, "XA START #{literal(s)}")
th[:savepoint_level] += 1
else
super
end
@@ -244,11 +244,11 @@
end
# Prepare the XA transaction for a two-phase commit if the
# :prepare option is given.
def commit_transaction(conn, opts={})
- if (s = opts[:prepare]) && @transactions[conn][:savepoint_level] <= 1
+ if (s = opts[:prepare]) && _trans(conn)[:savepoint_level] <= 1
log_connection_execute(conn, "XA END #{literal(s)}")
log_connection_execute(conn, "XA PREPARE #{literal(s)}")
else
super
end
@@ -333,11 +333,11 @@
schema(table).select{|a| a[1][:primary_key]}.map{|a| a[0]}
end
# Rollback the currently open XA transaction
def rollback_transaction(conn, opts={})
- if (s = opts[:prepare]) && @transactions[conn][:savepoint_level] <= 1
+ if (s = opts[:prepare]) && _trans(conn)[:savepoint_level] <= 1
log_connection_execute(conn, "XA END #{literal(s)}")
log_connection_execute(conn, "XA PREPARE #{literal(s)}")
log_connection_execute(conn, "XA ROLLBACK #{literal(s)}")
else
super
@@ -351,11 +351,13 @@
# Use the MySQL specific DESCRIBE syntax to get a table description.
def schema_parse_table(table_name, opts)
m = output_identifier_meth(opts[:dataset])
im = input_identifier_meth(opts[:dataset])
- metadata_dataset.with_sql("DESCRIBE ?", SQL::Identifier.new(im.call(table_name))).map do |row|
+ table = SQL::Identifier.new(im.call(table_name))
+ table = SQL::QualifiedIdentifier.new(im.call(opts[:schema]), table) if opts[:schema]
+ metadata_dataset.with_sql("DESCRIBE ?", table).map do |row|
row[:auto_increment] = true if row.delete(:Extra).to_s =~ /auto_increment/io
row[:allow_null] = row.delete(:Null) == 'YES'
row[:default] = row.delete(:Default)
row[:primary_key] = row.delete(:Key) == 'PRI'
row[:default] = nil if blank_object?(row[:default])
@@ -412,10 +414,13 @@
SQL_CALC_FOUND_ROWS = ' SQL_CALC_FOUND_ROWS'.freeze
DELETE_CLAUSE_METHODS = Dataset.clause_methods(:delete, %w'delete from where order limit')
INSERT_CLAUSE_METHODS = Dataset.clause_methods(:insert, %w'insert ignore into columns values on_duplicate_key_update')
SELECT_CLAUSE_METHODS = Dataset.clause_methods(:select, %w'select distinct calc_found_rows columns from join where group having compounds order limit lock')
UPDATE_CLAUSE_METHODS = Dataset.clause_methods(:update, %w'update ignore table set where order limit')
+ APOS = Dataset::APOS
+ APOS_RE = Dataset::APOS_RE
+ DOUBLE_APOS = Dataset::DOUBLE_APOS
SPACE = Dataset::SPACE
PAREN_OPEN = Dataset::PAREN_OPEN
PAREN_CLOSE = Dataset::PAREN_CLOSE
NOT_SPACE = Dataset::NOT_SPACE
FROM = Dataset::FROM
@@ -444,10 +449,12 @@
WITH_ROLLUP = ' WITH ROLLUP'.freeze
MATCH_AGAINST = ["(MATCH ".freeze, " AGAINST (".freeze, "))".freeze].freeze
MATCH_AGAINST_BOOLEAN = ["(MATCH ".freeze, " AGAINST (".freeze, " IN BOOLEAN MODE))".freeze].freeze
EXPLAIN = 'EXPLAIN '.freeze
EXPLAIN_EXTENDED = 'EXPLAIN EXTENDED '.freeze
+ BACKSLASH_RE = /\\/.freeze
+ QUAD_BACKSLASH = "\\\\\\\\".freeze
# MySQL specific syntax for LIKE/REGEXP searches, as well as
# string concatenation.
def complex_expression_sql_append(sql, op, args)
case op
@@ -768,9 +775,14 @@
alias update_limit_sql limit_sql
# Use 0 for false on MySQL
def literal_false
BOOL_FALSE
+ end
+
+ # SQL fragment for String. Doubles \ and ' by default.
+ def literal_string_append(sql, v)
+ sql << APOS << v.gsub(BACKSLASH_RE, QUAD_BACKSLASH).gsub(APOS_RE, DOUBLE_APOS) << APOS
end
# Use 1 for true on MySQL
def literal_true
BOOL_TRUE