mysql2 0.4.2 → 0.5.5
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/README.md +231 -86
- data/ext/mysql2/client.c +527 -128
- data/ext/mysql2/client.h +11 -52
- data/ext/mysql2/extconf.rb +100 -21
- data/ext/mysql2/mysql2_ext.c +8 -2
- data/ext/mysql2/mysql2_ext.h +21 -8
- data/ext/mysql2/mysql_enc_name_to_ruby.h +60 -56
- data/ext/mysql2/mysql_enc_to_ruby.h +64 -3
- data/ext/mysql2/result.c +333 -109
- data/ext/mysql2/result.h +1 -0
- data/ext/mysql2/statement.c +247 -90
- data/ext/mysql2/statement.h +0 -2
- data/ext/mysql2/wait_for_single_fd.h +2 -1
- data/lib/mysql2/client.rb +71 -31
- data/lib/mysql2/em.rb +2 -4
- data/lib/mysql2/error.rb +52 -22
- data/lib/mysql2/result.rb +2 -0
- data/lib/mysql2/statement.rb +3 -11
- data/lib/mysql2/version.rb +1 -1
- data/lib/mysql2.rb +19 -15
- data/support/3A79BD29.asc +49 -0
- data/support/5072E1F5.asc +432 -0
- data/support/C74CD1D8.asc +104 -0
- data/support/mysql_enc_to_ruby.rb +8 -3
- data/support/ruby_enc_to_mysql.rb +7 -5
- metadata +19 -61
- data/examples/eventmachine.rb +0 -21
- data/examples/threaded.rb +0 -18
- data/spec/configuration.yml.example +0 -17
- data/spec/em/em_spec.rb +0 -135
- data/spec/my.cnf.example +0 -9
- data/spec/mysql2/client_spec.rb +0 -939
- data/spec/mysql2/error_spec.rb +0 -84
- data/spec/mysql2/result_spec.rb +0 -510
- data/spec/mysql2/statement_spec.rb +0 -684
- data/spec/rcov.opts +0 -3
- data/spec/spec_helper.rb +0 -94
- data/spec/ssl/ca-cert.pem +0 -17
- data/spec/ssl/ca-key.pem +0 -27
- data/spec/ssl/ca.cnf +0 -22
- data/spec/ssl/cert.cnf +0 -22
- data/spec/ssl/client-cert.pem +0 -17
- data/spec/ssl/client-key.pem +0 -27
- data/spec/ssl/client-req.pem +0 -15
- data/spec/ssl/gen_certs.sh +0 -48
- data/spec/ssl/pkcs8-client-key.pem +0 -28
- data/spec/ssl/pkcs8-server-key.pem +0 -28
- data/spec/ssl/server-cert.pem +0 -17
- data/spec/ssl/server-key.pem +0 -27
- data/spec/ssl/server-req.pem +0 -15
- data/spec/test_data +0 -1
data/ext/mysql2/client.h
CHANGED
@@ -1,76 +1,35 @@
|
|
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
|
-
VALUE
|
6
|
+
VALUE active_fiber; /* rb_fiber_current() or Qnil */
|
42
7
|
long server_version;
|
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
|
-
|
54
|
-
REQUIRE_INITIALIZED(wrapper) \
|
55
|
-
if (!wrapper->connected && !wrapper->reconnect_enabled) { \
|
56
|
-
rb_raise(cMysql2Error, "closed MySQL connection"); \
|
57
|
-
}
|
18
|
+
void rb_mysql_set_server_query_flags(MYSQL *client, VALUE result);
|
58
19
|
|
59
|
-
|
60
|
-
|
61
|
-
#define MARK_CONN_INACTIVE(conn) do {\
|
62
|
-
wrapper->active_thread = Qnil; \
|
63
|
-
} while(0)
|
20
|
+
extern const rb_data_type_t rb_mysql_client_type;
|
64
21
|
|
22
|
+
#ifdef NEW_TYPEDDATA_WRAPPER
|
23
|
+
#define GET_CLIENT(self) \
|
24
|
+
mysql_client_wrapper *wrapper; \
|
25
|
+
TypedData_Get_Struct(self, mysql_client_wrapper, &rb_mysql_client_type, wrapper);
|
26
|
+
#else
|
65
27
|
#define GET_CLIENT(self) \
|
66
28
|
mysql_client_wrapper *wrapper; \
|
67
29
|
Data_Get_Struct(self, mysql_client_wrapper, wrapper);
|
30
|
+
#endif
|
68
31
|
|
69
32
|
void init_mysql2_client(void);
|
70
33
|
void decr_mysql2_client(mysql_client_wrapper *wrapper);
|
71
34
|
|
72
35
|
#endif
|
73
|
-
|
74
|
-
#ifndef HAVE_RB_HASH_DUP
|
75
|
-
VALUE rb_hash_dup(VALUE other);
|
76
|
-
#endif
|
data/ext/mysql2/extconf.rb
CHANGED
@@ -1,33 +1,81 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
require 'mkmf'
|
3
2
|
require 'English'
|
4
3
|
|
4
|
+
### Some helper functions
|
5
|
+
|
5
6
|
def asplode(lib)
|
6
7
|
if RUBY_PLATFORM =~ /mingw|mswin/
|
7
8
|
abort "-----\n#{lib} is missing. Check your installation of MySQL or Connector/C, and try again.\n-----"
|
8
9
|
elsif RUBY_PLATFORM =~ /darwin/
|
9
10
|
abort "-----\n#{lib} is missing. You may need to 'brew install mysql' or 'port install mysql', and try again.\n-----"
|
10
11
|
else
|
11
|
-
abort "-----\n#{lib} is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.\n-----"
|
12
|
+
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-----"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_ssl_defines(header)
|
17
|
+
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|
|
18
|
+
m && have_const(ssl_mode, header)
|
19
|
+
end
|
20
|
+
if all_modes_found
|
21
|
+
$CFLAGS << ' -DFULL_SSL_MODE_SUPPORT'
|
22
|
+
else
|
23
|
+
# if we only have ssl toggle (--ssl,--disable-ssl) from 5.7.3 to 5.7.10
|
24
|
+
# and the verify server cert option. This is also the case for MariaDB.
|
25
|
+
has_verify_support = have_const('MYSQL_OPT_SSL_VERIFY_SERVER_CERT', header)
|
26
|
+
has_enforce_support = have_const('MYSQL_OPT_SSL_ENFORCE', header)
|
27
|
+
$CFLAGS << ' -DNO_SSL_MODE_SUPPORT' if !has_verify_support && !has_enforce_support
|
12
28
|
end
|
13
29
|
end
|
14
30
|
|
15
|
-
|
16
|
-
have_header('ruby/thread.h') && have_func('rb_thread_call_without_gvl', 'ruby/thread.h')
|
31
|
+
### Check for Ruby C extention interfaces
|
17
32
|
|
18
|
-
# 1
|
19
|
-
have_func('
|
33
|
+
# 2.1+
|
34
|
+
have_func('rb_absint_size')
|
35
|
+
have_func('rb_absint_singlebit_p')
|
36
|
+
|
37
|
+
# 2.7+
|
38
|
+
have_func('rb_gc_mark_movable')
|
39
|
+
|
40
|
+
# Missing in RBX (https://github.com/rubinius/rubinius/issues/3771)
|
20
41
|
have_func('rb_wait_for_single_fd')
|
21
|
-
|
22
|
-
|
42
|
+
|
43
|
+
# 3.0+
|
44
|
+
have_func('rb_enc_interned_str', 'ruby.h')
|
45
|
+
|
46
|
+
### Find OpenSSL library
|
47
|
+
|
48
|
+
# User-specified OpenSSL if explicitly specified
|
49
|
+
if with_config('openssl-dir')
|
50
|
+
_, lib = dir_config('openssl')
|
51
|
+
if lib
|
52
|
+
# Ruby versions below 2.0 on Unix and below 2.1 on Windows
|
53
|
+
# do not properly search for lib directories, and must be corrected:
|
54
|
+
# https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/39717
|
55
|
+
unless lib && lib[-3, 3] == 'lib'
|
56
|
+
@libdir_basename = 'lib'
|
57
|
+
_, lib = dir_config('openssl')
|
58
|
+
end
|
59
|
+
abort "-----\nCannot find library dir(s) #{lib}\n-----" unless lib && lib.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) }
|
60
|
+
warn "-----\nUsing --with-openssl-dir=#{File.dirname lib}\n-----"
|
61
|
+
$LDFLAGS << " -L#{lib}"
|
62
|
+
end
|
63
|
+
# Homebrew OpenSSL on MacOS
|
64
|
+
elsif RUBY_PLATFORM =~ /darwin/ && system('command -v brew')
|
65
|
+
openssl_location = `brew --prefix openssl`.strip
|
66
|
+
$LDFLAGS << " -L#{openssl_location}/lib" if openssl_location
|
67
|
+
end
|
68
|
+
|
69
|
+
### Find MySQL client library
|
23
70
|
|
24
71
|
# borrowed from mysqlplus
|
25
72
|
# http://github.com/oldmoe/mysqlplus/blob/master/ext/extconf.rb
|
26
|
-
dirs = ENV.fetch('PATH').split(File::PATH_SEPARATOR) + %w
|
73
|
+
dirs = ENV.fetch('PATH').split(File::PATH_SEPARATOR) + %w[
|
27
74
|
/opt
|
28
75
|
/opt/local
|
29
76
|
/opt/local/mysql
|
30
77
|
/opt/local/lib/mysql5*
|
78
|
+
/opt/homebrew/opt/mysql*
|
31
79
|
/usr
|
32
80
|
/usr/mysql
|
33
81
|
/usr/local
|
@@ -35,17 +83,22 @@ dirs = ENV.fetch('PATH').split(File::PATH_SEPARATOR) + %w(
|
|
35
83
|
/usr/local/mysql-*
|
36
84
|
/usr/local/lib/mysql5*
|
37
85
|
/usr/local/opt/mysql5*
|
38
|
-
|
86
|
+
/usr/local/opt/mysql@*
|
87
|
+
/usr/local/opt/mysql-client
|
88
|
+
/usr/local/opt/mysql-client@*
|
89
|
+
].map { |dir| dir << '/bin' }
|
90
|
+
|
91
|
+
# For those without HOMEBREW_ROOT in PATH
|
92
|
+
dirs << "#{ENV['HOMEBREW_ROOT']}/bin" if ENV['HOMEBREW_ROOT']
|
39
93
|
|
40
|
-
GLOB = "{#{dirs.join(',')}}/{mysql_config,mysql_config5,mariadb_config}"
|
94
|
+
GLOB = "{#{dirs.join(',')}}/{mysql_config,mysql_config5,mariadb_config}".freeze
|
41
95
|
|
42
96
|
# If the user has provided a --with-mysql-dir argument, we must respect it or fail.
|
43
97
|
inc, lib = dir_config('mysql')
|
44
98
|
if inc && lib
|
45
|
-
#
|
46
|
-
#
|
99
|
+
# Ruby versions below 2.0 on Unix and below 2.1 on Windows
|
100
|
+
# do not properly search for lib directories, and must be corrected:
|
47
101
|
# https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/39717
|
48
|
-
# do not properly search for lib directories, and must be corrected
|
49
102
|
unless lib && lib[-3, 3] == 'lib'
|
50
103
|
@libdir_basename = 'lib'
|
51
104
|
inc, lib = dir_config('mysql')
|
@@ -54,6 +107,7 @@ if inc && lib
|
|
54
107
|
abort "-----\nCannot find library dir(s) #{lib}\n-----" unless lib && lib.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) }
|
55
108
|
warn "-----\nUsing --with-mysql-dir=#{File.dirname inc}\n-----"
|
56
109
|
rpath_dir = lib
|
110
|
+
have_library('mysqlclient')
|
57
111
|
elsif (mc = (with_config('mysql-config') || Dir[GLOB].first))
|
58
112
|
# If the user has provided a --with-mysql-config argument, we must respect it or fail.
|
59
113
|
# If the user gave --with-mysql-config with no argument means we should try to find it.
|
@@ -74,7 +128,7 @@ elsif (mc = (with_config('mysql-config') || Dir[GLOB].first))
|
|
74
128
|
else
|
75
129
|
_, usr_local_lib = dir_config('mysql', '/usr/local')
|
76
130
|
|
77
|
-
asplode("mysql client") unless find_library('mysqlclient',
|
131
|
+
asplode("mysql client") unless find_library('mysqlclient', nil, usr_local_lib, "#{usr_local_lib}/mysql")
|
78
132
|
|
79
133
|
rpath_dir = usr_local_lib
|
80
134
|
end
|
@@ -87,15 +141,36 @@ else
|
|
87
141
|
asplode 'mysql.h'
|
88
142
|
end
|
89
143
|
|
90
|
-
%w
|
91
|
-
header = [prefix, h].compact.join
|
144
|
+
%w[errmsg.h].each do |h|
|
145
|
+
header = [prefix, h].compact.join('/')
|
92
146
|
asplode h unless have_header header
|
93
147
|
end
|
94
148
|
|
149
|
+
mysql_h = [prefix, 'mysql.h'].compact.join('/')
|
150
|
+
add_ssl_defines(mysql_h)
|
151
|
+
have_struct_member('MYSQL', 'net.vio', mysql_h)
|
152
|
+
have_struct_member('MYSQL', 'net.pvio', mysql_h)
|
153
|
+
|
154
|
+
# These constants are actually enums, so they cannot be detected by #ifdef in C code.
|
155
|
+
have_const('MYSQL_DEFAULT_AUTH', mysql_h)
|
156
|
+
have_const('MYSQL_ENABLE_CLEARTEXT_PLUGIN', mysql_h)
|
157
|
+
have_const('SERVER_QUERY_NO_GOOD_INDEX_USED', mysql_h)
|
158
|
+
have_const('SERVER_QUERY_NO_INDEX_USED', mysql_h)
|
159
|
+
have_const('SERVER_QUERY_WAS_SLOW', mysql_h)
|
160
|
+
have_const('MYSQL_OPTION_MULTI_STATEMENTS_ON', mysql_h)
|
161
|
+
have_const('MYSQL_OPTION_MULTI_STATEMENTS_OFF', mysql_h)
|
162
|
+
|
163
|
+
# my_bool is replaced by C99 bool in MySQL 8.0, but we want
|
164
|
+
# to retain compatibility with the typedef in earlier MySQLs.
|
165
|
+
have_type('my_bool', mysql_h)
|
166
|
+
|
167
|
+
### Compiler flags to help catch errors
|
168
|
+
|
95
169
|
# This is our wishlist. We use whichever flags work on the host.
|
96
170
|
# -Wall and -Wextra are included by default.
|
97
171
|
wishlist = [
|
98
172
|
'-Weverything',
|
173
|
+
'-Wno-compound-token-split-by-macro', # Fixed in Ruby 2.7+ at https://bugs.ruby-lang.org/issues/17865
|
99
174
|
'-Wno-bad-function-cast', # rb_thread_call_without_gvl returns void * that we cast to VALUE
|
100
175
|
'-Wno-conditional-uninitialized', # false positive in client.c
|
101
176
|
'-Wno-covered-switch-default', # result.c -- enum_field_types (when fully covered, e.g. mysql 5.5)
|
@@ -120,13 +195,15 @@ end
|
|
120
195
|
|
121
196
|
$CFLAGS << ' ' << usable_flags.join(' ')
|
122
197
|
|
198
|
+
### Sanitizers to help with debugging -- many are available on both Clang/LLVM and GCC
|
199
|
+
|
123
200
|
enabled_sanitizers = disabled_sanitizers = []
|
124
|
-
# Specify a
|
201
|
+
# Specify a comma-separated list of sanitizers, or try them all by default
|
125
202
|
sanitizers = with_config('sanitize')
|
126
203
|
case sanitizers
|
127
204
|
when true
|
128
205
|
# Try them all, turn on whatever we can
|
129
|
-
enabled_sanitizers = %w
|
206
|
+
enabled_sanitizers = %w[address cfi integer memory thread undefined].select do |s|
|
130
207
|
try_link('int main() {return 0;}', "-Werror -fsanitize=#{s}")
|
131
208
|
end
|
132
209
|
abort "-----\nCould not enable any sanitizers!\n-----" if enabled_sanitizers.empty?
|
@@ -137,7 +214,7 @@ when String
|
|
137
214
|
end
|
138
215
|
end
|
139
216
|
|
140
|
-
unless disabled_sanitizers.empty?
|
217
|
+
unless disabled_sanitizers.empty? # rubocop:disable Style/IfUnlessModifier
|
141
218
|
abort "-----\nCould not enable requested sanitizers: #{disabled_sanitizers.join(',')}\n-----"
|
142
219
|
end
|
143
220
|
|
@@ -154,7 +231,9 @@ unless enabled_sanitizers.empty?
|
|
154
231
|
$CFLAGS << ' -g -fno-omit-frame-pointer'
|
155
232
|
end
|
156
233
|
|
157
|
-
|
234
|
+
### Find MySQL Client on Windows, set RPATH to find the library at runtime
|
235
|
+
|
236
|
+
if RUBY_PLATFORM =~ /mswin|mingw/ && !defined?(RubyInstaller)
|
158
237
|
# Build libmysql.a interface link library
|
159
238
|
require 'rake'
|
160
239
|
|
data/ext/mysql2/mysql2_ext.c
CHANGED
@@ -1,11 +1,17 @@
|
|
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();
|
data/ext/mysql2/mysql2_ext.h
CHANGED
@@ -11,22 +11,14 @@ void Init_mysql2(void);
|
|
11
11
|
|
12
12
|
#ifdef HAVE_MYSQL_H
|
13
13
|
#include <mysql.h>
|
14
|
-
#include <mysql_com.h>
|
15
14
|
#include <errmsg.h>
|
16
|
-
#include <mysqld_error.h>
|
17
15
|
#else
|
18
16
|
#include <mysql/mysql.h>
|
19
|
-
#include <mysql/mysql_com.h>
|
20
17
|
#include <mysql/errmsg.h>
|
21
|
-
#include <mysql/mysqld_error.h>
|
22
18
|
#endif
|
23
19
|
|
24
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
25
20
|
#include <ruby/encoding.h>
|
26
|
-
#endif
|
27
|
-
#ifdef HAVE_RUBY_THREAD_H
|
28
21
|
#include <ruby/thread.h>
|
29
|
-
#endif
|
30
22
|
|
31
23
|
#if defined(__GNUC__) && (__GNUC__ >= 3)
|
32
24
|
#define RB_MYSQL_NORETURN __attribute__ ((noreturn))
|
@@ -36,6 +28,27 @@ void Init_mysql2(void);
|
|
36
28
|
#define RB_MYSQL_UNUSED
|
37
29
|
#endif
|
38
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
|
+
|
39
|
+
// ruby 2.7+
|
40
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
41
|
+
#define rb_mysql2_gc_location(ptr) ptr = rb_gc_location(ptr)
|
42
|
+
#else
|
43
|
+
#define rb_gc_mark_movable(ptr) rb_gc_mark(ptr)
|
44
|
+
#define rb_mysql2_gc_location(ptr)
|
45
|
+
#endif
|
46
|
+
|
47
|
+
// ruby 2.2+
|
48
|
+
#ifdef TypedData_Make_Struct
|
49
|
+
#define NEW_TYPEDDATA_WRAPPER 1
|
50
|
+
#endif
|
51
|
+
|
39
52
|
#include <client.h>
|
40
53
|
#include <statement.h>
|
41
54
|
#include <result.h>
|
@@ -30,7 +30,7 @@ error "gperf generated tables don't work with this execution character set. Plea
|
|
30
30
|
#endif
|
31
31
|
|
32
32
|
struct mysql2_mysql_enc_name_to_rb_map { const char *name; const char *rb_name; };
|
33
|
-
/* maximum key range =
|
33
|
+
/* maximum key range = 71, duplicates = 0 */
|
34
34
|
|
35
35
|
#ifdef __GNUC__
|
36
36
|
__inline
|
@@ -46,32 +46,32 @@ mysql2_mysql_enc_name_to_rb_hash (str, len)
|
|
46
46
|
{
|
47
47
|
static const unsigned char asso_values[] =
|
48
48
|
{
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
0,
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
10, 0,
|
60
|
-
0,
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
49
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
50
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
51
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
52
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
53
|
+
74, 74, 74, 74, 74, 74, 74, 74, 15, 5,
|
54
|
+
0, 74, 5, 25, 40, 10, 20, 50, 74, 74,
|
55
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
56
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
57
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
58
|
+
74, 74, 74, 74, 74, 74, 74, 40, 5, 0,
|
59
|
+
15, 10, 0, 0, 0, 5, 74, 0, 25, 5,
|
60
|
+
0, 5, 74, 74, 20, 5, 5, 0, 74, 45,
|
61
|
+
74, 0, 74, 74, 74, 74, 74, 74, 74, 74,
|
62
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
63
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
64
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
65
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
66
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
67
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
68
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
69
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
70
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
71
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
72
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
73
|
+
74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
|
74
|
+
74, 74, 74, 74, 74, 74
|
75
75
|
};
|
76
76
|
return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
|
77
77
|
}
|
@@ -89,11 +89,11 @@ mysql2_mysql_enc_name_to_rb (str, len)
|
|
89
89
|
{
|
90
90
|
enum
|
91
91
|
{
|
92
|
-
TOTAL_KEYWORDS =
|
92
|
+
TOTAL_KEYWORDS = 41,
|
93
93
|
MIN_WORD_LENGTH = 3,
|
94
94
|
MAX_WORD_LENGTH = 8,
|
95
95
|
MIN_HASH_VALUE = 3,
|
96
|
-
MAX_HASH_VALUE =
|
96
|
+
MAX_HASH_VALUE = 73
|
97
97
|
};
|
98
98
|
|
99
99
|
static const struct mysql2_mysql_enc_name_to_rb_map wordlist[] =
|
@@ -101,54 +101,58 @@ mysql2_mysql_enc_name_to_rb (str, len)
|
|
101
101
|
{""}, {""}, {""},
|
102
102
|
{"gbk", "GBK"},
|
103
103
|
{""},
|
104
|
-
{"
|
104
|
+
{"utf32", "UTF-32"},
|
105
105
|
{"gb2312", "GB2312"},
|
106
106
|
{"keybcs2", NULL},
|
107
107
|
{""},
|
108
108
|
{"ucs2", "UTF-16BE"},
|
109
109
|
{"koi8u", "KOI8-R"},
|
110
110
|
{"binary", "ASCII-8BIT"},
|
111
|
-
{"
|
112
|
-
{""},
|
111
|
+
{"utf8mb4", "UTF-8"},
|
112
|
+
{"macroman", "macRoman"},
|
113
113
|
{"ujis", "eucJP-ms"},
|
114
|
-
{"
|
114
|
+
{"greek", "ISO-8859-7"},
|
115
115
|
{"cp1251", "Windows-1251"},
|
116
|
-
{"
|
116
|
+
{"utf16le", "UTF-16LE"},
|
117
117
|
{""},
|
118
118
|
{"sjis", "Shift_JIS"},
|
119
119
|
{"macce", "macCentEuro"},
|
120
|
-
{"
|
120
|
+
{"cp1257", "Windows-1257"},
|
121
|
+
{"eucjpms", "eucJP-ms"},
|
122
|
+
{""},
|
123
|
+
{"utf8", "UTF-8"},
|
124
|
+
{"cp852", "CP852"},
|
125
|
+
{"cp1250", "Windows-1250"},
|
126
|
+
{"gb18030", "GB18030"},
|
121
127
|
{""},
|
122
|
-
{"macroman", "macRoman"},
|
123
|
-
{"dec8", NULL},
|
124
|
-
{"utf32", "UTF-32"},
|
125
|
-
{"latin1", "ISO-8859-1"},
|
126
|
-
{"utf8mb4", "UTF-8"},
|
127
|
-
{"hp8", NULL},
|
128
128
|
{"swe7", NULL},
|
129
|
+
{"koi8r", "KOI8-R"},
|
130
|
+
{"tis620", "TIS-620"},
|
131
|
+
{"geostd8", NULL},
|
132
|
+
{""},
|
133
|
+
{"big5", "Big5"},
|
129
134
|
{"euckr", "EUC-KR"},
|
130
|
-
{"
|
135
|
+
{"latin2", "ISO-8859-2"},
|
131
136
|
{""}, {""},
|
132
|
-
{"
|
133
|
-
{"
|
134
|
-
{"
|
135
|
-
{""},
|
136
|
-
{"
|
137
|
+
{"dec8", NULL},
|
138
|
+
{"cp850", "CP850"},
|
139
|
+
{"latin1", "ISO-8859-1"},
|
140
|
+
{""},
|
141
|
+
{"hp8", NULL},
|
142
|
+
{""},
|
143
|
+
{"utf16", "UTF-16"},
|
137
144
|
{"latin7", "ISO-8859-13"},
|
138
145
|
{""}, {""}, {""},
|
139
146
|
{"ascii", "US-ASCII"},
|
140
|
-
{"
|
141
|
-
{""}, {""},
|
142
|
-
{"big5", "Big5"},
|
143
|
-
{"utf16", "UTF-16"},
|
144
|
-
{"cp1250", "Windows-1250"},
|
145
|
-
{""}, {""}, {""},
|
146
|
-
{"cp850", "CP850"},
|
147
|
-
{"tis620", "TIS-620"},
|
147
|
+
{"cp1256", "Windows-1256"},
|
148
148
|
{""}, {""}, {""},
|
149
149
|
{"cp932", "Windows-31J"},
|
150
|
+
{"hebrew", "ISO-8859-8"},
|
151
|
+
{""}, {""}, {""}, {""},
|
150
152
|
{"latin5", "ISO-8859-9"},
|
151
|
-
{""}, {""}, {""},
|
153
|
+
{""}, {""}, {""},
|
154
|
+
{"cp866", "IBM866"},
|
155
|
+
{""}, {""}, {""}, {""}, {""}, {""}, {""},
|
152
156
|
{"armscii8", NULL}
|
153
157
|
};
|
154
158
|
|
@@ -54,13 +54,13 @@ static const char *mysql2_mysql_enc_to_rb[] = {
|
|
54
54
|
"macRoman",
|
55
55
|
"UTF-16",
|
56
56
|
"UTF-16",
|
57
|
-
"",
|
57
|
+
"UTF-16LE",
|
58
58
|
"Windows-1256",
|
59
59
|
"Windows-1257",
|
60
60
|
"Windows-1257",
|
61
61
|
"UTF-32",
|
62
62
|
"UTF-32",
|
63
|
-
"",
|
63
|
+
"UTF-16LE",
|
64
64
|
"ASCII-8BIT",
|
65
65
|
NULL,
|
66
66
|
"US-ASCII",
|
@@ -74,7 +74,7 @@ static const char *mysql2_mysql_enc_to_rb[] = {
|
|
74
74
|
NULL,
|
75
75
|
"KOI8-R",
|
76
76
|
"KOI8-R",
|
77
|
-
|
77
|
+
"UTF-8",
|
78
78
|
"ISO-8859-2",
|
79
79
|
"ISO-8859-9",
|
80
80
|
"ISO-8859-13",
|
@@ -245,5 +245,66 @@ static const char *mysql2_mysql_enc_to_rb[] = {
|
|
245
245
|
"UTF-8",
|
246
246
|
"UTF-8",
|
247
247
|
"UTF-8",
|
248
|
+
"UTF-8",
|
249
|
+
"GB18030",
|
250
|
+
"GB18030",
|
251
|
+
"GB18030",
|
252
|
+
NULL,
|
253
|
+
NULL,
|
254
|
+
NULL,
|
255
|
+
NULL,
|
256
|
+
"UTF-8",
|
257
|
+
"UTF-8",
|
258
|
+
"UTF-8",
|
259
|
+
"UTF-8",
|
260
|
+
"UTF-8",
|
261
|
+
"UTF-8",
|
262
|
+
"UTF-8",
|
263
|
+
"UTF-8",
|
264
|
+
"UTF-8",
|
265
|
+
"UTF-8",
|
266
|
+
"UTF-8",
|
267
|
+
"UTF-8",
|
268
|
+
"UTF-8",
|
269
|
+
"UTF-8",
|
270
|
+
"UTF-8",
|
271
|
+
"UTF-8",
|
272
|
+
"UTF-8",
|
273
|
+
NULL,
|
274
|
+
"UTF-8",
|
275
|
+
"UTF-8",
|
276
|
+
"UTF-8",
|
277
|
+
NULL,
|
278
|
+
"UTF-8",
|
279
|
+
"UTF-8",
|
280
|
+
"UTF-8",
|
281
|
+
"UTF-8",
|
282
|
+
"UTF-8",
|
283
|
+
"UTF-8",
|
284
|
+
"UTF-8",
|
285
|
+
"UTF-8",
|
286
|
+
"UTF-8",
|
287
|
+
"UTF-8",
|
288
|
+
"UTF-8",
|
289
|
+
"UTF-8",
|
290
|
+
"UTF-8",
|
291
|
+
"UTF-8",
|
292
|
+
"UTF-8",
|
293
|
+
"UTF-8",
|
294
|
+
"UTF-8",
|
295
|
+
"UTF-8",
|
296
|
+
NULL,
|
297
|
+
"UTF-8",
|
298
|
+
"UTF-8",
|
299
|
+
"UTF-8",
|
300
|
+
NULL,
|
301
|
+
"UTF-8",
|
302
|
+
NULL,
|
303
|
+
NULL,
|
304
|
+
"UTF-8",
|
305
|
+
"UTF-8",
|
306
|
+
"UTF-8",
|
307
|
+
"UTF-8",
|
308
|
+
"UTF-8",
|
248
309
|
"UTF-8"
|
249
310
|
};
|