@@ -37,195 +37,118 @@ OF SUCH DAMAGE.
37
37
#include " db2i_collationSupport.h"
38
38
#include " db2i_errors.h"
39
39
40
-
41
- /*
42
- The following arrays define a mapping between MySQL collation names and
43
- corresponding IBM i sort sequences. The mapping is a 1-to-1 correlation
44
- between corresponding array slots but is incomplete without case-sensitivity
45
- markers dynamically added to the mySqlSortSequence names.
46
- */
47
- #define MAX_COLLATION 87
48
- static const char * mySQLCollation[MAX_COLLATION] =
49
- {
50
- " ascii_general" ,
51
- " ascii" ,
52
- " big5_chinese" ,
53
- " big5" ,
54
- " cp1250_croatian" ,
55
- " cp1250_general" ,
56
- " cp1250_polish" ,
57
- " cp1250" ,
58
- " cp1251_bulgarian" ,
59
- " cp1251_general" ,
60
- " cp1251" ,
61
- " cp1256_general" ,
62
- " cp1256" ,
63
- " cp850_general" ,
64
- " cp850" ,
65
- " cp852_general" ,
66
- " cp852" ,
67
- " cp932_japanese" ,
68
- " cp932" ,
69
- " euckr_korean" ,
70
- " euckr" ,
71
- " gb2312_chinese" ,
72
- " gb2312" ,
73
- " gbk_chinese" ,
74
- " gbk" ,
75
- " greek_general" ,
76
- " greek" ,
77
- " hebrew_general" ,
78
- " hebrew" ,
79
- " latin1_danish" ,
80
- " latin1_general" ,
81
- " latin1_german1" ,
82
- " latin1_spanish" ,
83
- " latin1_swedish" ,
84
- " latin1" ,
85
- " latin2_croatian" ,
86
- " latin2_general" ,
87
- " latin2_hungarian" ,
88
- " latin2" ,
89
- " latin5_turkish" ,
90
- " latin5" ,
91
- " macce_general" ,
92
- " macce" ,
93
- " sjis_japanese" ,
94
- " sjis" ,
95
- " tis620_thai" ,
96
- " tis620" ,
97
- " ucs2_czech" ,
98
- " ucs2_danish" ,
99
- " ucs2_esperanto" ,
100
- " ucs2_estonian" ,
101
- " ucs2_general" ,
102
- " ucs2_hungarian" ,
103
- " ucs2_icelandic" ,
104
- " ucs2_latvian" ,
105
- " ucs2_lithuanian" ,
106
- " ucs2_persian" ,
107
- " ucs2_polish" ,
108
- " ucs2_romanian" ,
109
- " ucs2_slovak" ,
110
- " ucs2_slovenian" ,
111
- " ucs2_spanish" ,
112
- " ucs2_swedish" ,
113
- " ucs2_turkish" ,
114
- " ucs2_unicode" ,
115
- " ucs2" ,
116
- " ujis_japanese" ,
117
- " ujis" ,
118
- " utf8_czech" ,
119
- " utf8_danish" ,
120
- " utf8_esperanto" ,
121
- " utf8_estonian" ,
122
- " utf8_general" ,
123
- " utf8_hungarian" ,
124
- " utf8_icelandic" ,
125
- " utf8_latvian" ,
126
- " utf8_lithuanian" ,
127
- " utf8_persian" ,
128
- " utf8_polish" ,
129
- " utf8_romanian" ,
130
- " utf8_slovak" ,
131
- " utf8_slovenian" ,
132
- " utf8_spanish" ,
133
- " utf8_swedish" ,
134
- " utf8_turkish" ,
135
- " utf8_unicode" ,
136
- " utf8"
40
+ struct CollationMapEntry {
41
+ const char * collation_name;
42
+ const char * db2_sort_sequence;
137
43
};
138
44
139
-
140
- static const char * mySqlSortSequence[MAX_COLLATION] =
141
- {
142
- " QALA101F4" ,
143
- " QBLA101F4" ,
144
- " QACHT04B0" ,
145
- " QBCHT04B0" ,
146
- " QALA20481" ,
147
- " QCLA20481" ,
148
- " QDLA20481" ,
149
- " QELA20481" ,
150
- " QACYR0401" ,
151
- " QBCYR0401" ,
152
- " QCCYR0401" ,
153
- " QAARA01A4" ,
154
- " QBARA01A4" ,
155
- " QCLA101F4" ,
156
- " QDLA101F4" ,
157
- " QALA20366" ,
158
- " QBLA20366" ,
159
- " QAJPN04B0" ,
160
- " QBJPN04B0" ,
161
- " QAKOR04B0" ,
162
- " QBKOR04B0" ,
163
- " QACHS04B0" ,
164
- " QBCHS04B0" ,
165
- " QCCHS04B0" ,
166
- " QDCHS04B0" ,
167
- " QAELL036B" ,
168
- " QBELL036B" ,
169
- " QAHEB01A8" ,
170
- " QBHEB01A8" ,
171
- " QALA1047C" ,
172
- " QBLA1047C" ,
173
- " QCLA1047C" ,
174
- " QDLA1047C" ,
175
- " QELA1047C" ,
176
- " QFLA1047C" ,
177
- " QCLA20366" ,
178
- " QELA20366" ,
179
- " QFLA20366" ,
180
- " QGLA20366" ,
181
- " QATRK0402" ,
182
- " QBTRK0402" ,
183
- " QHLA20366" ,
184
- " QILA20366" ,
185
- " QCJPN04B0" ,
186
- " QDJPN04B0" ,
187
- " QATHA0346" ,
188
- " QBTHA0346" ,
189
- " ACS_CZ" ,
190
- " ADA_DK" ,
191
- " AEO" ,
192
- " AET" ,
193
- " QAUCS04B0" ,
194
- " AHU" ,
195
- " AIS" ,
196
- " ALV" ,
197
- " ALT" ,
198
- " AFA" ,
199
- " APL" ,
200
- " ARO" ,
201
- " ASK" ,
202
- " ASL" ,
203
- " AES" ,
204
- " ASW" ,
205
- " ATR" ,
206
- " AEN" ,
207
- " *HEX" ,
208
- " QEJPN04B0" ,
209
- " QFJPN04B0" ,
210
- " ACS_CZ" ,
211
- " ADA_DK" ,
212
- " AEO" ,
213
- " AET" ,
214
- " QAUCS04B0" ,
215
- " AHU" ,
216
- " AIS" ,
217
- " ALV" ,
218
- " ALT" ,
219
- " AFA" ,
220
- " APL" ,
221
- " ARO" ,
222
- " ASK" ,
223
- " ASL" ,
224
- " AES" ,
225
- " ASW" ,
226
- " ATR" ,
227
- " AEN" ,
228
- " *HEX"
45
+ static CollationMapEntry collation_map[] = {
46
+ { " ascii_general" , " QALA101F4" },
47
+ { " ascii" , " QBLA101F4" },
48
+ { " big5_chinese" , " QACHT04B0" },
49
+ { " big5" , " QBCHT04B0" },
50
+ { " cp1250_croatian" , " QALA20481" },
51
+ { " cp1250_general" , " QCLA20481" },
52
+ { " cp1250_polish" , " QDLA20481" },
53
+ { " cp1250" , " QELA20481" },
54
+ { " cp1251_bulgarian" , " QACYR0401" },
55
+ { " cp1251_general" , " QBCYR0401" },
56
+ { " cp1251" , " QCCYR0401" },
57
+ { " cp1256_general" , " QAARA01A4" },
58
+ { " cp1256" , " QBARA01A4" },
59
+ { " cp850_general" , " QCLA101F4" },
60
+ { " cp850" , " QDLA101F4" },
61
+ { " cp852_general" , " QALA20366" },
62
+ { " cp852" , " QBLA20366" },
63
+ { " cp932_japanese" , " QAJPN04B0" },
64
+ { " cp932" , " QBJPN04B0" },
65
+ { " euckr_korean" , " QAKOR04B0" },
66
+ { " euckr" , " QBKOR04B0" },
67
+ { " gb2312_chinese" , " QACHS04B0" },
68
+ { " gb2312" , " QBCHS04B0" },
69
+ { " gbk_chinese" , " QCCHS04B0" },
70
+ { " gbk" , " QDCHS04B0" },
71
+ { " greek_general" , " QAELL036B" },
72
+ { " greek" , " QBELL036B" },
73
+ { " hebrew_general" , " QAHEB01A8" },
74
+ { " hebrew" , " QBHEB01A8" },
75
+ { " latin1_danish" , " QALA1047C" },
76
+ { " latin1_general" , " QBLA1047C" },
77
+ { " latin1_german1" , " QCLA1047C" },
78
+ { " latin1_spanish" , " QDLA1047C" },
79
+ { " latin1_swedish" , " QELA1047C" },
80
+ { " latin1" , " QFLA1047C" },
81
+ { " latin2_croatian" , " QCLA20366" },
82
+ { " latin2_general" , " QELA20366" },
83
+ { " latin2_hungarian" , " QFLA20366" },
84
+ { " latin2" , " QGLA20366" },
85
+ { " latin5_turkish" , " QATRK0402" },
86
+ { " latin5" , " QBTRK0402" },
87
+ { " macce_general" , " QHLA20366" },
88
+ { " macce" , " QILA20366" },
89
+ { " sjis_japanese" , " QCJPN04B0" },
90
+ { " sjis" , " QDJPN04B0" },
91
+ { " tis620_thai" , " QATHA0346" },
92
+ { " tis620" , " QBTHA0346" },
93
+ { " ucs2_czech" , " ACS_CZ" },
94
+ { " ucs2_danish" , " ADA_DK" },
95
+ { " ucs2_esperanto" , " AEO" },
96
+ { " ucs2_estonian" , " AET" },
97
+ { " ucs2_general" , " QAUCS04B0" },
98
+ { " ucs2_hungarian" , " AHU" },
99
+ { " ucs2_icelandic" , " AIS" },
100
+ { " ucs2_latvian" , " ALV" },
101
+ { " ucs2_lithuanian" , " ALT" },
102
+ { " ucs2_persian" , " AFA" },
103
+ { " ucs2_polish" , " APL" },
104
+ { " ucs2_romanian" , " ARO" },
105
+ { " ucs2_slovak" , " ASK" },
106
+ { " ucs2_slovenian" , " ASL" },
107
+ { " ucs2_spanish" , " AES" },
108
+ { " ucs2_swedish" , " ASW" },
109
+ { " ucs2_turkish" , " ATR" },
110
+ { " ucs2_unicode" , " AEN" },
111
+ { " ucs2" , " *HEX" },
112
+ { " ujis_japanese" , " QEJPN04B0" },
113
+ { " ujis" , " QFJPN04B0" },
114
+ { " utf8_czech" , " ACS_CZ" },
115
+ { " utf8_danish" , " ADA_DK" },
116
+ { " utf8_esperanto" , " AEO" },
117
+ { " utf8_estonian" , " AET" },
118
+ { " utf8_general" , " QAUCS04B0" },
119
+ { " utf8_hungarian" , " AHU" },
120
+ { " utf8_icelandic" , " AIS" },
121
+ { " utf8_latvian" , " ALV" },
122
+ { " utf8_lithuanian" , " ALT" },
123
+ { " utf8_persian" , " AFA" },
124
+ { " utf8_polish" , " APL" },
125
+ { " utf8_romanian" , " ARO" },
126
+ { " utf8_slovak" , " ASK" },
127
+ { " utf8_slovenian" , " ASL" },
128
+ { " utf8_spanish" , " AES" },
129
+ { " utf8_swedish" , " ASW" },
130
+ { " utf8_turkish" , " ATR" },
131
+ { " utf8_unicode" , " AEN" },
132
+ { " utf8" , " *HEX" },
133
+ { " utf8mb4_czech" , " ACS_CZ" },
134
+ { " utf8mb4_danish" , " ADA_DK" },
135
+ { " utf8mb4_esperanto" , " AEO" },
136
+ { " utf8mb4_estonian" , " AET" },
137
+ { " utf8mb4_general" , " QAUCS04B0" },
138
+ { " utf8mb4_hungarian" , " AHU" },
139
+ { " utf8mb4_icelandic" , " AIS" },
140
+ { " utf8mb4_latvian" , " ALV" },
141
+ { " utf8mb4_lithuanian" , " ALT" },
142
+ { " utf8mb4_persian" , " AFA" },
143
+ { " utf8mb4_polish" , " APL" },
144
+ { " utf8mb4_romanian" , " ARO" },
145
+ { " utf8mb4_slovak" , " ASK" },
146
+ { " utf8mb4_slovenian" , " ASL" },
147
+ { " utf8mb4_spanish" , " AES" },
148
+ { " utf8mb4_swedish" , " ASW" },
149
+ { " utf8mb4_turkish" , " ATR" },
150
+ { " utf8mb4_unicode" , " AEN" },
151
+ { " utf8mb4" , " *HEX" }
229
152
};
230
153
231
154
@@ -243,28 +166,23 @@ static int32 getAssociatedSortSequence(const CHARSET_INFO *fieldCharSet, const c
243
166
244
167
if (strcmp (fieldCharSet->csname ," binary" ) != 0 )
245
168
{
246
- int collationSearchLen = strlen (fieldCharSet->name );
169
+ size_t collationSearchLen = strlen (fieldCharSet->name );
247
170
if (fieldCharSet->state & MY_CS_BINSORT)
248
- collationSearchLen -= 4 ;
171
+ collationSearchLen -= strlen ( " _bin " ) ;
249
172
else
250
- collationSearchLen -= 3 ;
251
-
252
- uint16 loopCnt = 0 ;
253
- for (loopCnt = 0 ; loopCnt < MAX_COLLATION; ++loopCnt)
254
- {
255
- if ((strlen (mySQLCollation[loopCnt]) == (size_t ) collationSearchLen) &&
256
- (strncmp ((char *)mySQLCollation[loopCnt], fieldCharSet->name , collationSearchLen) == 0 ))
257
- break ;
258
- }
259
- if (loopCnt == MAX_COLLATION) // Did not find associated sort sequence
173
+ collationSearchLen -= strlen (" _ci" );
174
+
175
+ for (auto & entry : collation_map)
260
176
{
261
- getErrTxt (DB2I_ERR_SRTSEQ);
262
- DBUG_RETURN (DB2I_ERR_SRTSEQ);
177
+ if ((strlen (entry.collation_name ) == collationSearchLen) &&
178
+ (memcmp (entry.collation_name , fieldCharSet->name , collationSearchLen) == 0 )) {
179
+ *rtnSortSequence = entry.db2_sort_sequence ;
180
+ DBUG_RETURN (0 );
181
+ }
263
182
}
264
- *rtnSortSequence = mySqlSortSequence[loopCnt];
183
+ getErrTxt (DB2I_ERR_SRTSEQ);
184
+ DBUG_RETURN (DB2I_ERR_SRTSEQ);
265
185
}
266
-
267
- DBUG_RETURN (0 );
268
186
}
269
187
270
188
0 commit comments