33
33
static vector<unsigned char*> memory_vector;
35
extern charset_info_st my_charset_utf8mb4_icelandic_uca_ci;
36
extern charset_info_st my_charset_utf8mb4_latvian_uca_ci;
37
extern charset_info_st my_charset_utf8mb4_romanian_uca_ci;
38
extern charset_info_st my_charset_utf8mb4_slovenian_uca_ci;
39
extern charset_info_st my_charset_utf8mb4_polish_uca_ci;
40
extern charset_info_st my_charset_utf8mb4_estonian_uca_ci;
41
extern charset_info_st my_charset_utf8mb4_spanish_uca_ci;
42
extern charset_info_st my_charset_utf8mb4_swedish_uca_ci;
43
extern charset_info_st my_charset_utf8mb4_turkish_uca_ci;
44
extern charset_info_st my_charset_utf8mb4_czech_uca_ci;
45
extern charset_info_st my_charset_utf8mb4_danish_uca_ci;
46
extern charset_info_st my_charset_utf8mb4_lithuanian_uca_ci;
47
extern charset_info_st my_charset_utf8mb4_slovak_uca_ci;
48
extern charset_info_st my_charset_utf8mb4_spanish2_uca_ci;
49
extern charset_info_st my_charset_utf8mb4_roman_uca_ci;
50
extern charset_info_st my_charset_utf8mb4_persian_uca_ci;
51
extern charset_info_st my_charset_utf8mb4_esperanto_uca_ci;
52
extern charset_info_st my_charset_utf8mb4_hungarian_uca_ci;
53
extern charset_info_st my_charset_utf8mb4_sinhala_uca_ci;
36
56
The code below implements this functionality:
124
144
DRIZZLED_API charset_info_st *all_charsets[256];
125
145
const DRIZZLED_API charset_info_st *default_charset_info = &my_charset_utf8_general_ci;
127
void add_compiled_collation(charset_info_st * cs)
147
static void add_compiled_collation(charset_info_st * cs)
129
149
all_charsets[cs->number]= cs;
130
150
cs->state|= MY_CS_AVAILABLE;
133
static void init_available_charsets(myf myflags)
153
static void init_compiled_charsets()
155
add_compiled_collation(&my_charset_bin);
157
add_compiled_collation(&my_charset_utf8mb4_general_ci);
158
add_compiled_collation(&my_charset_utf8mb4_bin);
159
add_compiled_collation(&my_charset_utf8mb4_unicode_ci);
160
add_compiled_collation(&my_charset_utf8mb4_icelandic_uca_ci);
161
add_compiled_collation(&my_charset_utf8mb4_latvian_uca_ci);
162
add_compiled_collation(&my_charset_utf8mb4_romanian_uca_ci);
163
add_compiled_collation(&my_charset_utf8mb4_slovenian_uca_ci);
164
add_compiled_collation(&my_charset_utf8mb4_polish_uca_ci);
165
add_compiled_collation(&my_charset_utf8mb4_estonian_uca_ci);
166
add_compiled_collation(&my_charset_utf8mb4_spanish_uca_ci);
167
add_compiled_collation(&my_charset_utf8mb4_swedish_uca_ci);
168
add_compiled_collation(&my_charset_utf8mb4_turkish_uca_ci);
169
add_compiled_collation(&my_charset_utf8mb4_czech_uca_ci);
170
add_compiled_collation(&my_charset_utf8mb4_danish_uca_ci);
171
add_compiled_collation(&my_charset_utf8mb4_lithuanian_uca_ci);
172
add_compiled_collation(&my_charset_utf8mb4_slovak_uca_ci);
173
add_compiled_collation(&my_charset_utf8mb4_spanish2_uca_ci);
174
add_compiled_collation(&my_charset_utf8mb4_roman_uca_ci);
175
add_compiled_collation(&my_charset_utf8mb4_persian_uca_ci);
176
add_compiled_collation(&my_charset_utf8mb4_esperanto_uca_ci);
177
add_compiled_collation(&my_charset_utf8mb4_hungarian_uca_ci);
178
add_compiled_collation(&my_charset_utf8mb4_sinhala_uca_ci);
181
static void init_available_charsets()
136
184
We have to use charset_initialized to not lock on THR_LOCK_charset
139
187
if (charset_initialized)
141
189
memset(&all_charsets, 0, sizeof(all_charsets));
142
init_compiled_charsets(myflags);
190
init_compiled_charsets();
144
192
/* Copy compiled charsets */
145
193
for (charset_info_st**cs= all_charsets;
167
215
uint32_t get_collation_number(const char *name)
169
init_available_charsets(MYF(0));
217
init_available_charsets();
170
218
return get_collation_number_internal(name);
173
221
uint32_t get_charset_number(const char *charset_name, uint32_t cs_flags)
175
223
charset_info_st **cs;
176
init_available_charsets(MYF(0));
224
init_available_charsets();
178
226
for (cs= all_charsets;
179
227
cs < all_charsets+array_elements(all_charsets)-1 ;
188
236
const char *get_charset_name(uint32_t charset_number)
190
init_available_charsets(MYF(0));
192
const charset_info_st *cs= all_charsets[charset_number];
193
if (cs && (cs->number == charset_number) && cs->name )
196
return "?"; /* this mimics find_type() */
238
init_available_charsets();
239
const charset_info_st* cs= all_charsets[charset_number];
240
return cs && cs->number == charset_number && cs->name ? cs->name : "?";
199
243
static const charset_info_st *get_internal_charset(uint32_t cs_number)
245
charset_info_st* cs= all_charsets[cs_number];
203
247
To make things thread safe we are not allowing other threads to interfere
204
248
while we may changing the cs_info_table
206
if ((cs= all_charsets[cs_number]))
208
if (!(cs->state & MY_CS_COMPILED) && !(cs->state & MY_CS_LOADED))
212
cs= (cs->state & MY_CS_AVAILABLE) ? cs : NULL;
214
if (cs && !(cs->state & MY_CS_READY))
216
if ((cs->cset->init && cs->cset->init(cs, cs_alloc)) ||
217
(cs->coll->init && cs->coll->init(cs, cs_alloc)))
220
cs->state|= MY_CS_READY;
252
assert(not (not (cs->state & MY_CS_COMPILED) && not (cs->state & MY_CS_LOADED)));
253
if (not (cs->state & MY_CS_AVAILABLE))
255
if (not (cs->state & MY_CS_READY))
257
if (cs->coll->init && cs->coll->init(*cs, cs_alloc))
259
cs->state|= MY_CS_READY;
228
266
if (cs_number == default_charset_info->number)
229
267
return default_charset_info;
231
init_available_charsets(MYF(0)); /* If it isn't initialized */
269
init_available_charsets(); /* If it isn't initialized */
233
271
if (!cs_number || cs_number >= array_elements(all_charsets)-1)
239
277
const charset_info_st *get_charset_by_name(const char *cs_name)
241
init_available_charsets(MYF(0)); /* If it isn't initialized */
279
init_available_charsets(); /* If it isn't initialized */
242
280
uint32_t cs_number= get_collation_number(cs_name);
243
281
return cs_number ? get_internal_charset(cs_number) : NULL;
246
284
const charset_info_st *get_charset_by_csname(const char *cs_name, uint32_t cs_flags)
248
init_available_charsets(MYF(0)); /* If it isn't initialized */
286
init_available_charsets(); /* If it isn't initialized */
249
287
uint32_t cs_number= get_charset_number(cs_name, cs_flags);
250
288
return cs_number ? get_internal_charset(cs_number) : NULL;