mysql2 0.2.24 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1 -0
- data/LICENSE +21 -0
- data/README.md +237 -85
- data/ext/mysql2/client.c +582 -249
- data/ext/mysql2/client.h +10 -38
- data/ext/mysql2/extconf.rb +217 -66
- data/ext/mysql2/infile.c +2 -2
- data/ext/mysql2/mysql2_ext.c +9 -2
- data/ext/mysql2/mysql2_ext.h +13 -14
- data/ext/mysql2/mysql_enc_name_to_ruby.h +62 -58
- data/ext/mysql2/mysql_enc_to_ruby.h +82 -18
- data/ext/mysql2/result.c +736 -200
- data/ext/mysql2/result.h +13 -6
- data/ext/mysql2/statement.c +612 -0
- data/ext/mysql2/statement.h +17 -0
- data/ext/mysql2/wait_for_single_fd.h +2 -1
- data/lib/mysql2/client.rb +110 -28
- data/lib/mysql2/console.rb +1 -1
- data/lib/mysql2/em.rb +15 -9
- data/lib/mysql2/error.rb +57 -36
- data/lib/mysql2/field.rb +3 -0
- data/lib/mysql2/result.rb +2 -0
- data/lib/mysql2/statement.rb +9 -0
- data/lib/mysql2/version.rb +1 -1
- data/lib/mysql2.rb +66 -15
- data/support/3A79BD29.asc +49 -0
- data/support/5072E1F5.asc +432 -0
- data/support/libmysql.def +219 -0
- data/support/mysql_enc_to_ruby.rb +15 -11
- data/support/ruby_enc_to_mysql.rb +8 -6
- metadata +30 -94
- data/MIT-LICENSE +0 -20
- data/examples/eventmachine.rb +0 -21
- data/examples/threaded.rb +0 -20
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +0 -635
- data/lib/arel/engines/sql/compilers/mysql2_compiler.rb +0 -11
- data/spec/configuration.yml.example +0 -17
- data/spec/em/em_spec.rb +0 -114
- data/spec/my.cnf.example +0 -9
- data/spec/mysql2/client_spec.rb +0 -897
- data/spec/mysql2/error_spec.rb +0 -83
- data/spec/mysql2/result_spec.rb +0 -505
- data/spec/rcov.opts +0 -3
- data/spec/spec_helper.rb +0 -87
- data/spec/test_data +0 -1
data/ext/mysql2/client.h
CHANGED
@@ -1,41 +1,6 @@
|
|
1
1
|
#ifndef MYSQL2_CLIENT_H
|
2
2
|
#define MYSQL2_CLIENT_H
|
3
3
|
|
4
|
-
#ifndef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
5
|
-
#ifdef HAVE_RB_THREAD_BLOCKING_REGION
|
6
|
-
|
7
|
-
/* emulate rb_thread_call_without_gvl with rb_thread_blocking_region */
|
8
|
-
#define rb_thread_call_without_gvl(func, data1, ubf, data2) \
|
9
|
-
rb_thread_blocking_region((rb_blocking_function_t *)func, data1, ubf, data2)
|
10
|
-
|
11
|
-
#else /* ! HAVE_RB_THREAD_BLOCKING_REGION */
|
12
|
-
/*
|
13
|
-
* partial emulation of the 2.0 rb_thread_call_without_gvl under 1.8,
|
14
|
-
* this is enough for dealing with blocking I/O functions in the
|
15
|
-
* presence of threads.
|
16
|
-
*/
|
17
|
-
|
18
|
-
#include <rubysig.h>
|
19
|
-
#define RUBY_UBF_IO ((rb_unblock_function_t *)-1)
|
20
|
-
typedef void rb_unblock_function_t(void *);
|
21
|
-
static void *
|
22
|
-
rb_thread_call_without_gvl(
|
23
|
-
void *(*func)(void *), void *data1,
|
24
|
-
RB_MYSQL_UNUSED rb_unblock_function_t *ubf,
|
25
|
-
RB_MYSQL_UNUSED void *data2)
|
26
|
-
{
|
27
|
-
void *rv;
|
28
|
-
|
29
|
-
TRAP_BEG;
|
30
|
-
rv = func(data1);
|
31
|
-
TRAP_END;
|
32
|
-
|
33
|
-
return rv;
|
34
|
-
}
|
35
|
-
|
36
|
-
#endif /* ! HAVE_RB_THREAD_BLOCKING_REGION */
|
37
|
-
#endif /* ! HAVE_RB_THREAD_CALL_WITHOUT_GVL */
|
38
|
-
|
39
4
|
typedef struct {
|
40
5
|
VALUE encoding;
|
41
6
|
VALUE active_thread; /* rb_thread_current() or Qnil */
|
@@ -43,14 +8,21 @@ typedef struct {
|
|
43
8
|
int reconnect_enabled;
|
44
9
|
unsigned int connect_timeout;
|
45
10
|
int active;
|
46
|
-
int
|
11
|
+
int automatic_close;
|
47
12
|
int initialized;
|
48
13
|
int refcount;
|
49
|
-
int
|
14
|
+
int closed;
|
50
15
|
MYSQL *client;
|
51
16
|
} mysql_client_wrapper;
|
52
17
|
|
53
|
-
void
|
18
|
+
void rb_mysql_client_set_active_thread(VALUE self);
|
19
|
+
void rb_mysql_set_server_query_flags(MYSQL *client, VALUE result);
|
20
|
+
|
21
|
+
#define GET_CLIENT(self) \
|
22
|
+
mysql_client_wrapper *wrapper; \
|
23
|
+
Data_Get_Struct(self, mysql_client_wrapper, wrapper);
|
24
|
+
|
25
|
+
void init_mysql2_client(void);
|
54
26
|
void decr_mysql2_client(mysql_client_wrapper *wrapper);
|
55
27
|
|
56
28
|
#endif
|
data/ext/mysql2/extconf.rb
CHANGED
@@ -1,81 +1,108 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
require 'mkmf'
|
2
|
+
require 'English'
|
3
3
|
|
4
|
-
def asplode
|
5
|
-
|
4
|
+
def asplode(lib)
|
5
|
+
if RUBY_PLATFORM =~ /mingw|mswin/
|
6
|
+
abort "-----\n#{lib} is missing. Check your installation of MySQL or Connector/C, and try again.\n-----"
|
7
|
+
elsif RUBY_PLATFORM =~ /darwin/
|
8
|
+
abort "-----\n#{lib} is missing. You may need to 'brew install mysql' or 'port install mysql', and try again.\n-----"
|
9
|
+
else
|
10
|
+
abort "-----\n#{lib} is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again.\n-----"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_ssl_defines(header)
|
15
|
+
all_modes_found = %w[SSL_MODE_DISABLED SSL_MODE_PREFERRED SSL_MODE_REQUIRED SSL_MODE_VERIFY_CA SSL_MODE_VERIFY_IDENTITY].inject(true) do |m, ssl_mode|
|
16
|
+
m && have_const(ssl_mode, header)
|
17
|
+
end
|
18
|
+
if all_modes_found
|
19
|
+
$CFLAGS << ' -DFULL_SSL_MODE_SUPPORT'
|
20
|
+
else
|
21
|
+
# if we only have ssl toggle (--ssl,--disable-ssl) from 5.7.3 to 5.7.10
|
22
|
+
# and the verify server cert option. This is also the case for MariaDB.
|
23
|
+
has_verify_support = have_const('MYSQL_OPT_SSL_VERIFY_SERVER_CERT', header)
|
24
|
+
has_enforce_support = have_const('MYSQL_OPT_SSL_ENFORCE', header)
|
25
|
+
$CFLAGS << ' -DNO_SSL_MODE_SUPPORT' if !has_verify_support && !has_enforce_support
|
26
|
+
end
|
6
27
|
end
|
7
28
|
|
8
|
-
#
|
9
|
-
|
29
|
+
# Homebrew openssl
|
30
|
+
if RUBY_PLATFORM =~ /darwin/ && system("command -v brew")
|
31
|
+
openssl_location = `brew --prefix openssl`.strip
|
32
|
+
$LDFLAGS << " -L#{openssl_location}/lib" if openssl_location
|
33
|
+
end
|
10
34
|
|
11
|
-
# 1
|
12
|
-
have_func('
|
35
|
+
# 2.1+
|
36
|
+
have_func('rb_absint_size')
|
37
|
+
have_func('rb_absint_singlebit_p')
|
38
|
+
|
39
|
+
# Missing in RBX (https://github.com/rubinius/rubinius/issues/3771)
|
13
40
|
have_func('rb_wait_for_single_fd')
|
14
|
-
|
15
|
-
have_func(
|
41
|
+
|
42
|
+
have_func("rb_enc_interned_str", "ruby.h")
|
16
43
|
|
17
44
|
# borrowed from mysqlplus
|
18
45
|
# http://github.com/oldmoe/mysqlplus/blob/master/ext/extconf.rb
|
19
|
-
dirs = ENV
|
46
|
+
dirs = ENV.fetch('PATH').split(File::PATH_SEPARATOR) + %w[
|
20
47
|
/opt
|
21
48
|
/opt/local
|
22
49
|
/opt/local/mysql
|
23
|
-
/opt/local/lib/mysql5
|
50
|
+
/opt/local/lib/mysql5*
|
24
51
|
/usr
|
25
52
|
/usr/mysql
|
26
53
|
/usr/local
|
27
54
|
/usr/local/mysql
|
28
55
|
/usr/local/mysql-*
|
29
|
-
/usr/local/lib/mysql5
|
30
|
-
|
56
|
+
/usr/local/lib/mysql5*
|
57
|
+
/usr/local/opt/mysql5*
|
58
|
+
/usr/local/opt/mysql@*
|
59
|
+
/usr/local/opt/mysql-client
|
60
|
+
/usr/local/opt/mysql-client@*
|
61
|
+
].map { |dir| dir << '/bin' }
|
62
|
+
|
63
|
+
# For those without HOMEBREW_ROOT in PATH
|
64
|
+
dirs << "#{ENV['HOMEBREW_ROOT']}/bin" if ENV['HOMEBREW_ROOT']
|
31
65
|
|
32
|
-
GLOB = "{#{dirs.join(',')}}/{mysql_config,mysql_config5}"
|
66
|
+
GLOB = "{#{dirs.join(',')}}/{mysql_config,mysql_config5,mariadb_config}".freeze
|
33
67
|
|
34
68
|
# If the user has provided a --with-mysql-dir argument, we must respect it or fail.
|
35
69
|
inc, lib = dir_config('mysql')
|
36
70
|
if inc && lib
|
37
|
-
# Ruby versions
|
71
|
+
# Ruby versions below 2.0 on Unix and below 2.1 on Windows
|
72
|
+
# do not properly search for lib directories, and must be corrected:
|
38
73
|
# https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/39717
|
39
|
-
# do not properly search for lib directories, and must be corrected
|
40
74
|
unless lib && lib[-3, 3] == 'lib'
|
41
75
|
@libdir_basename = 'lib'
|
42
76
|
inc, lib = dir_config('mysql')
|
43
77
|
end
|
44
|
-
abort "-----\nCannot find include dir(s) #{inc}\n-----" unless inc && inc.split(File::PATH_SEPARATOR).any?{|dir| File.directory?(dir)}
|
45
|
-
abort "-----\nCannot find library dir(s) #{lib}\n-----" unless lib && lib.split(File::PATH_SEPARATOR).any?{|dir| File.directory?(dir)}
|
46
|
-
warn
|
78
|
+
abort "-----\nCannot find include dir(s) #{inc}\n-----" unless inc && inc.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) }
|
79
|
+
abort "-----\nCannot find library dir(s) #{lib}\n-----" unless lib && lib.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) }
|
80
|
+
warn "-----\nUsing --with-mysql-dir=#{File.dirname inc}\n-----"
|
47
81
|
rpath_dir = lib
|
48
|
-
|
82
|
+
have_library('mysqlclient')
|
83
|
+
elsif (mc = (with_config('mysql-config') || Dir[GLOB].first))
|
49
84
|
# If the user has provided a --with-mysql-config argument, we must respect it or fail.
|
50
85
|
# If the user gave --with-mysql-config with no argument means we should try to find it.
|
51
86
|
mc = Dir[GLOB].first if mc == true
|
52
|
-
abort "-----\nCannot find mysql_config at #{mc}\n-----" unless mc && File.
|
87
|
+
abort "-----\nCannot find mysql_config at #{mc}\n-----" unless mc && File.exist?(mc)
|
53
88
|
abort "-----\nCannot execute mysql_config at #{mc}\n-----" unless File.executable?(mc)
|
54
|
-
warn
|
89
|
+
warn "-----\nUsing mysql_config at #{mc}\n-----"
|
55
90
|
ver = `#{mc} --version`.chomp.to_f
|
56
91
|
includes = `#{mc} --include`.chomp
|
57
|
-
|
92
|
+
abort unless $CHILD_STATUS.success?
|
58
93
|
libs = `#{mc} --libs_r`.chomp
|
59
94
|
# MySQL 5.5 and above already have re-entrant code in libmysqlclient (no _r).
|
60
|
-
if ver >= 5.5 || libs.empty?
|
61
|
-
|
62
|
-
end
|
63
|
-
exit 1 if $? != 0
|
95
|
+
libs = `#{mc} --libs`.chomp if ver >= 5.5 || libs.empty?
|
96
|
+
abort unless $CHILD_STATUS.success?
|
64
97
|
$INCFLAGS += ' ' + includes
|
65
98
|
$libs = libs + " " + $libs
|
66
99
|
rpath_dir = libs
|
67
100
|
else
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
exit 1 if libs.empty?
|
72
|
-
have_library(libs.shift)
|
73
|
-
end
|
74
|
-
rpath_dir = lib
|
75
|
-
end
|
101
|
+
_, usr_local_lib = dir_config('mysql', '/usr/local')
|
102
|
+
|
103
|
+
asplode("mysql client") unless find_library('mysqlclient', nil, usr_local_lib, "#{usr_local_lib}/mysql")
|
76
104
|
|
77
|
-
|
78
|
-
exit 1 unless have_library('libmysql')
|
105
|
+
rpath_dir = usr_local_lib
|
79
106
|
end
|
80
107
|
|
81
108
|
if have_header('mysql.h')
|
@@ -86,43 +113,167 @@ else
|
|
86
113
|
asplode 'mysql.h'
|
87
114
|
end
|
88
115
|
|
89
|
-
%w
|
90
|
-
header = [prefix, h].compact.join
|
91
|
-
asplode h unless have_header
|
116
|
+
%w[errmsg.h].each do |h|
|
117
|
+
header = [prefix, h].compact.join('/')
|
118
|
+
asplode h unless have_header header
|
92
119
|
end
|
93
120
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
121
|
+
mysql_h = [prefix, 'mysql.h'].compact.join('/')
|
122
|
+
add_ssl_defines(mysql_h)
|
123
|
+
have_struct_member('MYSQL', 'net.vio', mysql_h)
|
124
|
+
have_struct_member('MYSQL', 'net.pvio', mysql_h)
|
125
|
+
|
126
|
+
# These constants are actually enums, so they cannot be detected by #ifdef in C code.
|
127
|
+
have_const('MYSQL_DEFAULT_AUTH', mysql_h)
|
128
|
+
have_const('MYSQL_ENABLE_CLEARTEXT_PLUGIN', mysql_h)
|
129
|
+
have_const('SERVER_QUERY_NO_GOOD_INDEX_USED', mysql_h)
|
130
|
+
have_const('SERVER_QUERY_NO_INDEX_USED', mysql_h)
|
131
|
+
have_const('SERVER_QUERY_WAS_SLOW', mysql_h)
|
132
|
+
have_const('MYSQL_OPTION_MULTI_STATEMENTS_ON', mysql_h)
|
133
|
+
have_const('MYSQL_OPTION_MULTI_STATEMENTS_OFF', mysql_h)
|
134
|
+
|
135
|
+
# my_bool is replaced by C99 bool in MySQL 8.0, but we want
|
136
|
+
# to retain compatibility with the typedef in earlier MySQLs.
|
137
|
+
have_type('my_bool', mysql_h)
|
138
|
+
|
139
|
+
# This is our wishlist. We use whichever flags work on the host.
|
140
|
+
# -Wall and -Wextra are included by default.
|
141
|
+
wishlist = [
|
142
|
+
'-Weverything',
|
143
|
+
'-Wno-bad-function-cast', # rb_thread_call_without_gvl returns void * that we cast to VALUE
|
144
|
+
'-Wno-conditional-uninitialized', # false positive in client.c
|
145
|
+
'-Wno-covered-switch-default', # result.c -- enum_field_types (when fully covered, e.g. mysql 5.5)
|
146
|
+
'-Wno-declaration-after-statement', # GET_CLIENT followed by GET_STATEMENT in statement.c
|
147
|
+
'-Wno-disabled-macro-expansion', # rubby :(
|
148
|
+
'-Wno-documentation-unknown-command', # rubby :(
|
149
|
+
'-Wno-missing-field-initializers', # gperf generates bad code
|
150
|
+
'-Wno-missing-variable-declarations', # missing symbols due to ruby native ext initialization
|
151
|
+
'-Wno-padded', # mysql :(
|
152
|
+
'-Wno-reserved-id-macro', # rubby :(
|
153
|
+
'-Wno-sign-conversion', # gperf generates bad code
|
154
|
+
'-Wno-static-in-inline', # gperf generates bad code
|
155
|
+
'-Wno-switch-enum', # result.c -- enum_field_types (when not fully covered, e.g. mysql 5.6+)
|
156
|
+
'-Wno-undef', # rubinius :(
|
157
|
+
'-Wno-unreachable-code', # rubby :(
|
158
|
+
'-Wno-used-but-marked-unused', # rubby :(
|
159
|
+
]
|
160
|
+
|
161
|
+
usable_flags = wishlist.select do |flag|
|
162
|
+
try_link('int main() {return 0;}', "-Werror #{flag}")
|
99
163
|
end
|
100
164
|
|
101
|
-
|
165
|
+
$CFLAGS << ' ' << usable_flags.join(' ')
|
166
|
+
|
167
|
+
enabled_sanitizers = disabled_sanitizers = []
|
168
|
+
# Specify a comma-separated list of sanitizers, or try them all by default
|
169
|
+
sanitizers = with_config('sanitize')
|
170
|
+
case sanitizers
|
102
171
|
when true
|
103
|
-
|
104
|
-
|
105
|
-
|
172
|
+
# Try them all, turn on whatever we can
|
173
|
+
enabled_sanitizers = %w[address cfi integer memory thread undefined].select do |s|
|
174
|
+
try_link('int main() {return 0;}', "-Werror -fsanitize=#{s}")
|
175
|
+
end
|
176
|
+
abort "-----\nCould not enable any sanitizers!\n-----" if enabled_sanitizers.empty?
|
106
177
|
when String
|
107
|
-
#
|
108
|
-
|
109
|
-
|
110
|
-
|
178
|
+
# Figure out which sanitizers are supported
|
179
|
+
enabled_sanitizers, disabled_sanitizers = sanitizers.split(',').partition do |s|
|
180
|
+
try_link('int main() {return 0;}', "-Werror -fsanitize=#{s}")
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
unless disabled_sanitizers.empty?
|
185
|
+
abort "-----\nCould not enable requested sanitizers: #{disabled_sanitizers.join(',')}\n-----"
|
186
|
+
end
|
187
|
+
|
188
|
+
unless enabled_sanitizers.empty?
|
189
|
+
warn "-----\nEnabling sanitizers: #{enabled_sanitizers.join(',')}\n-----"
|
190
|
+
enabled_sanitizers.each do |s|
|
191
|
+
# address sanitizer requires runtime support
|
192
|
+
if s == 'address' # rubocop:disable Style/IfUnlessModifier
|
193
|
+
have_library('asan') || $LDFLAGS << ' -fsanitize=address'
|
194
|
+
end
|
195
|
+
$CFLAGS << " -fsanitize=#{s}"
|
196
|
+
end
|
197
|
+
# Options for line numbers in backtraces
|
198
|
+
$CFLAGS << ' -g -fno-omit-frame-pointer'
|
199
|
+
end
|
200
|
+
|
201
|
+
if RUBY_PLATFORM =~ /mswin|mingw/ && !defined?(RubyInstaller)
|
202
|
+
# Build libmysql.a interface link library
|
203
|
+
require 'rake'
|
204
|
+
|
205
|
+
# Build libmysql.a interface link library
|
206
|
+
# Use rake to rebuild only if these files change
|
207
|
+
deffile = File.expand_path('../../../support/libmysql.def', __FILE__)
|
208
|
+
libfile = File.expand_path(File.join(rpath_dir, 'libmysql.lib'))
|
209
|
+
file 'libmysql.a' => [deffile, libfile] do
|
210
|
+
when_writing 'building libmysql.a' do
|
211
|
+
# Ruby kindly shows us where dllwrap is, but that tool does more than we want.
|
212
|
+
# Maybe in the future Ruby could provide RbConfig::CONFIG['DLLTOOL'] directly.
|
213
|
+
dlltool = RbConfig::CONFIG['DLLWRAP'].gsub('dllwrap', 'dlltool')
|
214
|
+
sh dlltool, '--kill-at',
|
215
|
+
'--dllname', 'libmysql.dll',
|
216
|
+
'--output-lib', 'libmysql.a',
|
217
|
+
'--input-def', deffile, libfile
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
Rake::Task['libmysql.a'].invoke
|
222
|
+
$LOCAL_LIBS << ' ' << 'libmysql.a'
|
223
|
+
|
224
|
+
# Make sure the generated interface library works (if cross-compiling, trust without verifying)
|
225
|
+
unless RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
226
|
+
abort "-----\nCannot find libmysql.a\n-----" unless have_library('libmysql')
|
227
|
+
abort "-----\nCannot link to libmysql.a (my_init)\n-----" unless have_func('my_init')
|
228
|
+
end
|
229
|
+
|
230
|
+
# Vendor libmysql.dll
|
231
|
+
vendordir = File.expand_path('../../../vendor/', __FILE__)
|
232
|
+
directory vendordir
|
233
|
+
|
234
|
+
vendordll = File.join(vendordir, 'libmysql.dll')
|
235
|
+
dllfile = File.expand_path(File.join(rpath_dir, 'libmysql.dll'))
|
236
|
+
file vendordll => [dllfile, vendordir] do
|
237
|
+
when_writing 'copying libmysql.dll' do
|
238
|
+
cp dllfile, vendordll
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
# Copy libmysql.dll to the local vendor directory by default
|
243
|
+
if arg_config('--no-vendor-libmysql')
|
244
|
+
# Fine, don't.
|
245
|
+
puts "--no-vendor-libmysql"
|
246
|
+
else # Default: arg_config('--vendor-libmysql')
|
247
|
+
# Let's do it!
|
248
|
+
Rake::Task[vendordll].invoke
|
249
|
+
end
|
111
250
|
else
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
251
|
+
case explicit_rpath = with_config('mysql-rpath')
|
252
|
+
when true
|
253
|
+
abort "-----\nOption --with-mysql-rpath must have an argument\n-----"
|
254
|
+
when false
|
255
|
+
warn "-----\nOption --with-mysql-rpath has been disabled at your request\n-----"
|
256
|
+
when String
|
257
|
+
# The user gave us a value so use it
|
258
|
+
rpath_flags = " -Wl,-rpath,#{explicit_rpath}"
|
259
|
+
warn "-----\nSetting mysql rpath to #{explicit_rpath}\n-----"
|
260
|
+
$LDFLAGS << rpath_flags
|
261
|
+
else
|
262
|
+
if (libdir = rpath_dir[%r{(-L)?(/[^ ]+)}, 2])
|
263
|
+
rpath_flags = " -Wl,-rpath,#{libdir}"
|
264
|
+
if RbConfig::CONFIG["RPATHFLAG"].to_s.empty? && try_link('int main() {return 0;}', rpath_flags)
|
265
|
+
# Usually Ruby sets RPATHFLAG the right way for each system, but not on OS X.
|
266
|
+
warn "-----\nSetting rpath to #{libdir}\n-----"
|
267
|
+
$LDFLAGS << rpath_flags
|
268
|
+
else
|
269
|
+
if RbConfig::CONFIG["RPATHFLAG"].to_s.empty?
|
270
|
+
# If we got here because try_link failed, warn the user
|
271
|
+
warn "-----\nDon't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load\n-----"
|
272
|
+
end
|
273
|
+
# Make sure that LIBPATH gets set if we didn't explicitly set the rpath.
|
274
|
+
warn "-----\nSetting libpath to #{libdir}\n-----"
|
275
|
+
$LIBPATH << libdir unless $LIBPATH.include?(libdir)
|
122
276
|
end
|
123
|
-
# Make sure that LIBPATH gets set if we didn't explicitly set the rpath.
|
124
|
-
warn "-----\nSetting libpath to #{libdir}\n-----"
|
125
|
-
$LIBPATH << libdir unless $LIBPATH.include?(libdir)
|
126
277
|
end
|
127
278
|
end
|
128
279
|
end
|
data/ext/mysql2/infile.c
CHANGED
@@ -56,7 +56,7 @@ mysql2_local_infile_init(void **ptr, const char *filename, void *userdata)
|
|
56
56
|
* < 0 error
|
57
57
|
*/
|
58
58
|
static int
|
59
|
-
mysql2_local_infile_read(void *ptr, char *buf,
|
59
|
+
mysql2_local_infile_read(void *ptr, char *buf, unsigned int buf_len)
|
60
60
|
{
|
61
61
|
int count;
|
62
62
|
mysql2_local_infile_data *data = (mysql2_local_infile_data *)ptr;
|
@@ -95,7 +95,7 @@ mysql2_local_infile_end(void *ptr)
|
|
95
95
|
* Error message number (see http://dev.mysql.com/doc/refman/5.0/en/error-messages-client.html)
|
96
96
|
*/
|
97
97
|
static int
|
98
|
-
mysql2_local_infile_error(void *ptr, char *error_msg,
|
98
|
+
mysql2_local_infile_error(void *ptr, char *error_msg, unsigned int error_msg_len)
|
99
99
|
{
|
100
100
|
mysql2_local_infile_data *data = (mysql2_local_infile_data *) ptr;
|
101
101
|
|
data/ext/mysql2/mysql2_ext.c
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
#include <mysql2_ext.h>
|
2
2
|
|
3
|
-
VALUE mMysql2, cMysql2Error;
|
3
|
+
VALUE mMysql2, cMysql2Error, cMysql2TimeoutError;
|
4
4
|
|
5
5
|
/* Ruby Extension initializer */
|
6
6
|
void Init_mysql2() {
|
7
|
-
mMysql2
|
7
|
+
mMysql2 = rb_define_module("Mysql2");
|
8
|
+
rb_global_variable(&mMysql2);
|
9
|
+
|
8
10
|
cMysql2Error = rb_const_get(mMysql2, rb_intern("Error"));
|
11
|
+
rb_global_variable(&cMysql2Error);
|
12
|
+
|
13
|
+
cMysql2TimeoutError = rb_const_get(cMysql2Error, rb_intern("TimeoutError"));
|
14
|
+
rb_global_variable(&cMysql2TimeoutError);
|
9
15
|
|
10
16
|
init_mysql2_client();
|
11
17
|
init_mysql2_result();
|
18
|
+
init_mysql2_statement();
|
12
19
|
}
|
data/ext/mysql2/mysql2_ext.h
CHANGED
@@ -1,44 +1,43 @@
|
|
1
1
|
#ifndef MYSQL2_EXT
|
2
2
|
#define MYSQL2_EXT
|
3
3
|
|
4
|
+
void Init_mysql2(void);
|
5
|
+
|
4
6
|
/* tell rbx not to use it's caching compat layer
|
5
7
|
by doing this we're making a promise to RBX that
|
6
8
|
we'll never modify the pointers we get back from RSTRING_PTR */
|
7
9
|
#define RSTRING_NOT_MODIFIED
|
8
10
|
#include <ruby.h>
|
9
11
|
|
10
|
-
#ifndef HAVE_UINT
|
11
|
-
#define HAVE_UINT
|
12
|
-
typedef unsigned short ushort;
|
13
|
-
typedef unsigned int uint;
|
14
|
-
#endif
|
15
|
-
|
16
12
|
#ifdef HAVE_MYSQL_H
|
17
13
|
#include <mysql.h>
|
18
|
-
#include <mysql_com.h>
|
19
14
|
#include <errmsg.h>
|
20
|
-
#include <mysqld_error.h>
|
21
15
|
#else
|
22
16
|
#include <mysql/mysql.h>
|
23
|
-
#include <mysql/mysql_com.h>
|
24
17
|
#include <mysql/errmsg.h>
|
25
|
-
#include <mysql/mysqld_error.h>
|
26
18
|
#endif
|
27
19
|
|
28
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
29
20
|
#include <ruby/encoding.h>
|
30
|
-
#endif
|
31
|
-
#ifdef HAVE_RUBY_THREAD_H
|
32
21
|
#include <ruby/thread.h>
|
33
|
-
#endif
|
34
22
|
|
35
23
|
#if defined(__GNUC__) && (__GNUC__ >= 3)
|
24
|
+
#define RB_MYSQL_NORETURN __attribute__ ((noreturn))
|
36
25
|
#define RB_MYSQL_UNUSED __attribute__ ((unused))
|
37
26
|
#else
|
27
|
+
#define RB_MYSQL_NORETURN
|
38
28
|
#define RB_MYSQL_UNUSED
|
39
29
|
#endif
|
40
30
|
|
31
|
+
/* MySQL 8.0 replaces my_bool with C99 bool. Earlier versions of MySQL had
|
32
|
+
* a typedef to char. Gem users reported failures on big endian systems when
|
33
|
+
* using C99 bool types with older MySQLs due to mismatched behavior. */
|
34
|
+
#ifndef HAVE_TYPE_MY_BOOL
|
35
|
+
#include <stdbool.h>
|
36
|
+
typedef bool my_bool;
|
37
|
+
#endif
|
38
|
+
|
41
39
|
#include <client.h>
|
40
|
+
#include <statement.h>
|
42
41
|
#include <result.h>
|
43
42
|
#include <infile.h>
|
44
43
|
|