Class: Sequel::Mysql2::Database
- Inherits:
-
Object
- Object
- Sequel::Mysql2::Database
- Defined in:
- lib/midori-contrib/sequel/mysql2.rb
Overview
Midori Extension of sequel MySQL through meta programming
Instance Method Summary collapse
-
#_execute(conn, sql, opts) ⇒ Mysql2::Result
Execute the given SQL on the given connection.
Instance Method Details
#_execute(conn, sql, opts) ⇒ Mysql2::Result
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.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/midori-contrib/sequel/mysql2.rb', line 21 def _execute(conn, sql, opts) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity begin # :nocov: stream = opts[:stream] if NativePreparedStatements if (args = opts[:arguments]) args = args.map{|arg| bound_variable_value(arg)} end case sql when ::Mysql2::Statement stmt = sql when Dataset sql = sql.sql close_stmt = true stmt = conn.prepare(sql) end end r = log_connection_yield((log_sql = opts[:log_sql]) ? sql + log_sql : sql, conn, args) do if stmt conn..merge!(cache_rows: true, database_timezone: timezone, application_timezone: Sequel.application_timezone, stream: stream, cast_booleans: ) stmt.execute(*args) # :nocov: else if MYSQL_SOCKETS[conn.socket].nil? MYSQL_SOCKETS[conn.socket] = IO::open(conn.socket) end socket = MYSQL_SOCKETS[conn.socket] await(Promise.new do |resolve| count = 0 EventLoop.register(socket, :rw) do if (count == 0) # Writable count += 1 conn.query(sql, database_timezone: timezone, application_timezone: Sequel.application_timezone, stream: stream, async: true) else # Readable begin EventLoop.deregister(socket) resolve.call(conn.async_result) rescue ::Mysql2::Error => e resolve.call(PromiseException.new(e)) next end end end end) end end # :nocov: 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) ensure if stmt conn..replace(conn.instance_variable_get(:@sequel_default_query_options)) stmt.close if close_stmt end # :nocov: end end |