Skip to content

Commit 83c1cea

Browse files
committed
Handle all values in GetBytesPerCharacter. Fixes #337
1 parent 934c728 commit 83c1cea

File tree

3 files changed

+301
-13
lines changed

3 files changed

+301
-13
lines changed

src/MySqlConnector/AssemblyInfo.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
using System.Runtime.CompilerServices;
1+
using System.Runtime.CompilerServices;
22

33
[assembly: InternalsVisibleTo("MySqlConnector.Tests")]
4+
[assembly: InternalsVisibleTo("SideBySide")]

src/MySqlConnector/Serialization/SerializationUtility.cs

Lines changed: 266 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,288 @@ public static void WriteUInt32(uint value, byte[] buffer, int offset, int count)
2424

2525
public static int GetBytesPerCharacter(CharacterSet characterSet)
2626
{
27-
// not an exhaustive mapping, but should cover commonly-used character sets
2827
switch (characterSet)
2928
{
30-
case CharacterSet.Utf16Binary:
31-
case CharacterSet.Utf16GeneralCaseInsensitive:
32-
case CharacterSet.Utf16UnicodeCaseInsensitive:
33-
case CharacterSet.Utf16leBinary:
29+
case CharacterSet.Latin2CzechCaseSensitive:
30+
case CharacterSet.Dec8SwedishCaseInsensitive:
31+
case CharacterSet.Cp850GeneralCaseInsensitive:
32+
case CharacterSet.Latin1German1CaseInsensitive:
33+
case CharacterSet.Hp8EnglishCaseInsensitive:
34+
case CharacterSet.Koi8rGeneralCaseInsensitive:
35+
case CharacterSet.Latin1SwedishCaseInsensitive:
36+
case CharacterSet.Latin2GeneralCaseInsensitive:
37+
case CharacterSet.Swe7SwedishCaseInsensitive:
38+
case CharacterSet.AsciiGeneralCaseInsensitive:
39+
case CharacterSet.Cp1251BulgarianCaseInsensitive:
40+
case CharacterSet.Latin1DanishCaseInsensitive:
41+
case CharacterSet.HebrewGeneralCaseInsensitive:
42+
case CharacterSet.Tis620ThaiCaseInsensitive:
43+
case CharacterSet.Latin7EstonianCaseSensitive:
44+
case CharacterSet.Latin2HungarianCaseInsensitive:
45+
case CharacterSet.Koi8uGeneralCaseInsensitive:
46+
case CharacterSet.Cp1251UkrainianCaseInsensitive:
47+
case CharacterSet.GreekGeneralCaseInsensitive:
48+
case CharacterSet.Cp1250GeneralCaseInsensitive:
49+
case CharacterSet.Latin2CroatianCaseInsensitive:
50+
case CharacterSet.Cp1257LithuanianCaseInsensitive:
51+
case CharacterSet.Latin5TurkishCaseInsensitive:
52+
case CharacterSet.Latin1German2CaseInsensitive:
53+
case CharacterSet.Armscii8GeneralCaseInsensitive:
54+
case CharacterSet.Cp1250CzechCaseSensitive:
55+
case CharacterSet.Cp866GeneralCaseInsensitive:
56+
case CharacterSet.Keybcs2GeneralCaseInsensitive:
57+
case CharacterSet.MacceGeneralCaseInsensitive:
58+
case CharacterSet.MacromanGeneralCaseInsensitive:
59+
case CharacterSet.Cp852GeneralCaseInsensitive:
60+
case CharacterSet.Latin7GeneralCaseInsensitive:
61+
case CharacterSet.Latin7GeneralCaseSensitive:
62+
case CharacterSet.MacceBinary:
63+
case CharacterSet.Cp1250CroatianCaseInsensitive:
64+
case CharacterSet.Latin1Binary:
65+
case CharacterSet.Latin1GeneralCaseInsensitive:
66+
case CharacterSet.Latin1GeneralCaseSensitive:
67+
case CharacterSet.Cp1251Binary:
68+
case CharacterSet.Cp1251GeneralCaseInsensitive:
69+
case CharacterSet.Cp1251GeneralCaseSensitive:
70+
case CharacterSet.MacromanBinary:
71+
case CharacterSet.Cp1256GeneralCaseInsensitive:
72+
case CharacterSet.Cp1257Binary:
73+
case CharacterSet.Cp1257GeneralCaseInsensitive:
74+
case CharacterSet.Binary:
75+
case CharacterSet.Armscii8Binary:
76+
case CharacterSet.AsciiBinary:
77+
case CharacterSet.Cp1250Binary:
78+
case CharacterSet.Cp1256Binary:
79+
case CharacterSet.Cp866Binary:
80+
case CharacterSet.Dec8Binary:
81+
case CharacterSet.GreekBinary:
82+
case CharacterSet.HebrewBinary:
83+
case CharacterSet.Hp8Binary:
84+
case CharacterSet.Keybcs2Binary:
85+
case CharacterSet.Koi8rBinary:
86+
case CharacterSet.Koi8uBinary:
87+
case CharacterSet.Latin2Binary:
88+
case CharacterSet.Latin5Binary:
89+
case CharacterSet.Latin7Binary:
90+
case CharacterSet.Cp850Binary:
91+
case CharacterSet.Cp852Binary:
92+
case CharacterSet.Swe7Binary:
93+
case CharacterSet.Tis620Binary:
94+
case CharacterSet.Geostd8GeneralCaseInsensitive:
95+
case CharacterSet.Geostd8Binary:
96+
case CharacterSet.Latin1SpanishCaseInsensitive:
97+
case CharacterSet.Cp1250PolishCaseInsensitive:
98+
return 1;
99+
100+
case CharacterSet.Big5ChineseCaseInsensitive:
101+
case CharacterSet.SjisJapaneseCaseInsensitive:
102+
case CharacterSet.EuckrKoreanCaseInsensitive:
103+
case CharacterSet.Gb2312ChineseCaseInsensitive:
104+
case CharacterSet.GbkChineseCaseInsensitive:
105+
case CharacterSet.Ucs2GeneralCaseInsensitive:
106+
case CharacterSet.Big5Binary:
107+
case CharacterSet.EuckrBinary:
108+
case CharacterSet.Gb2312Binary:
109+
case CharacterSet.GbkBinary:
110+
case CharacterSet.SjisBinary:
111+
case CharacterSet.Ucs2Binary:
112+
case CharacterSet.Cp932JapaneseCaseInsensitive:
113+
case CharacterSet.Cp932Binary:
114+
case CharacterSet.Ucs2UnicodeCaseInsensitive:
115+
case CharacterSet.Ucs2IcelandicCaseInsensitive:
116+
case CharacterSet.Ucs2LatvianCaseInsensitive:
117+
case CharacterSet.Ucs2RomanianCaseInsensitive:
118+
case CharacterSet.Ucs2SlovenianCaseInsensitive:
119+
case CharacterSet.Ucs2PolishCaseInsensitive:
120+
case CharacterSet.Ucs2EstonianCaseInsensitive:
121+
case CharacterSet.Ucs2SpanishCaseInsensitive:
122+
case CharacterSet.Ucs2SwedishCaseInsensitive:
123+
case CharacterSet.Ucs2TurkishCaseInsensitive:
124+
case CharacterSet.Ucs2CzechCaseInsensitive:
125+
case CharacterSet.Ucs2DanishCaseInsensitive:
126+
case CharacterSet.Ucs2LithuanianCaseInsensitive:
127+
case CharacterSet.Ucs2SlovakCaseInsensitive:
128+
case CharacterSet.Ucs2Spanish2CaseInsensitive:
129+
case CharacterSet.Ucs2RomanCaseInsensitive:
130+
case CharacterSet.Ucs2PersianCaseInsensitive:
131+
case CharacterSet.Ucs2EsperantoCaseInsensitive:
132+
case CharacterSet.Ucs2HungarianCaseInsensitive:
133+
case CharacterSet.Ucs2SinhalaCaseInsensitive:
134+
case CharacterSet.Ucs2German2CaseInsensitive:
135+
case CharacterSet.Ucs2CroatianCaseInsensitive:
136+
case CharacterSet.Ucs2Unicode520CaseInsensitive:
137+
case CharacterSet.Ucs2VietnameseCaseInsensitive:
138+
case CharacterSet.Ucs2GeneralMySql500CaseInsensitive:
34139
return 2;
35140

36-
case CharacterSet.Utf8Binary:
141+
case CharacterSet.UjisJapaneseCaseInsensitive:
37142
case CharacterSet.Utf8GeneralCaseInsensitive:
143+
case CharacterSet.Utf8ToLowerCaseInsensitive:
144+
case CharacterSet.Utf8Binary:
145+
case CharacterSet.UjisBinary:
146+
case CharacterSet.EucjpmsJapaneseCaseInsensitive:
147+
case CharacterSet.EucjpmsBinary:
38148
case CharacterSet.Utf8UnicodeCaseInsensitive:
149+
case CharacterSet.Utf8IcelandicCaseInsensitive:
150+
case CharacterSet.Utf8LatvianCaseInsensitive:
151+
case CharacterSet.Utf8RomanianCaseInsensitive:
152+
case CharacterSet.Utf8SlovenianCaseInsensitive:
153+
case CharacterSet.Utf8PolishCaseInsensitive:
154+
case CharacterSet.Utf8EstonianCaseInsensitive:
155+
case CharacterSet.Utf8SpanishCaseInsensitive:
156+
case CharacterSet.Utf8SwedishCaseInsensitive:
157+
case CharacterSet.Utf8TurkishCaseInsensitive:
158+
case CharacterSet.Utf8CzechCaseInsensitive:
159+
case CharacterSet.Utf8DanishCaseInsensitive:
160+
case CharacterSet.Utf8LithuanianCaseInsensitive:
161+
case CharacterSet.Utf8SlovakCaseInsensitive:
162+
case CharacterSet.Utf8Spanish2CaseInsensitive:
163+
case CharacterSet.Utf8RomanCaseInsensitive:
164+
case CharacterSet.Utf8PersianCaseInsensitive:
165+
case CharacterSet.Utf8EsperantoCaseInsensitive:
166+
case CharacterSet.Utf8HungarianCaseInsensitive:
167+
case CharacterSet.Utf8SinhalaCaseInsensitive:
168+
case CharacterSet.Utf8German2CaseInsensitive:
169+
case CharacterSet.Utf8CroatianCaseInsensitive:
170+
case CharacterSet.Utf8Unicode520CaseInsensitive:
171+
case CharacterSet.Utf8VietnameseCaseInsensitive:
172+
case CharacterSet.Utf8GeneralMySql500CaseInsensitive:
39173
return 3;
40174

41-
case CharacterSet.Utf8Mb4Binary:
42175
case CharacterSet.Utf8Mb4GeneralCaseInsensitive:
176+
case CharacterSet.Utf8Mb4Binary:
177+
case CharacterSet.Utf16GeneralCaseInsensitive:
178+
case CharacterSet.Utf16Binary:
179+
case CharacterSet.Utf16leGeneralCaseInsensitive:
180+
case CharacterSet.Utf32GeneralCaseInsensitive:
181+
case CharacterSet.Utf32Binary:
182+
case CharacterSet.Utf16leBinary:
183+
case CharacterSet.Utf16UnicodeCaseInsensitive:
184+
case CharacterSet.Utf16IcelandicCaseInsensitive:
185+
case CharacterSet.Utf16LatvianCaseInsensitive:
186+
case CharacterSet.Utf16RomanianCaseInsensitive:
187+
case CharacterSet.Utf16SlovenianCaseInsensitive:
188+
case CharacterSet.Utf16PolishCaseInsensitive:
189+
case CharacterSet.Utf16EstonianCaseInsensitive:
190+
case CharacterSet.Utf16SpanishCaseInsensitive:
191+
case CharacterSet.Utf16SwedishCaseInsensitive:
192+
case CharacterSet.Utf16TurkishCaseInsensitive:
193+
case CharacterSet.Utf16CzechCaseInsensitive:
194+
case CharacterSet.Utf16DanishCaseInsensitive:
195+
case CharacterSet.Utf16LithuanianCaseInsensitive:
196+
case CharacterSet.Utf16SlovakCaseInsensitive:
197+
case CharacterSet.Utf16Spanish2CaseInsensitive:
198+
case CharacterSet.Utf16RomanCaseInsensitive:
199+
case CharacterSet.Utf16PersianCaseInsensitive:
200+
case CharacterSet.Utf16EsperantoCaseInsensitive:
201+
case CharacterSet.Utf16HungarianCaseInsensitive:
202+
case CharacterSet.Utf16SinhalaCaseInsensitive:
203+
case CharacterSet.Utf16German2CaseInsensitive:
204+
case CharacterSet.Utf16CroatianCaseInsensitive:
205+
case CharacterSet.Utf16Unicode520CaseInsensitive:
206+
case CharacterSet.Utf16VietnameseCaseInsensitive:
207+
case CharacterSet.Utf32UnicodeCaseInsensitive:
208+
case CharacterSet.Utf32IcelandicCaseInsensitive:
209+
case CharacterSet.Utf32LatvianCaseInsensitive:
210+
case CharacterSet.Utf32RomanianCaseInsensitive:
211+
case CharacterSet.Utf32SlovenianCaseInsensitive:
212+
case CharacterSet.Utf32PolishCaseInsensitive:
213+
case CharacterSet.Utf32EstonianCaseInsensitive:
214+
case CharacterSet.Utf32SpanishCaseInsensitive:
215+
case CharacterSet.Utf32SwedishCaseInsensitive:
216+
case CharacterSet.Utf32TurkishCaseInsensitive:
217+
case CharacterSet.Utf32CzechCaseInsensitive:
218+
case CharacterSet.Utf32DanishCaseInsensitive:
219+
case CharacterSet.Utf32LithuanianCaseInsensitive:
220+
case CharacterSet.Utf32SlovakCaseInsensitive:
221+
case CharacterSet.Utf32Spanish2CaseInsensitive:
222+
case CharacterSet.Utf32RomanCaseInsensitive:
223+
case CharacterSet.Utf32PersianCaseInsensitive:
224+
case CharacterSet.Utf32EsperantoCaseInsensitive:
225+
case CharacterSet.Utf32HungarianCaseInsensitive:
226+
case CharacterSet.Utf32SinhalaCaseInsensitive:
227+
case CharacterSet.Utf32German2CaseInsensitive:
228+
case CharacterSet.Utf32CroatianCaseInsensitive:
229+
case CharacterSet.Utf32Unicode520CaseInsensitive:
230+
case CharacterSet.Utf32VietnameseCaseInsensitive:
43231
case CharacterSet.Utf8Mb4UnicodeCaseInsensitive:
232+
case CharacterSet.Utf8Mb4IcelandicCaseInsensitive:
233+
case CharacterSet.Utf8Mb4LatvianCaseInsensitive:
234+
case CharacterSet.Utf8Mb4RomanianCaseInsensitive:
235+
case CharacterSet.Utf8Mb4SlovenianCaseInsensitive:
236+
case CharacterSet.Utf8Mb4PolishCaseInsensitive:
237+
case CharacterSet.Utf8Mb4EstonianCaseInsensitive:
238+
case CharacterSet.Utf8Mb4SpanishCaseInsensitive:
239+
case CharacterSet.Utf8Mb4SwedishCaseInsensitive:
240+
case CharacterSet.Utf8Mb4TurkishCaseInsensitive:
241+
case CharacterSet.Utf8Mb4CzechCaseInsensitive:
242+
case CharacterSet.Utf8Mb4DanishCaseInsensitive:
243+
case CharacterSet.Utf8Mb4LithuanianCaseInsensitive:
244+
case CharacterSet.Utf8Mb4SlovakCaseInsensitive:
245+
case CharacterSet.Utf8Mb4Spanish2CaseInsensitive:
246+
case CharacterSet.Utf8Mb4RomanCaseInsensitive:
247+
case CharacterSet.Utf8Mb4PersianCaseInsensitive:
248+
case CharacterSet.Utf8Mb4EsperantoCaseInsensitive:
249+
case CharacterSet.Utf8Mb4HungarianCaseInsensitive:
250+
case CharacterSet.Utf8Mb4SinhalaCaseInsensitive:
251+
case CharacterSet.Utf8Mb4German2CaseInsensitive:
252+
case CharacterSet.Utf8Mb4CroatianCaseInsensitive:
44253
case CharacterSet.Utf8Mb4Unicode520CaseInsensitive:
254+
case CharacterSet.Utf8Mb4VietnameseCaseInsensitive:
255+
case CharacterSet.Gb18030ChineseCaseInsensitive:
256+
case CharacterSet.Gb18030Binary:
257+
case CharacterSet.Gb18030Unicode520CaseInsensitive:
45258
case CharacterSet.Utf8Mb4Uca900AccentInsensitiveCaseInsensitive:
259+
case CharacterSet.Utf8Mb4GermanPhonebookUca900AccentInsensitiveCaseInsensitive:
260+
case CharacterSet.Utf8Mb4IcelandicUca900AccentInsensitiveCaseInsensitive:
261+
case CharacterSet.Utf8Mb4LatvianUca900AccentInsensitiveCaseInsensitive:
262+
case CharacterSet.Utf8Mb4RomanianUca900AccentInsensitiveCaseInsensitive:
263+
case CharacterSet.Utf8Mb4SlovenianUca900AccentInsensitiveCaseInsensitive:
264+
case CharacterSet.Utf8Mb4PolishUca900AccentInsensitiveCaseInsensitive:
265+
case CharacterSet.Utf8Mb4EstonianUca900AccentInsensitiveCaseInsensitive:
266+
case CharacterSet.Utf8Mb4SpanishUca900AccentInsensitiveCaseInsensitive:
267+
case CharacterSet.Utf8Mb4SwedishUca900AccentInsensitiveCaseInsensitive:
268+
case CharacterSet.Utf8Mb4TurkishUca900AccentInsensitiveCaseInsensitive:
269+
case CharacterSet.Utf8Mb4CaseSensitiveUca900AccentInsensitiveCaseInsensitive:
270+
case CharacterSet.Utf8Mb4DanishUca900AccentInsensitiveCaseInsensitive:
271+
case CharacterSet.Utf8Mb4LithuanianUca900AccentInsensitiveCaseInsensitive:
272+
case CharacterSet.Utf8Mb4SlovakUca900AccentInsensitiveCaseInsensitive:
273+
case CharacterSet.Utf8Mb4TraditionalSpanishUca900AccentInsensitiveCaseInsensitive:
274+
case CharacterSet.Utf8Mb4LatinUca900AccentInsensitiveCaseInsensitive:
275+
case CharacterSet.Utf8Mb4EsperantoUca900AccentInsensitiveCaseInsensitive:
276+
case CharacterSet.Utf8Mb4HungarianUca900AccentInsensitiveCaseInsensitive:
277+
case CharacterSet.Utf8Mb4CroatianUca900AccentInsensitiveCaseInsensitive:
278+
case CharacterSet.Utf8Mb4VietnameseUca900AccentInsensitiveCaseInsensitive:
46279
case CharacterSet.Utf8Mb4Uca900AccentSensitiveCaseSensitive:
47-
case CharacterSet.Utf32Binary:
48-
case CharacterSet.Utf32GeneralCaseInsensitive:
49-
case CharacterSet.Utf32UnicodeCaseInsensitive:
50-
case CharacterSet.Utf32Unicode520CaseInsensitive:
280+
case CharacterSet.Utf8Mb4GermanPhonebookUca900AccentSensitiveCaseSensitive:
281+
case CharacterSet.Utf8Mb4IcelandicUca900AccentSensitiveCaseSensitive:
282+
case CharacterSet.Utf8Mb4LatvianUca900AccentSensitiveCaseSensitive:
283+
case CharacterSet.Utf8Mb4RomanianUca900AccentSensitiveCaseSensitive:
284+
case CharacterSet.Utf8Mb4SlovenianUca900AccentSensitiveCaseSensitive:
285+
case CharacterSet.Utf8Mb4PolishUca900AccentSensitiveCaseSensitive:
286+
case CharacterSet.Utf8Mb4EstonianUca900AccentSensitiveCaseSensitive:
287+
case CharacterSet.Utf8Mb4SpanishUca900AccentSensitiveCaseSensitive:
288+
case CharacterSet.Utf8Mb4SwedishUca900AccentSensitiveCaseSensitive:
289+
case CharacterSet.Utf8Mb4TurkishUca900AccentSensitiveCaseSensitive:
290+
case CharacterSet.Utf8Mb4CaseSensitiveUca900AccentSensitiveCaseSensitive:
291+
case CharacterSet.Utf8Mb4DanishUca900AccentSensitiveCaseSensitive:
292+
case CharacterSet.Utf8Mb4LithuanianUca900AccentSensitiveCaseSensitive:
293+
case CharacterSet.Utf8Mb4SlovakUca900AccentSensitiveCaseSensitive:
294+
case CharacterSet.Utf8Mb4TraditionalSpanishUca900AccentSensitiveCaseSensitive:
295+
case CharacterSet.Utf8Mb4LatinUca900AccentSensitiveCaseSensitive:
296+
case CharacterSet.Utf8Mb4EsperantoUca900AccentSensitiveCaseSensitive:
297+
case CharacterSet.Utf8Mb4HungarianUca900AccentSensitiveCaseSensitive:
298+
case CharacterSet.Utf8Mb4CroatianUca900AccentSensitiveCaseSensitive:
299+
case CharacterSet.Utf8Mb4VietnameseUca900AccentSensitiveCaseSensitive:
300+
case CharacterSet.Utf8Mb4JapaneseUca900AccentSensitiveCaseSensitive:
301+
case CharacterSet.Utf8Mb4JapaneseUca900AccentSensitiveCaseSensitiveKanaSensitive:
302+
case CharacterSet.Utf8Mb4Uca900AccentSensitiveCaseInsensitive:
303+
case CharacterSet.Utf8Mb4RussianUca900AccentInsensitiveCaseInsensitive:
304+
case CharacterSet.Utf8Mb4RussianUca900AccentSensitiveCaseSensitive:
51305
return 4;
52306

53307
default:
54-
return 1;
308+
throw new NotSupportedException("Maximum byte length of character set {0} is unknown.".FormatInvariant(characterSet));
55309
}
56310
}
57311

tests/SideBySide/CharacterSetTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Dapper;
2+
using MySql.Data.Serialization;
3+
using Xunit;
4+
5+
namespace SideBySide
6+
{
7+
public class CharacterSetTests : IClassFixture<DatabaseFixture>
8+
{
9+
public CharacterSetTests(DatabaseFixture database)
10+
{
11+
m_database = database;
12+
}
13+
14+
#if !BASELINE
15+
[Fact]
16+
public void MaxLength()
17+
{
18+
using (var reader = m_database.Connection.ExecuteReader(@"select coll.ID, cs.MAXLEN from information_schema.collations coll inner join information_schema.character_sets cs using(CHARACTER_SET_NAME);"))
19+
{
20+
while (reader.Read())
21+
{
22+
var characterSet = (CharacterSet) reader.GetInt32(0);
23+
var maxLength = reader.GetInt32(1);
24+
25+
Assert.Equal(maxLength, SerializationUtility.GetBytesPerCharacter(characterSet));
26+
}
27+
}
28+
}
29+
#endif
30+
31+
readonly DatabaseFixture m_database;
32+
}
33+
}

0 commit comments

Comments
 (0)