class Sequel::Mysql2::Database
Constants
- DatasetClass
Attributes
Whether to convert tinyint columns to bool for this database
Public Instance Methods
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 29 def connect(server) opts = server_opts(server) opts[:host] ||= 'localhost' opts[:username] ||= opts.delete(:user) opts[:flags] ||= 0 opts[:flags] |= ::Mysql2::Client::FOUND_ROWS if ::Mysql2::Client.const_defined?(:FOUND_ROWS) opts[:encoding] ||= opts[:charset] 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] 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 56 def execute_dui(sql, opts=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 61 def execute_insert(sql, opts=OPTS) execute(sql, opts){|c| return c.last_id} end
Return the version of the MySQL server to which we are connecting.
# File lib/sequel/adapters/mysql2.rb, line 66 def server_version(server=nil) @server_version ||= (synchronize(server){|conn| conn.server_info[:id]} || super) end
Private Instance Methods
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 75 def _execute(conn, sql, opts) begin stream = opts[:stream] r = log_yield((log_sql = opts[:log_sql]) ? sql + log_sql : sql){conn.query(sql, :database_timezone => timezone, :application_timezone => Sequel.application_timezone, :stream=>stream)} if opts[:type] == :select if r if stream begin r2 = yield r ensure # If r2 is nil, it means the block did not exit normally, # so the rest of the results must be drained to prevent # "commands out of sync" errors. r.each{} unless r2 end else yield r end end elsif block_given? yield conn end rescue ::Mysql2::Error => e raise_error(e) end end
Set the #convert_tinyint_to_bool setting based on the default value.
# File lib/sequel/adapters/mysql2.rb, line 103 def adapter_initialize self.convert_tinyint_to_bool = Sequel::MySQL.convert_tinyint_to_bool end
The MySQL adapter main error class is Mysql2::Error
# File lib/sequel/adapters/mysql2.rb, line 113 def database_error_classes [::Mysql2::Error] end
# File lib/sequel/adapters/mysql2.rb, line 117 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 134 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 124 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 139 def schema_column_type(db_type) convert_tinyint_to_bool && db_type =~ /\Atinyint\(1\)/ ? :boolean : super end