~brianaker/drizzle/bug730986

« back to all changes in this revision

Viewing changes to drizzled/charset.cc

  • Committer: Mark Atwood
  • Date: 2011-07-07 02:23:07 UTC
  • mfrom: (2318.6.116 refactor18)
  • Revision ID: me@mark.atwood.name-20110707022307-4db00nqaaczzc3jv
mergeĀ lp:~olafvdspek/drizzle/refactor18

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
*/
33
33
static vector<unsigned char*> memory_vector;
34
34
 
 
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;
 
54
 
35
55
/*
36
56
  The code below implements this functionality:
37
57
 
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;
126
146
 
127
 
void add_compiled_collation(charset_info_st * cs)
 
147
static void add_compiled_collation(charset_info_st * cs)
128
148
{
129
149
  all_charsets[cs->number]= cs;
130
150
  cs->state|= MY_CS_AVAILABLE;
131
151
}
132
152
 
133
 
static void init_available_charsets(myf myflags)
 
153
static void init_compiled_charsets()
 
154
{
 
155
  add_compiled_collation(&my_charset_bin);
 
156
 
 
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);
 
179
}
 
180
 
 
181
static void init_available_charsets()
134
182
{
135
183
  /*
136
184
    We have to use charset_initialized to not lock on THR_LOCK_charset
139
187
  if (charset_initialized)
140
188
    return;
141
189
  memset(&all_charsets, 0, sizeof(all_charsets));
142
 
  init_compiled_charsets(myflags);
 
190
  init_compiled_charsets();
143
191
 
144
192
  /* Copy compiled charsets */
145
193
  for (charset_info_st**cs= all_charsets;
166
214
 
167
215
uint32_t get_collation_number(const char *name)
168
216
{
169
 
  init_available_charsets(MYF(0));
 
217
  init_available_charsets();
170
218
  return get_collation_number_internal(name);
171
219
}
172
220
 
173
221
uint32_t get_charset_number(const char *charset_name, uint32_t cs_flags)
174
222
{
175
223
  charset_info_st **cs;
176
 
  init_available_charsets(MYF(0));
 
224
  init_available_charsets();
177
225
 
178
226
  for (cs= all_charsets;
179
227
       cs < all_charsets+array_elements(all_charsets)-1 ;
187
235
 
188
236
const char *get_charset_name(uint32_t charset_number)
189
237
{
190
 
  init_available_charsets(MYF(0));
191
 
 
192
 
  const charset_info_st *cs= all_charsets[charset_number];
193
 
  if (cs && (cs->number == charset_number) && cs->name )
194
 
    return cs->name;
195
 
 
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 : "?";
197
241
}
198
242
 
199
243
static const charset_info_st *get_internal_charset(uint32_t cs_number)
200
244
{
201
 
  charset_info_st *cs;
 
245
  charset_info_st* cs= all_charsets[cs_number];
202
246
  /*
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
205
249
  */
206
 
  if ((cs= all_charsets[cs_number]))
207
 
  {
208
 
    if (!(cs->state & MY_CS_COMPILED) && !(cs->state & MY_CS_LOADED))
209
 
    {
210
 
      assert(0);
211
 
    }
212
 
    cs= (cs->state & MY_CS_AVAILABLE) ? cs : NULL;
213
 
  }
214
 
  if (cs && !(cs->state & MY_CS_READY))
215
 
  {
216
 
    if ((cs->cset->init && cs->cset->init(cs, cs_alloc)) ||
217
 
        (cs->coll->init && cs->coll->init(cs, cs_alloc)))
218
 
      cs= NULL;
219
 
    else
220
 
      cs->state|= MY_CS_READY;
221
 
  }
222
 
 
 
250
  if (not cs)
 
251
    return NULL;
 
252
  assert(not (not (cs->state & MY_CS_COMPILED) && not (cs->state & MY_CS_LOADED)));
 
253
  if (not (cs->state & MY_CS_AVAILABLE))
 
254
    return NULL;
 
255
  if (not (cs->state & MY_CS_READY))
 
256
  {
 
257
    if (cs->coll->init && cs->coll->init(*cs, cs_alloc))
 
258
      return NULL;
 
259
    cs->state|= MY_CS_READY;
 
260
  }
223
261
  return cs;
224
262
}
225
263
 
228
266
  if (cs_number == default_charset_info->number)
229
267
    return default_charset_info;
230
268
 
231
 
  init_available_charsets(MYF(0));      /* If it isn't initialized */
 
269
  init_available_charsets();    /* If it isn't initialized */
232
270
 
233
271
  if (!cs_number || cs_number >= array_elements(all_charsets)-1)
234
272
    return NULL;
238
276
 
239
277
const charset_info_st *get_charset_by_name(const char *cs_name)
240
278
{
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;
244
282
}
245
283
 
246
284
const charset_info_st *get_charset_by_csname(const char *cs_name, uint32_t cs_flags)
247
285
{
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;
251
289
}