ruby-mysql-ext 2.9.7

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.
@@ -0,0 +1,290 @@
1
+ # Copyright (C) 2008-2010 TOMITA Masahiro
2
+ # mailto:tommy@tmtm.org
3
+
4
+ class Mysql
5
+ class Charset
6
+ def initialize(number, name, csname)
7
+ @number, @name, @csname = number, name, csname
8
+ @unsafe = false
9
+ end
10
+ attr_reader :number, :name, :csname
11
+ attr_accessor :unsafe
12
+
13
+ # [[charset_number, charset_name, collation_name, default], ...]
14
+ CHARSETS = [
15
+ [ 1, "big5", "big5_chinese_ci", true ],
16
+ [ 2, "latin2", "latin2_czech_cs", false],
17
+ [ 3, "dec8", "dec8_swedish_ci", true ],
18
+ [ 4, "cp850", "cp850_general_ci", true ],
19
+ [ 5, "latin1", "latin1_german1_ci", false],
20
+ [ 6, "hp8", "hp8_english_ci", true ],
21
+ [ 7, "koi8r", "koi8r_general_ci", true ],
22
+ [ 8, "latin1", "latin1_swedish_ci", true ],
23
+ [ 9, "latin2", "latin2_general_ci", true ],
24
+ [ 10, "swe7", "swe7_swedish_ci", true ],
25
+ [ 11, "ascii", "ascii_general_ci", true ],
26
+ [ 12, "ujis", "ujis_japanese_ci", true ],
27
+ [ 13, "sjis", "sjis_japanese_ci", true ],
28
+ [ 14, "cp1251", "cp1251_bulgarian_ci", false],
29
+ [ 15, "latin1", "latin1_danish_ci", false],
30
+ [ 16, "hebrew", "hebrew_general_ci", true ],
31
+ [ 17, "filename", "filename", true ],
32
+ [ 18, "tis620", "tis620_thai_ci", true ],
33
+ [ 19, "euckr", "euckr_korean_ci", true ],
34
+ [ 20, "latin7", "latin7_estonian_cs", false],
35
+ [ 21, "latin2", "latin2_hungarian_ci", false],
36
+ [ 22, "koi8u", "koi8u_general_ci", true ],
37
+ [ 23, "cp1251", "cp1251_ukrainian_ci", false],
38
+ [ 24, "gb2312", "gb2312_chinese_ci", true ],
39
+ [ 25, "greek", "greek_general_ci", true ],
40
+ [ 26, "cp1250", "cp1250_general_ci", true ],
41
+ [ 27, "latin2", "latin2_croatian_ci", false],
42
+ [ 28, "gbk", "gbk_chinese_ci", true ],
43
+ [ 29, "cp1257", "cp1257_lithuanian_ci", false],
44
+ [ 30, "latin5", "latin5_turkish_ci", true ],
45
+ [ 31, "latin1", "latin1_german2_ci", false],
46
+ [ 32, "armscii8", "armscii8_general_ci", true ],
47
+ [ 33, "utf8", "utf8_general_ci", true ],
48
+ [ 34, "cp1250", "cp1250_czech_cs", false],
49
+ [ 35, "ucs2", "ucs2_general_ci", true ],
50
+ [ 36, "cp866", "cp866_general_ci", true ],
51
+ [ 37, "keybcs2", "keybcs2_general_ci", true ],
52
+ [ 38, "macce", "macce_general_ci", true ],
53
+ [ 39, "macroman", "macroman_general_ci", true ],
54
+ [ 40, "cp852", "cp852_general_ci", true ],
55
+ [ 41, "latin7", "latin7_general_ci", true ],
56
+ [ 42, "latin7", "latin7_general_cs", false],
57
+ [ 43, "macce", "macce_bin", false],
58
+ [ 44, "cp1250", "cp1250_croatian_ci", false],
59
+ [ 47, "latin1", "latin1_bin", false],
60
+ [ 48, "latin1", "latin1_general_ci", false],
61
+ [ 49, "latin1", "latin1_general_cs", false],
62
+ [ 50, "cp1251", "cp1251_bin", false],
63
+ [ 51, "cp1251", "cp1251_general_ci", true ],
64
+ [ 52, "cp1251", "cp1251_general_cs", false],
65
+ [ 53, "macroman", "macroman_bin", false],
66
+ [ 57, "cp1256", "cp1256_general_ci", true ],
67
+ [ 58, "cp1257", "cp1257_bin", false],
68
+ [ 59, "cp1257", "cp1257_general_ci", true ],
69
+ [ 63, "binary", "binary", true ],
70
+ [ 64, "armscii8", "armscii8_bin", false],
71
+ [ 65, "ascii", "ascii_bin", false],
72
+ [ 66, "cp1250", "cp1250_bin", false],
73
+ [ 67, "cp1256", "cp1256_bin", false],
74
+ [ 68, "cp866", "cp866_bin", false],
75
+ [ 69, "dec8", "dec8_bin", false],
76
+ [ 70, "greek", "greek_bin", false],
77
+ [ 71, "hebrew", "hebrew_bin", false],
78
+ [ 72, "hp8", "hp8_bin", false],
79
+ [ 73, "keybcs2", "keybcs2_bin", false],
80
+ [ 74, "koi8r", "koi8r_bin", false],
81
+ [ 75, "koi8u", "koi8u_bin", false],
82
+ [ 77, "latin2", "latin2_bin", false],
83
+ [ 78, "latin5", "latin5_bin", false],
84
+ [ 79, "latin7", "latin7_bin", false],
85
+ [ 80, "cp850", "cp850_bin", false],
86
+ [ 81, "cp852", "cp852_bin", false],
87
+ [ 82, "swe7", "swe7_bin", false],
88
+ [ 83, "utf8", "utf8_bin", false],
89
+ [ 84, "big5", "big5_bin", false],
90
+ [ 85, "euckr", "euckr_bin", false],
91
+ [ 86, "gb2312", "gb2312_bin", false],
92
+ [ 87, "gbk", "gbk_bin", false],
93
+ [ 88, "sjis", "sjis_bin", false],
94
+ [ 89, "tis620", "tis620_bin", false],
95
+ [ 90, "ucs2", "ucs2_bin", false],
96
+ [ 91, "ujis", "ujis_bin", false],
97
+ [ 92, "geostd8", "geostd8_general_ci", true ],
98
+ [ 93, "geostd8", "geostd8_bin", false],
99
+ [ 94, "latin1", "latin1_spanish_ci", false],
100
+ [ 95, "cp932", "cp932_japanese_ci", true ],
101
+ [ 96, "cp932", "cp932_bin", false],
102
+ [ 97, "eucjpms", "eucjpms_japanese_ci", true ],
103
+ [ 98, "eucjpms", "eucjpms_bin", false],
104
+ [ 99, "cp1250", "cp1250_polish_ci", false],
105
+ [128, "ucs2", "ucs2_unicode_ci", false],
106
+ [129, "ucs2", "ucs2_icelandic_ci", false],
107
+ [130, "ucs2", "ucs2_latvian_ci", false],
108
+ [131, "ucs2", "ucs2_romanian_ci", false],
109
+ [132, "ucs2", "ucs2_slovenian_ci", false],
110
+ [133, "ucs2", "ucs2_polish_ci", false],
111
+ [134, "ucs2", "ucs2_estonian_ci", false],
112
+ [135, "ucs2", "ucs2_spanish_ci", false],
113
+ [136, "ucs2", "ucs2_swedish_ci", false],
114
+ [137, "ucs2", "ucs2_turkish_ci", false],
115
+ [138, "ucs2", "ucs2_czech_ci", false],
116
+ [139, "ucs2", "ucs2_danish_ci", false],
117
+ [140, "ucs2", "ucs2_lithuanian_ci", false],
118
+ [141, "ucs2", "ucs2_slovak_ci", false],
119
+ [142, "ucs2", "ucs2_spanish2_ci", false],
120
+ [143, "ucs2", "ucs2_roman_ci", false],
121
+ [144, "ucs2", "ucs2_persian_ci", false],
122
+ [145, "ucs2", "ucs2_esperanto_ci", false],
123
+ [146, "ucs2", "ucs2_hungarian_ci", false],
124
+ [192, "utf8", "utf8_unicode_ci", false],
125
+ [193, "utf8", "utf8_icelandic_ci", false],
126
+ [194, "utf8", "utf8_latvian_ci", false],
127
+ [195, "utf8", "utf8_romanian_ci", false],
128
+ [196, "utf8", "utf8_slovenian_ci", false],
129
+ [197, "utf8", "utf8_polish_ci", false],
130
+ [198, "utf8", "utf8_estonian_ci", false],
131
+ [199, "utf8", "utf8_spanish_ci", false],
132
+ [200, "utf8", "utf8_swedish_ci", false],
133
+ [201, "utf8", "utf8_turkish_ci", false],
134
+ [202, "utf8", "utf8_czech_ci", false],
135
+ [203, "utf8", "utf8_danish_ci", false],
136
+ [204, "utf8", "utf8_lithuanian_ci", false],
137
+ [205, "utf8", "utf8_slovak_ci", false],
138
+ [206, "utf8", "utf8_spanish2_ci", false],
139
+ [207, "utf8", "utf8_roman_ci", false],
140
+ [208, "utf8", "utf8_persian_ci", false],
141
+ [209, "utf8", "utf8_esperanto_ci", false],
142
+ [210, "utf8", "utf8_hungarian_ci", false],
143
+ [211, "utf8", "utf8_sinhala_ci", false],
144
+ [224, "utf8mb4", "utf8mb4_unicode_ci", false],
145
+ [225, "utf8mb4", "utf8mb4_icelandic_ci", false],
146
+ [226, "utf8mb4", "utf8mb4_latvian_ci", false],
147
+ [227, "utf8mb4", "utf8mb4_romanian_ci", false],
148
+ [228, "utf8mb4", "utf8mb4_slovenian_ci", false],
149
+ [229, "utf8mb4", "utf8mb4_polish_ci", false],
150
+ [230, "utf8mb4", "utf8mb4_estonian_ci", false],
151
+ [231, "utf8mb4", "utf8mb4_spanish_ci", false],
152
+ [232, "utf8mb4", "utf8mb4_swedish_ci", false],
153
+ [233, "utf8mb4", "utf8mb4_turkish_ci", false],
154
+ [234, "utf8mb4", "utf8mb4_czech_ci", false],
155
+ [235, "utf8mb4", "utf8mb4_danish_ci", false],
156
+ [236, "utf8mb4", "utf8mb4_lithuanian_ci", false],
157
+ [237, "utf8mb4", "utf8mb4_slovak_ci", false],
158
+ [238, "utf8mb4", "utf8mb4_spanish2_ci", false],
159
+ [239, "utf8mb4", "utf8mb4_roman_ci", false],
160
+ [240, "utf8mb4", "utf8mb4_persian_ci", false],
161
+ [241, "utf8mb4", "utf8mb4_esperanto_ci", false],
162
+ [242, "utf8mb4", "utf8mb4_hungarian_ci", false],
163
+ [243, "utf8mb4", "utf8mb4_sinhala_ci", false],
164
+ [254, "utf8", "utf8_general_cs", false],
165
+ ]
166
+
167
+ UNSAFE_CHARSET = [
168
+ "big5", "sjis", "filename", "gbk", "ucs2", "cp932",
169
+ ]
170
+
171
+ NUMBER_TO_CHARSET = {}
172
+ COLLATION_TO_CHARSET = {}
173
+ CHARSET_DEFAULT = {}
174
+ CHARSETS.each do |number, csname, clname, default|
175
+ cs = Charset.new number, csname, clname
176
+ cs.unsafe = true if UNSAFE_CHARSET.include? csname
177
+ NUMBER_TO_CHARSET[number] = cs
178
+ COLLATION_TO_CHARSET[clname] = cs
179
+ CHARSET_DEFAULT[csname] = cs if default
180
+ end
181
+
182
+ BINARY_CHARSET_NUMBER = CHARSET_DEFAULT['binary'].number
183
+
184
+ def self.by_number(n)
185
+ raise ClientError, "unknown charset number: #{n}" unless NUMBER_TO_CHARSET.key? n
186
+ NUMBER_TO_CHARSET[n]
187
+ end
188
+
189
+ def self.by_name(str)
190
+ ret = COLLATION_TO_CHARSET[str] || CHARSET_DEFAULT[str]
191
+ raise ClientError, "unknown charset: #{str}" unless ret
192
+ ret
193
+ end
194
+
195
+ if defined? Encoding
196
+
197
+ # MySQL Charset -> Ruby's Encodeing
198
+ CHARSET_ENCODING = {
199
+ "armscii8" => nil,
200
+ "ascii" => Encoding::US_ASCII,
201
+ "big5" => Encoding::Big5,
202
+ "binary" => Encoding::ASCII_8BIT,
203
+ "cp1250" => Encoding::Windows_1250,
204
+ "cp1251" => Encoding::Windows_1251,
205
+ "cp1256" => Encoding::Windows_1256,
206
+ "cp1257" => Encoding::Windows_1257,
207
+ "cp850" => Encoding::CP850,
208
+ "cp852" => Encoding::CP852,
209
+ "cp866" => Encoding::IBM866,
210
+ "cp932" => Encoding::Windows_31J,
211
+ "dec8" => nil,
212
+ "eucjpms" => Encoding::EucJP_ms,
213
+ "euckr" => Encoding::EUC_KR,
214
+ "gb2312" => Encoding::EUC_CN,
215
+ "gbk" => Encoding::GBK,
216
+ "geostd8" => nil,
217
+ "greek" => Encoding::ISO_8859_7,
218
+ "hebrew" => Encoding::ISO_8859_8,
219
+ "hp8" => nil,
220
+ "keybcs2" => nil,
221
+ "koi8r" => Encoding::KOI8_R,
222
+ "koi8u" => Encoding::KOI8_U,
223
+ "latin1" => Encoding::ISO_8859_1,
224
+ "latin2" => Encoding::ISO_8859_2,
225
+ "latin5" => Encoding::ISO_8859_9,
226
+ "latin7" => Encoding::ISO_8859_13,
227
+ "macce" => Encoding::MacCentEuro,
228
+ "macroman" => Encoding::MacRoman,
229
+ "sjis" => Encoding::SHIFT_JIS,
230
+ "swe7" => nil,
231
+ "tis620" => Encoding::TIS_620,
232
+ "ucs2" => Encoding::UTF_16BE,
233
+ "ujis" => Encoding::EucJP_ms,
234
+ "utf8" => Encoding::UTF_8,
235
+ "utf8mb4" => Encoding::UTF_8,
236
+ }
237
+
238
+ def self.to_binary(value)
239
+ value.force_encoding Encoding::ASCII_8BIT
240
+ end
241
+
242
+ # convert raw to encoding and convert to Encoding.default_internal
243
+ # === Argument
244
+ # raw :: [String]
245
+ # charset :: [Mysql::Charset]
246
+ # === Return
247
+ # result [String]
248
+ def self.convert_encoding(raw, encoding)
249
+ raw.force_encoding(encoding).encode
250
+ end
251
+
252
+ # retrun corresponding Ruby encoding
253
+ # === Return
254
+ # encoding [Encoding]
255
+ def encoding
256
+ enc = CHARSET_ENCODING[@name.downcase]
257
+ raise Mysql::ClientError, "unsupported charset: #{@name}" unless enc
258
+ enc
259
+ end
260
+
261
+ # convert encoding to corrensponding to MySQL charset
262
+ def convert(value)
263
+ if value.is_a? String and value.encoding != Encoding::ASCII_8BIT
264
+ value = value.encode encoding
265
+ end
266
+ value
267
+ end
268
+
269
+ else
270
+ # for Ruby 1.8
271
+
272
+ def self.to_binary(value)
273
+ value
274
+ end
275
+
276
+ def self.convert_encoding(raw, encoding)
277
+ raw
278
+ end
279
+
280
+ def encoding
281
+ nil
282
+ end
283
+
284
+ def convert(value)
285
+ value
286
+ end
287
+
288
+ end
289
+ end
290
+ end
@@ -0,0 +1,164 @@
1
+ # Copyright (C) 2003-2008 TOMITA Masahiro
2
+ # mailto:tommy@tmtm.org
3
+
4
+ class Mysql
5
+ # Command
6
+ COM_SLEEP = 0
7
+ COM_QUIT = 1
8
+ COM_INIT_DB = 2
9
+ COM_QUERY = 3
10
+ COM_FIELD_LIST = 4
11
+ COM_CREATE_DB = 5
12
+ COM_DROP_DB = 6
13
+ COM_REFRESH = 7
14
+ COM_SHUTDOWN = 8
15
+ COM_STATISTICS = 9
16
+ COM_PROCESS_INFO = 10
17
+ COM_CONNECT = 11
18
+ COM_PROCESS_KILL = 12
19
+ COM_DEBUG = 13
20
+ COM_PING = 14
21
+ COM_TIME = 15
22
+ COM_DELAYED_INSERT = 16
23
+ COM_CHANGE_USER = 17
24
+ COM_BINLOG_DUMP = 18
25
+ COM_TABLE_DUMP = 19
26
+ COM_CONNECT_OUT = 20
27
+ COM_REGISTER_SLAVE = 21
28
+ COM_STMT_PREPARE = 22
29
+ COM_STMT_EXECUTE = 23
30
+ COM_STMT_SEND_LONG_DATA = 24
31
+ COM_STMT_CLOSE = 25
32
+ COM_STMT_RESET = 26
33
+ COM_SET_OPTION = 27
34
+ COM_STMT_FETCH = 28
35
+
36
+ # Client flag
37
+ CLIENT_LONG_PASSWORD = 1 # new more secure passwords
38
+ CLIENT_FOUND_ROWS = 1 << 1 # Found instead of affected rows
39
+ CLIENT_LONG_FLAG = 1 << 2 # Get all column flags
40
+ CLIENT_CONNECT_WITH_DB = 1 << 3 # One can specify db on connect
41
+ CLIENT_NO_SCHEMA = 1 << 4 # Don't allow database.table.column
42
+ CLIENT_COMPRESS = 1 << 5 # Can use compression protocol
43
+ CLIENT_ODBC = 1 << 6 # Odbc client
44
+ CLIENT_LOCAL_FILES = 1 << 7 # Can use LOAD DATA LOCAL
45
+ CLIENT_IGNORE_SPACE = 1 << 8 # Ignore spaces before '('
46
+ CLIENT_PROTOCOL_41 = 1 << 9 # New 4.1 protocol
47
+ CLIENT_INTERACTIVE = 1 << 10 # This is an interactive client
48
+ CLIENT_SSL = 1 << 11 # Switch to SSL after handshake
49
+ CLIENT_IGNORE_SIGPIPE = 1 << 12 # IGNORE sigpipes
50
+ CLIENT_TRANSACTIONS = 1 << 13 # Client knows about transactions
51
+ CLIENT_RESERVED = 1 << 14 # Old flag for 4.1 protocol
52
+ CLIENT_SECURE_CONNECTION = 1 << 15 # New 4.1 authentication
53
+ CLIENT_MULTI_STATEMENTS = 1 << 16 # Enable/disable multi-stmt support
54
+ CLIENT_MULTI_RESULTS = 1 << 17 # Enable/disable multi-results
55
+
56
+ # Connection Option
57
+ OPT_CONNECT_TIMEOUT = 0
58
+ OPT_COMPRESS = 1
59
+ OPT_NAMED_PIPE = 2
60
+ INIT_COMMAND = 3
61
+ READ_DEFAULT_FILE = 4
62
+ READ_DEFAULT_GROUP = 5
63
+ SET_CHARSET_DIR = 6
64
+ SET_CHARSET_NAME = 7
65
+ OPT_LOCAL_INFILE = 8
66
+ OPT_PROTOCOL = 9
67
+ SHARED_MEMORY_BASE_NAME = 10
68
+ OPT_READ_TIMEOUT = 11
69
+ OPT_WRITE_TIMEOUT = 12
70
+ OPT_USE_RESULT = 13
71
+ OPT_USE_REMOTE_CONNECTION = 14
72
+ OPT_USE_EMBEDDED_CONNECTION = 15
73
+ OPT_GUESS_CONNECTION = 16
74
+ SET_CLIENT_IP = 17
75
+ SECURE_AUTH = 18
76
+ REPORT_DATA_TRUNCATION = 19
77
+ OPT_RECONNECT = 20
78
+ OPT_SSL_VERIFY_SERVER_CERT = 21
79
+
80
+ # Server Option
81
+ OPTION_MULTI_STATEMENTS_ON = 0
82
+ OPTION_MULTI_STATEMENTS_OFF = 1
83
+
84
+ # Server Status
85
+ SERVER_STATUS_IN_TRANS = 1
86
+ SERVER_STATUS_AUTOCOMMIT = 1 << 1
87
+ SERVER_MORE_RESULTS_EXISTS = 1 << 3
88
+ SERVER_QUERY_NO_GOOD_INDEX_USED = 1 << 4
89
+ SERVER_QUERY_NO_INDEX_USED = 1 << 5
90
+ SERVER_STATUS_CURSOR_EXISTS = 1 << 6
91
+ SERVER_STATUS_LAST_ROW_SENT = 1 << 7
92
+ SERVER_STATUS_DB_DROPPED = 1 << 8
93
+ SERVER_STATUS_NO_BACKSLASH_ESCAPES = 1 << 9
94
+
95
+ # Refresh parameter
96
+ REFRESH_GRANT = 1
97
+ REFRESH_LOG = 1 << 1
98
+ REFRESH_TABLES = 1 << 2
99
+ REFRESH_HOSTS = 1 << 3
100
+ REFRESH_STATUS = 1 << 4
101
+ REFRESH_THREADS = 1 << 5
102
+ REFRESH_SLAVE = 1 << 6
103
+ REFRESH_MASTER = 1 << 7
104
+ REFRESH_READ_LOCK = 1 << 14
105
+ REFRESH_FAST = 1 << 15
106
+
107
+ class Field
108
+ # Field type
109
+ TYPE_DECIMAL = 0
110
+ TYPE_TINY = 1
111
+ TYPE_SHORT = 2
112
+ TYPE_LONG = 3
113
+ TYPE_FLOAT = 4
114
+ TYPE_DOUBLE = 5
115
+ TYPE_NULL = 6
116
+ TYPE_TIMESTAMP = 7
117
+ TYPE_LONGLONG = 8
118
+ TYPE_INT24 = 9
119
+ TYPE_DATE = 10
120
+ TYPE_TIME = 11
121
+ TYPE_DATETIME = 12
122
+ TYPE_YEAR = 13
123
+ TYPE_NEWDATE = 14
124
+ TYPE_VARCHAR = 15
125
+ TYPE_BIT = 16
126
+ TYPE_NEWDECIMAL = 246
127
+ TYPE_ENUM = 247
128
+ TYPE_SET = 248
129
+ TYPE_TINY_BLOB = 249
130
+ TYPE_MEDIUM_BLOB = 250
131
+ TYPE_LONG_BLOB = 251
132
+ TYPE_BLOB = 252
133
+ TYPE_VAR_STRING = 253
134
+ TYPE_STRING = 254
135
+ TYPE_GEOMETRY = 255
136
+ TYPE_CHAR = TYPE_TINY
137
+ TYPE_INTERVAL = TYPE_ENUM
138
+
139
+ # Flag
140
+ NOT_NULL_FLAG = 1
141
+ PRI_KEY_FLAG = 2
142
+ UNIQUE_KEY_FLAG = 4
143
+ MULTIPLE_KEY_FLAG = 8
144
+ BLOB_FLAG = 16
145
+ UNSIGNED_FLAG = 32
146
+ ZEROFILL_FLAG = 64
147
+ BINARY_FLAG = 128
148
+ ENUM_FLAG = 256
149
+ AUTO_INCREMENT_FLAG = 512
150
+ TIMESTAMP_FLAG = 1024
151
+ SET_FLAG = 2048
152
+ NUM_FLAG = 32768
153
+ PART_KEY_FLAG = 16384
154
+ GROUP_FLAG = 32768
155
+ UNIQUE_FLAG = 65536
156
+ BINCMP_FLAG = 131072
157
+ end
158
+
159
+ class Stmt
160
+ # Cursor type
161
+ CURSOR_TYPE_NO_CURSOR = 0
162
+ CURSOR_TYPE_READ_ONLY = 1
163
+ end
164
+ end