mysql2/lib/mysql2/client.rb
Brian Lopez cebf9af068 Wrap the MYSQL* again so we can:
1) let mysql_init/mysql_close take care of any/all allocation, thread state and freeing
2) for faster access to the encoding and active state variables for the connection
2010-08-16 02:03:19 -07:00

228 lines
12 KiB
Ruby

module Mysql2
class Client
attr_reader :query_options
@@default_query_options = {
:as => :hash,
:async => false,
:cast_booleans => false,
:symbolize_keys => false,
:database_timezone => :local, # timezone Mysql2 will assume datetime objects are stored in
:application_timezone => nil # timezone Mysql2 will convert to before handing the object back to the caller
}
def initialize(opts = {})
@query_options = @@default_query_options.dup
init_connection
[:reconnect, :connect_timeout].each do |key|
next unless opts.key?(key)
send(:"#{key}=", opts[key])
end
# force the encoding to utf8
self.charset_name = opts[:encoding] || 'utf8'
ssl_set(*opts.values_at(:sslkey, :sslcert, :sslca, :sslcapath, :sslciper))
user = opts[:username]
pass = opts[:password]
host = opts[:host] || 'localhost'
port = opts[:port] || 3306
database = opts[:database]
socket = opts[:socket]
connect user, pass, host, port, database, socket
end
def self.default_query_options
@@default_query_options
end
# NOTE: from ruby-mysql
if defined? Encoding
CHARSET_MAP = {
"armscii8" => nil,
"ascii" => Encoding::US_ASCII,
"big5" => Encoding::Big5,
"binary" => Encoding::ASCII_8BIT,
"cp1250" => Encoding::Windows_1250,
"cp1251" => Encoding::Windows_1251,
"cp1256" => Encoding::Windows_1256,
"cp1257" => Encoding::Windows_1257,
"cp850" => Encoding::CP850,
"cp852" => Encoding::CP852,
"cp866" => Encoding::IBM866,
"cp932" => Encoding::Windows_31J,
"dec8" => nil,
"eucjpms" => Encoding::EucJP_ms,
"euckr" => Encoding::EUC_KR,
"gb2312" => Encoding::EUC_CN,
"gbk" => Encoding::GBK,
"geostd8" => nil,
"greek" => Encoding::ISO_8859_7,
"hebrew" => Encoding::ISO_8859_8,
"hp8" => nil,
"keybcs2" => nil,
"koi8r" => Encoding::KOI8_R,
"koi8u" => Encoding::KOI8_U,
"latin1" => Encoding::ISO_8859_1,
"latin2" => Encoding::ISO_8859_2,
"latin5" => Encoding::ISO_8859_9,
"latin7" => Encoding::ISO_8859_13,
"macce" => Encoding::MacCentEuro,
"macroman" => Encoding::MacRoman,
"sjis" => Encoding::SHIFT_JIS,
"swe7" => nil,
"tis620" => Encoding::TIS_620,
"ucs2" => Encoding::UTF_16BE,
"ujis" => Encoding::EucJP_ms,
"utf8" => Encoding::UTF_8,
}
MYSQL_CHARSET_MAP = {
1 => {:name => "big5", :collation => "big5_chinese_ci"},
2 => {:name => "latin2", :collation => "latin2_czech_cs"},
3 => {:name => "dec8", :collation => "dec8_swedish_ci"},
4 => {:name => "cp850", :collation => "cp850_general_ci"},
5 => {:name => "latin1", :collation => "latin1_german1_ci"},
6 => {:name => "hp8", :collation => "hp8_english_ci"},
7 => {:name => "koi8r", :collation => "koi8r_general_ci"},
8 => {:name => "latin1", :collation => "latin1_swedish_ci"},
9 => {:name => "latin2", :collation => "latin2_general_ci"},
10 => {:name => "swe7", :collation => "swe7_swedish_ci"},
11 => {:name => "ascii", :collation => "ascii_general_ci"},
12 => {:name => "ujis", :collation => "ujis_japanese_ci"},
13 => {:name => "sjis", :collation => "sjis_japanese_ci"},
14 => {:name => "cp1251", :collation => "cp1251_bulgarian_ci"},
15 => {:name => "latin1", :collation => "latin1_danish_ci"},
16 => {:name => "hebrew", :collation => "hebrew_general_ci"},
17 => {:name => "filename", :collation => "filename"},
18 => {:name => "tis620", :collation => "tis620_thai_ci"},
19 => {:name => "euckr", :collation => "euckr_korean_ci"},
20 => {:name => "latin7", :collation => "latin7_estonian_cs"},
21 => {:name => "latin2", :collation => "latin2_hungarian_ci"},
22 => {:name => "koi8u", :collation => "koi8u_general_ci"},
23 => {:name => "cp1251", :collation => "cp1251_ukrainian_ci"},
24 => {:name => "gb2312", :collation => "gb2312_chinese_ci"},
25 => {:name => "greek", :collation => "greek_general_ci"},
26 => {:name => "cp1250", :collation => "cp1250_general_ci"},
27 => {:name => "latin2", :collation => "latin2_croatian_ci"},
28 => {:name => "gbk", :collation => "gbk_chinese_ci"},
29 => {:name => "cp1257", :collation => "cp1257_lithuanian_ci"},
30 => {:name => "latin5", :collation => "latin5_turkish_ci"},
31 => {:name => "latin1", :collation => "latin1_german2_ci"},
32 => {:name => "armscii8", :collation => "armscii8_general_ci"},
33 => {:name => "utf8", :collation => "utf8_general_ci"},
34 => {:name => "cp1250", :collation => "cp1250_czech_cs"},
35 => {:name => "ucs2", :collation => "ucs2_general_ci"},
36 => {:name => "cp866", :collation => "cp866_general_ci"},
37 => {:name => "keybcs2", :collation => "keybcs2_general_ci"},
38 => {:name => "macce", :collation => "macce_general_ci"},
39 => {:name => "macroman", :collation => "macroman_general_ci"},
40 => {:name => "cp852", :collation => "cp852_general_ci"},
41 => {:name => "latin7", :collation => "latin7_general_ci"},
42 => {:name => "latin7", :collation => "latin7_general_cs"},
43 => {:name => "macce", :collation => "macce_bin"},
44 => {:name => "cp1250", :collation => "cp1250_croatian_ci"},
47 => {:name => "latin1", :collation => "latin1_bin"},
48 => {:name => "latin1", :collation => "latin1_general_ci"},
49 => {:name => "latin1", :collation => "latin1_general_cs"},
50 => {:name => "cp1251", :collation => "cp1251_bin"},
51 => {:name => "cp1251", :collation => "cp1251_general_ci"},
52 => {:name => "cp1251", :collation => "cp1251_general_cs"},
53 => {:name => "macroman", :collation => "macroman_bin"},
57 => {:name => "cp1256", :collation => "cp1256_general_ci"},
58 => {:name => "cp1257", :collation => "cp1257_bin"},
59 => {:name => "cp1257", :collation => "cp1257_general_ci"},
63 => {:name => "binary", :collation => "binary"},
64 => {:name => "armscii8", :collation => "armscii8_bin"},
65 => {:name => "ascii", :collation => "ascii_bin"},
66 => {:name => "cp1250", :collation => "cp1250_bin"},
67 => {:name => "cp1256", :collation => "cp1256_bin"},
68 => {:name => "cp866", :collation => "cp866_bin"},
69 => {:name => "dec8", :collation => "dec8_bin"},
70 => {:name => "greek", :collation => "greek_bin"},
71 => {:name => "hebrew", :collation => "hebrew_bin"},
72 => {:name => "hp8", :collation => "hp8_bin"},
73 => {:name => "keybcs2", :collation => "keybcs2_bin"},
74 => {:name => "koi8r", :collation => "koi8r_bin"},
75 => {:name => "koi8u", :collation => "koi8u_bin"},
77 => {:name => "latin2", :collation => "latin2_bin"},
78 => {:name => "latin5", :collation => "latin5_bin"},
79 => {:name => "latin7", :collation => "latin7_bin"},
80 => {:name => "cp850", :collation => "cp850_bin"},
81 => {:name => "cp852", :collation => "cp852_bin"},
82 => {:name => "swe7", :collation => "swe7_bin"},
83 => {:name => "utf8", :collation => "utf8_bin"},
84 => {:name => "big5", :collation => "big5_bin"},
85 => {:name => "euckr", :collation => "euckr_bin"},
86 => {:name => "gb2312", :collation => "gb2312_bin"},
87 => {:name => "gbk", :collation => "gbk_bin"},
88 => {:name => "sjis", :collation => "sjis_bin"},
89 => {:name => "tis620", :collation => "tis620_bin"},
90 => {:name => "ucs2", :collation => "ucs2_bin"},
91 => {:name => "ujis", :collation => "ujis_bin"},
92 => {:name => "geostd8", :collation => "geostd8_general_ci"},
93 => {:name => "geostd8", :collation => "geostd8_bin"},
94 => {:name => "latin1", :collation => "latin1_spanish_ci"},
95 => {:name => "cp932", :collation => "cp932_japanese_ci"},
96 => {:name => "cp932", :collation => "cp932_bin"},
97 => {:name => "eucjpms", :collation => "eucjpms_japanese_ci"},
98 => {:name => "eucjpms", :collation => "eucjpms_bin"},
99 => {:name => "cp1250", :collation => "cp1250_polish_ci"},
128 => {:name => "ucs2", :collation => "ucs2_unicode_ci"},
129 => {:name => "ucs2", :collation => "ucs2_icelandic_ci"},
130 => {:name => "ucs2", :collation => "ucs2_latvian_ci"},
131 => {:name => "ucs2", :collation => "ucs2_romanian_ci"},
132 => {:name => "ucs2", :collation => "ucs2_slovenian_ci"},
133 => {:name => "ucs2", :collation => "ucs2_polish_ci"},
134 => {:name => "ucs2", :collation => "ucs2_estonian_ci"},
135 => {:name => "ucs2", :collation => "ucs2_spanish_ci"},
136 => {:name => "ucs2", :collation => "ucs2_swedish_ci"},
137 => {:name => "ucs2", :collation => "ucs2_turkish_ci"},
138 => {:name => "ucs2", :collation => "ucs2_czech_ci"},
139 => {:name => "ucs2", :collation => "ucs2_danish_ci"},
140 => {:name => "ucs2", :collation => "ucs2_lithuanian_ci"},
141 => {:name => "ucs2", :collation => "ucs2_slovak_ci"},
142 => {:name => "ucs2", :collation => "ucs2_spanish2_ci"},
143 => {:name => "ucs2", :collation => "ucs2_roman_ci"},
144 => {:name => "ucs2", :collation => "ucs2_persian_ci"},
145 => {:name => "ucs2", :collation => "ucs2_esperanto_ci"},
146 => {:name => "ucs2", :collation => "ucs2_hungarian_ci"},
192 => {:name => "utf8", :collation => "utf8_unicode_ci"},
193 => {:name => "utf8", :collation => "utf8_icelandic_ci"},
194 => {:name => "utf8", :collation => "utf8_latvian_ci"},
195 => {:name => "utf8", :collation => "utf8_romanian_ci"},
196 => {:name => "utf8", :collation => "utf8_slovenian_ci"},
197 => {:name => "utf8", :collation => "utf8_polish_ci"},
198 => {:name => "utf8", :collation => "utf8_estonian_ci"},
199 => {:name => "utf8", :collation => "utf8_spanish_ci"},
200 => {:name => "utf8", :collation => "utf8_swedish_ci"},
201 => {:name => "utf8", :collation => "utf8_turkish_ci"},
202 => {:name => "utf8", :collation => "utf8_czech_ci"},
203 => {:name => "utf8", :collation => "utf8_danish_ci"},
204 => {:name => "utf8", :collation => "utf8_lithuanian_ci"},
205 => {:name => "utf8", :collation => "utf8_slovak_ci"},
206 => {:name => "utf8", :collation => "utf8_spanish2_ci"},
207 => {:name => "utf8", :collation => "utf8_roman_ci"},
208 => {:name => "utf8", :collation => "utf8_persian_ci"},
209 => {:name => "utf8", :collation => "utf8_esperanto_ci"},
210 => {:name => "utf8", :collation => "utf8_hungarian_ci"},
254 => {:name => "utf8", :collation => "utf8_general_cs"}
}
def self.encoding_from_charset(charset)
CHARSET_MAP[charset.to_s.downcase]
end
def self.encoding_from_charset_code(code)
if mapping = MYSQL_CHARSET_MAP[code]
encoding_from_charset(mapping[:name])
else
nil
end
end
end
end
end