Whether to convert tinyint columns to bool for this database
Set the #convert_tinyint_to_bool setting based on the default value.
# File lib/sequel/adapters/mysql2.rb, line 18 def initialize(opts={}) super self.convert_tinyint_to_bool = Sequel::MySQL.convert_tinyint_to_bool end
Connect to the database. In addition to the usual database options, the following options have effect:
:auto_is_null - Set to true to use MySQL default behavior of having a filter for an autoincrement column equals NULL to return the last inserted row.
:charset - Same as :encoding (:encoding takes precendence)
:encoding - Set all the related character sets for this connection (connection, client, database, server, and results).
The options hash is also passed to mysql2, and can include mysql2 options such as :local_infile.
# File lib/sequel/adapters/mysql2.rb, line 35 def connect(server) opts = server_opts(server) opts[:host] ||= 'localhost' opts[:username] ||= opts.delete(:user) opts[:flags] = ::Mysql2::Client::FOUND_ROWS if ::Mysql2::Client.const_defined?(:FOUND_ROWS) conn = ::Mysql2::Client.new(opts) conn.query_options.merge!(:symbolize_keys=>true, :cache_rows=>false) sqls = mysql_connection_setting_sqls # Set encoding a slightly different way after connecting, # in case the READ_DEFAULT_GROUP overrode the provided encoding. # Doesn't work across implicit reconnects, but Sequel doesn't turn on # that feature. if encoding = opts[:encoding] || opts[:charset] sqls.unshift("SET NAMES #{conn.escape(encoding.to_s)}") end sqls.each{|sql| log_yield(sql){conn.query(sql)}} add_prepared_statements_cache(conn) conn end
Return the number of matched rows when executing a delete/update statement.
# File lib/sequel/adapters/mysql2.rb, line 60 def execute_dui(sql, opts={}) execute(sql, opts){|c| return c.affected_rows} end
Return the last inserted id when executing an insert statement.
# File lib/sequel/adapters/mysql2.rb, line 65 def execute_insert(sql, opts={}) execute(sql, opts){|c| return c.last_id} end
Return the version of the MySQL server two which we are connecting.
# File lib/sequel/adapters/mysql2.rb, line 70 def server_version(server=nil) @server_version ||= (synchronize(server){|conn| conn.server_info[:id]} || super) end
Execute the given SQL on the given connection. If the :type option is :select, yield the result of the query, otherwise yield the connection if a block is given.
# File lib/sequel/adapters/mysql2.rb, line 79 def _execute(conn, sql, opts) begin r = log_yield((log_sql = opts[:log_sql]) ? sql + log_sql : sql){conn.query(sql, :database_timezone => timezone, :application_timezone => Sequel.application_timezone)} if opts[:type] == :select yield r if r elsif block_given? yield conn end rescue ::Mysql2::Error => e raise_error(e) end end
The MySQL adapter main error class is Mysql2::Error
# File lib/sequel/adapters/mysql2.rb, line 98 def database_error_classes [::Mysql2::Error] end
# File lib/sequel/adapters/mysql2.rb, line 102 def database_exception_sqlstate(exception, opts) exception.sql_state end
The database name when using the native adapter is always stored in the :database option.
# File lib/sequel/adapters/mysql2.rb, line 119 def database_name @opts[:database] end
If a connection object is available, try pinging it. Otherwise, if the error is a Mysql2::Error, check the SQL state and exception message for disconnects.
# File lib/sequel/adapters/mysql2.rb, line 109 def disconnect_error?(e, opts) super || ((conn = opts[:conn]) && !conn.ping) || (e.is_a?(::Mysql2::Error) && (e.sql_state =~ /\A08/ || MYSQL_DATABASE_DISCONNECT_ERRORS.match(e.message))) end
Convert tinyint(1) type to boolean if #convert_tinyint_to_bool is true
# File lib/sequel/adapters/mysql2.rb, line 124 def schema_column_type(db_type) convert_tinyint_to_bool && db_type =~ /\Atinyint\(1\)/ ? :boolean : super end