Class: Sequel::MySQL::Database

Inherits:
Database show all
Includes:
DatabaseMethods
Defined in:
lib/sequel_core/adapters/mysql.rb

Overview

Database class for MySQL databases used with Sequel.

Constant Summary

Constants included from DatabaseMethods

Sequel::MySQL::DatabaseMethods::AUTO_INCREMENT, Sequel::MySQL::DatabaseMethods::NOT_NULL, Sequel::MySQL::DatabaseMethods::NULL, Sequel::MySQL::DatabaseMethods::PRIMARY_KEY, Sequel::MySQL::DatabaseMethods::TYPES, Sequel::MySQL::DatabaseMethods::UNIQUE, Sequel::MySQL::DatabaseMethods::UNSIGNED

Constants inherited from Database

Database::ADAPTERS, Database::SQL_BEGIN, Database::SQL_COMMIT, Database::SQL_ROLLBACK

Constants included from Schema::SQL

Schema::SQL::AUTOINCREMENT, Schema::SQL::CASCADE, Schema::SQL::COMMA_SEPARATOR, Schema::SQL::NOT_NULL, Schema::SQL::NO_ACTION, Schema::SQL::NULL, Schema::SQL::PRIMARY_KEY, Schema::SQL::RESTRICT, Schema::SQL::SET_DEFAULT, Schema::SQL::SET_NULL, Schema::SQL::TYPES, Schema::SQL::UNDERSCORE, Schema::SQL::UNIQUE, Schema::SQL::UNSIGNED

Instance Attribute Summary

Attributes inherited from Database

#default_schema, #loggers, #opts, #pool, #prepared_statements, #quote_identifiers, #upcase_identifiers

Instance Method Summary collapse

Methods included from DatabaseMethods

#alter_table_sql, #auto_increment_sql, #column_references_sql, #index_definition_sql, #tables, #use

Methods inherited from Database

#<<, #[], adapter_class, adapter_scheme, #add_column, #add_index, #alter_table, #call, connect, #create_or_replace_view, #create_table, #create_table!, #create_view, #disconnect, #drop_column, #drop_index, #drop_table, #drop_view, #execute_ddl, #execute_dui, #fetch, #from, #get, #initialize, #inspect, #log_info, #logger, #logger=, #multi_threaded?, #query, quote_identifiers=, #quote_identifiers?, #rename_column, #rename_table, #select, #serial_primary_key_options, #set_column_default, #set_column_type, single_threaded=, #single_threaded?, #synchronize, #table_exists?, #test_connection, #typecast_value, upcase_identifiers=, #upcase_identifiers?, #uri

Methods included from Schema::SQL

#alter_table_sql, #alter_table_sql_list, #auto_increment_sql, #column_definition_sql, #column_list_sql, #column_references_sql, #constraint_definition_sql, #create_table_sql_list, #default_index_name, #drop_index_sql, #drop_table_sql, #filter_expr, #index_definition_sql, #index_list_sql_list, #literal, #on_delete_clause, #quote_identifier, #quote_schema_table, #rename_table_sql, #schema, #schema_utility_dataset

Constructor Details

This class inherits a constructor from Sequel::Database

Instance Method Details

#call_sproc(name, opts = {}, &block) ⇒ Object

Support stored procedures on MySQL



90
91
92
93
# File 'lib/sequel_core/adapters/mysql.rb', line 90

def call_sproc(name, opts={}, &block)
  args = opts[:args] || [] 
  execute("CALL #{name}(#{literal(args) unless args.empty?})", opts.merge(:sproc=>false), &block)
end

#connect(server) ⇒ Object

Connect to the database. In addition to the usual database options, the following options have effect:

  • :encoding, :charset - Set all the related character sets for this connection (connection, client, database, server, and results).

  • :socket - Use a unix socket file instead of connecting via TCP/IP.



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/sequel_core/adapters/mysql.rb', line 101

def connect(server)
  opts = server_opts(server)
  conn = Mysql.init
  conn.options(Mysql::OPT_LOCAL_INFILE, "client")
  conn.real_connect(
    opts[:host] || 'localhost',
    opts[:user],
    opts[:password],
    opts[:database],
    opts[:port],
    opts[:socket],
    Mysql::CLIENT_MULTI_RESULTS +
    Mysql::CLIENT_MULTI_STATEMENTS +
    Mysql::CLIENT_COMPRESS
  )
  conn.query_with_result = false
  if encoding = opts[:encoding] || opts[:charset]
    conn.query("set character_set_connection = '#{encoding}'")
    conn.query("set character_set_client = '#{encoding}'")
    conn.query("set character_set_database = '#{encoding}'")
    conn.query("set character_set_server = '#{encoding}'")
    conn.query("set character_set_results = '#{encoding}'")
  end
  conn.meta_eval{attr_accessor :prepared_statements}
  conn.prepared_statements = {}
  conn.reconnect = true
  conn
end

#dataset(opts = nil) ⇒ Object

Returns instance of Sequel::MySQL::Dataset with the given options.



131
132
133
# File 'lib/sequel_core/adapters/mysql.rb', line 131

def dataset(opts = nil)
  MySQL::Dataset.new(self, opts)
end

#execute(sql, opts = {}, &block) ⇒ Object

Executes the given SQL using an available connection, yielding the connection if the block is given.



137
138
139
140
141
142
143
144
145
# File 'lib/sequel_core/adapters/mysql.rb', line 137

def execute(sql, opts={}, &block)
  return call_sproc(sql, opts, &block) if opts[:sproc]
  return execute_prepared_statement(sql, opts, &block) if Symbol === sql
  begin
    synchronize(opts[:server]){|conn| _execute(conn, sql, opts, &block)}
  rescue Mysql::Error => e
    raise_error(e)
  end
end

#server_version(server = nil) ⇒ Object

Return the version of the MySQL server two which we are connecting.



148
149
150
# File 'lib/sequel_core/adapters/mysql.rb', line 148

def server_version(server=nil)
  @server_version ||= (synchronize(server){|conn| conn.server_version if conn.respond_to?(:server_version)} || super)
end

#transaction(server = nil) ⇒ Object

Support single level transactions on MySQL.



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/sequel_core/adapters/mysql.rb', line 153

def transaction(server=nil)
  synchronize(server) do |conn|
    return yield(conn) if @transactions.include?(Thread.current)
    log_info(begin_transaction_sql)
    conn.query(begin_transaction_sql)
    begin
      @transactions << Thread.current
      yield(conn)
    rescue ::Exception => e
      log_info(rollback_transaction_sql)
      conn.query(rollback_transaction_sql)
      transaction_error(e, Mysql::Error)
    ensure
      unless e
        log_info(commit_transaction_sql)
        conn.query(commit_transaction_sql)
      end
      @transactions.delete(Thread.current)
    end
  end
end