Skip to content

Commit

Permalink
Fixed Mysql2::Client#query return value to be uniquely determined (#564)
Browse files Browse the repository at this point in the history
The return value of `Mysql2::Client#query` is determined by the combination of
the `as` argument of the `self.new` method and the `query` method.
Fixed it so that it can be expressed using Generics.
  • Loading branch information
euglena1215 authored May 26, 2024
1 parent b9c1383 commit f6ddbae
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 25 deletions.
46 changes: 46 additions & 0 deletions gems/mysql2/0.5/_test/query.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
require "mysql2"

as = :array
Mysql2::Client.new(as: as).query("SELECT * FROM users").each do |row|
if row.is_a?(Array)
row[0] # Array
elsif row.is_a?(Hash)
row[:id] # Hash
end
end

Mysql2::Client.new.query("SELECT * FROM users").each do |row|
row[:id] # Hash
end

Mysql2::Client.new.query("SELECT * FROM users", as: :hash).each do |row|
row[:id] # Hash
end

Mysql2::Client.new.query("SELECT * FROM users", as: :array).each do |row|
row[0] # Array
end

Mysql2::Client.new(as: :hash).query("SELECT * FROM users").each do |row|
row[:id] # Hash
end

Mysql2::Client.new(as: :hash).query("SELECT * FROM users", as: :hash).each do |row|
row[:id] # Hash
end

Mysql2::Client.new(as: :hash).query("SELECT * FROM users", as: :array).each do |row|
row[0] # Array
end

Mysql2::Client.new(as: :array).query("SELECT * FROM users").each do |row|
row[0] # Array
end

Mysql2::Client.new(as: :array).query("SELECT * FROM users", as: :hash).each do |row|
row[:id] # Hash
end

Mysql2::Client.new(as: :array).query("SELECT * FROM users", as: :array).each do |row|
row[0] # Array
end
22 changes: 0 additions & 22 deletions gems/mysql2/0.5/_test/test.rb

This file was deleted.

11 changes: 9 additions & 2 deletions gems/mysql2/0.5/client.rbs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module Mysql2
class Client
class Client[ResultType]
self.@default_query_options: untyped

@read_timeout: untyped
Expand All @@ -14,6 +14,11 @@ module Mysql2

def initialize: (Hash[(String | Symbol), untyped] opts) -> void

def self.new: (as: :hash, **untyped) -> Mysql2::Client[Mysql2::ResultAsHash]
| (as: :array, **untyped) -> Mysql2::Client[Mysql2::ResultAsArray]
| (as: Symbol, **untyped) -> Mysql2::Client[Mysql2::ResultAsHash | Mysql2::ResultAsArray]
| (**untyped) -> Mysql2::Client[Mysql2::ResultAsHash]

def parse_ssl_mode: (untyped mode) -> untyped

def parse_flags_array: (untyped flags, ?::Integer initial) -> untyped
Expand All @@ -27,7 +32,9 @@ module Mysql2
# and performance_schema.session_account_connect_attrs
def parse_connect_attrs: (untyped conn_attrs) -> (::Hash[untyped, untyped] | untyped)

def query: (String sql, ?::Hash[untyped, untyped] options) -> Mysql2::result
def query: (String sql, as: :hash, **untyped) -> ResultAsHash
| (String sql, as: :array, **untyped) -> ResultAsArray
| (String sql, **untyped) -> ResultType

def query_info: () -> (::Hash[untyped, untyped] | untyped)

Expand Down
1 change: 0 additions & 1 deletion gems/mysql2/0.5/result.rbs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
module Mysql2
type row_value_type = String | Integer | nil
type result = ResultAsHash | ResultAsArray

class ResultAsHash
attr_reader server_flags: untyped
Expand Down

0 comments on commit f6ddbae

Please sign in to comment.