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