/*
 * Copyright (c) 2015, 2021, Oracle and/or its affiliates.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License, version 2.0,
 * as published by the Free Software Foundation.
 *
 * This program is also distributed with certain software (including
 * but not limited to OpenSSL) that is licensed under separate terms,
 * as designated in a particular file or component or in included license
 * documentation.  The authors of MySQL hereby grant you an additional
 * permission to link the program and your derivative works with the
 * separately licensed software that they have included with MySQL.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License, version 2.0, for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301  USA
 */

#include "mysqlx_charset.h"
using namespace mysqlx;

const Charset::Charset_entry Charset::m_charsets_info[] = {
  /* The list is taken from protocol/mysqlx-protocol-xplugin.rst */
  { 1, "big5", "big5_chinese_ci" },
  { 2, "latin2", "latin2_czech_cs" },
  { 3, "dec8", "dec8_swedish_ci" },
  { 4, "cp850", "cp850_general_ci" },
  { 5, "latin1", "latin1_german1_ci" },
  { 6, "hp8", "hp8_english_ci" },
  { 7, "koi8r", "koi8r_general_ci" },
  { 8, "latin1", "latin1_swedish_ci" },
  { 9, "latin2", "latin2_general_ci" },
  { 10, "swe7", "swe7_swedish_ci" },
  { 11, "ascii", "ascii_general_ci" },
  { 12, "ujis", "ujis_japanese_ci" },
  { 13, "sjis", "sjis_japanese_ci" },
  { 14, "cp1251", "cp1251_bulgarian_ci" },
  { 15, "latin1", "latin1_danish_ci" },
  { 16, "hebrew", "hebrew_general_ci" },
  { 18, "tis620", "tis620_thai_ci" },
  { 19, "euckr", "euckr_korean_ci" },
  { 20, "latin7", "latin7_estonian_cs" },
  { 21, "latin2", "latin2_hungarian_ci" },
  { 22, "koi8u", "koi8u_general_ci" },
  { 23, "cp1251", "cp1251_ukrainian_ci" },
  { 24, "gb2312", "gb2312_chinese_ci" },
  { 25, "greek", "greek_general_ci" },
  { 26, "cp1250", "cp1250_general_ci" },
  { 27, "latin2", "latin2_croatian_ci" },
  { 28, "gbk", "gbk_chinese_ci" },
  { 29, "cp1257", "cp1257_lithuanian_ci" },
  { 30, "latin5", "latin5_turkish_ci" },
  { 31, "latin1", "latin1_german2_ci" },
  { 32, "armscii8", "armscii8_general_ci" },
  { 33, "utf8", "utf8_general_ci" },
  { 34, "cp1250", "cp1250_czech_cs" },
  { 35, "ucs2", "ucs2_general_ci" },
  { 36, "cp866", "cp866_general_ci" },
  { 37, "keybcs2", "keybcs2_general_ci" },
  { 38, "macce", "macce_general_ci" },
  { 39, "macroman", "macroman_general_ci" },
  { 40, "cp852", "cp852_general_ci" },
  { 41, "latin7", "latin7_general_ci" },
  { 42, "latin7", "latin7_general_cs" },
  { 43, "macce", "macce_bin" },
  { 44, "cp1250", "cp1250_croatian_ci" },
  { 45, "utf8mb4", "utf8mb4_general_ci" },
  { 46, "utf8mb4", "utf8mb4_bin" },
  { 47, "latin1", "latin1_bin" },
  { 48, "latin1", "latin1_general_ci" },
  { 49, "latin1", "latin1_general_cs" },
  { 50, "cp1251", "cp1251_bin" },
  { 51, "cp1251", "cp1251_general_ci" },
  { 52, "cp1251", "cp1251_general_cs" },
  { 53, "macroman", "macroman_bin" },
  { 54, "utf16", "utf16_general_ci" },
  { 55, "utf16", "utf16_bin" },
  { 56, "utf16le", "utf16le_general_ci" },
  { 57, "cp1256", "cp1256_general_ci" },
  { 58, "cp1257", "cp1257_bin" },
  { 59, "cp1257", "cp1257_general_ci" },
  { 60, "utf32", "utf32_general_ci" },
  { 61, "utf32", "utf32_bin" },
  { 62, "utf16le", "utf16le_bin" },
  { 63, "binary", "binary" },
  { 64, "armscii8", "armscii8_bin" },
  { 65, "ascii", "ascii_bin" },
  { 66, "cp1250", "cp1250_bin" },
  { 67, "cp1256", "cp1256_bin" },
  { 68, "cp866", "cp866_bin" },
  { 69, "dec8", "dec8_bin" },
  { 70, "greek", "greek_bin" },
  { 71, "hebrew", "hebrew_bin" },
  { 72, "hp8", "hp8_bin" },
  { 73, "keybcs2", "keybcs2_bin" },
  { 74, "koi8r", "koi8r_bin" },
  { 75, "koi8u", "koi8u_bin" },
  { 77, "latin2", "latin2_bin" },
  { 78, "latin5", "latin5_bin" },
  { 79, "latin7", "latin7_bin" },
  { 80, "cp850", "cp850_bin" },
  { 81, "cp852", "cp852_bin" },
  { 82, "swe7", "swe7_bin" },
  { 83, "utf8", "utf8_bin" },
  { 84, "big5", "big5_bin" },
  { 85, "euckr", "euckr_bin" },
  { 86, "gb2312", "gb2312_bin" },
  { 87, "gbk", "gbk_bin" },
  { 88, "sjis", "sjis_bin" },
  { 89, "tis620", "tis620_bin" },
  { 90, "ucs2", "ucs2_bin" },
  { 91, "ujis", "ujis_bin" },
  { 92, "geostd8", "geostd8_general_ci" },
  { 93, "geostd8", "geostd8_bin" },
  { 94, "latin1", "latin1_spanish_ci" },
  { 95, "cp932", "cp932_japanese_ci" },
  { 96, "cp932", "cp932_bin" },
  { 97, "eucjpms", "eucjpms_japanese_ci" },
  { 98, "eucjpms", "eucjpms_bin" },
  { 99, "cp1250", "cp1250_polish_ci" },
  { 101, "utf16", "utf16_unicode_ci" },
  { 102, "utf16", "utf16_icelandic_ci" },
  { 103, "utf16", "utf16_latvian_ci" },
  { 104, "utf16", "utf16_romanian_ci" },
  { 105, "utf16", "utf16_slovenian_ci" },
  { 106, "utf16", "utf16_polish_ci" },
  { 107, "utf16", "utf16_estonian_ci" },
  { 108, "utf16", "utf16_spanish_ci" },
  { 109, "utf16", "utf16_swedish_ci" },
  { 110, "utf16", "utf16_turkish_ci" },
  { 111, "utf16", "utf16_czech_ci" },
  { 112, "utf16", "utf16_danish_ci" },
  { 113, "utf16", "utf16_lithuanian_ci" },
  { 114, "utf16", "utf16_slovak_ci" },
  { 115, "utf16", "utf16_spanish2_ci" },
  { 116, "utf16", "utf16_roman_ci" },
  { 117, "utf16", "utf16_persian_ci" },
  { 118, "utf16", "utf16_esperanto_ci" },
  { 119, "utf16", "utf16_hungarian_ci" },
  { 120, "utf16", "utf16_sinhala_ci" },
  { 121, "utf16", "utf16_german2_ci" },
  { 122, "utf16", "utf16_croatian_ci" },
  { 123, "utf16", "utf16_unicode_520_ci" },
  { 124, "utf16", "utf16_vietnamese_ci" },
  { 128, "ucs2", "ucs2_unicode_ci" },
  { 129, "ucs2", "ucs2_icelandic_ci" },
  { 130, "ucs2", "ucs2_latvian_ci" },
  { 131, "ucs2", "ucs2_romanian_ci" },
  { 132, "ucs2", "ucs2_slovenian_ci" },
  { 133, "ucs2", "ucs2_polish_ci" },
  { 134, "ucs2", "ucs2_estonian_ci" },
  { 135, "ucs2", "ucs2_spanish_ci" },
  { 136, "ucs2", "ucs2_swedish_ci" },
  { 137, "ucs2", "ucs2_turkish_ci" },
  { 138, "ucs2", "ucs2_czech_ci" },
  { 139, "ucs2", "ucs2_danish_ci" },
  { 140, "ucs2", "ucs2_lithuanian_ci" },
  { 141, "ucs2", "ucs2_slovak_ci" },
  { 142, "ucs2", "ucs2_spanish2_ci" },
  { 143, "ucs2", "ucs2_roman_ci" },
  { 144, "ucs2", "ucs2_persian_ci" },
  { 145, "ucs2", "ucs2_esperanto_ci" },
  { 146, "ucs2", "ucs2_hungarian_ci" },
  { 147, "ucs2", "ucs2_sinhala_ci" },
  { 148, "ucs2", "ucs2_german2_ci" },
  { 149, "ucs2", "ucs2_croatian_ci" },
  { 150, "ucs2", "ucs2_unicode_520_ci" },
  { 151, "ucs2", "ucs2_vietnamese_ci" },
  { 159, "ucs2", "ucs2_general_mysql500_ci" },
  { 160, "utf32", "utf32_unicode_ci" },
  { 161, "utf32", "utf32_icelandic_ci" },
  { 162, "utf32", "utf32_latvian_ci" },
  { 163, "utf32", "utf32_romanian_ci" },
  { 164, "utf32", "utf32_slovenian_ci" },
  { 165, "utf32", "utf32_polish_ci" },
  { 166, "utf32", "utf32_estonian_ci" },
  { 167, "utf32", "utf32_spanish_ci" },
  { 168, "utf32", "utf32_swedish_ci" },
  { 169, "utf32", "utf32_turkish_ci" },
  { 170, "utf32", "utf32_czech_ci" },
  { 171, "utf32", "utf32_danish_ci" },
  { 172, "utf32", "utf32_lithuanian_ci" },
  { 173, "utf32", "utf32_slovak_ci" },
  { 174, "utf32", "utf32_spanish2_ci" },
  { 175, "utf32", "utf32_roman_ci" },
  { 176, "utf32", "utf32_persian_ci" },
  { 177, "utf32", "utf32_esperanto_ci" },
  { 178, "utf32", "utf32_hungarian_ci" },
  { 179, "utf32", "utf32_sinhala_ci" },
  { 180, "utf32", "utf32_german2_ci" },
  { 181, "utf32", "utf32_croatian_ci" },
  { 182, "utf32", "utf32_unicode_520_ci" },
  { 183, "utf32", "utf32_vietnamese_ci" },
  { 192, "utf8", "utf8_unicode_ci" },
  { 193, "utf8", "utf8_icelandic_ci" },
  { 194, "utf8", "utf8_latvian_ci" },
  { 195, "utf8", "utf8_romanian_ci" },
  { 196, "utf8", "utf8_slovenian_ci" },
  { 197, "utf8", "utf8_polish_ci" },
  { 198, "utf8", "utf8_estonian_ci" },
  { 199, "utf8", "utf8_spanish_ci" },
  { 200, "utf8", "utf8_swedish_ci" },
  { 201, "utf8", "utf8_turkish_ci" },
  { 202, "utf8", "utf8_czech_ci" },
  { 203, "utf8", "utf8_danish_ci" },
  { 204, "utf8", "utf8_lithuanian_ci" },
  { 205, "utf8", "utf8_slovak_ci" },
  { 206, "utf8", "utf8_spanish2_ci" },
  { 207, "utf8", "utf8_roman_ci" },
  { 208, "utf8", "utf8_persian_ci" },
  { 209, "utf8", "utf8_esperanto_ci" },
  { 210, "utf8", "utf8_hungarian_ci" },
  { 211, "utf8", "utf8_sinhala_ci" },
  { 212, "utf8", "utf8_german2_ci" },
  { 213, "utf8", "utf8_croatian_ci" },
  { 214, "utf8", "utf8_unicode_520_ci" },
  { 215, "utf8", "utf8_vietnamese_ci" },
  { 223, "utf8", "utf8_general_mysql500_ci" },
  { 224, "utf8mb4", "utf8mb4_unicode_ci" },
  { 225, "utf8mb4", "utf8mb4_icelandic_ci" },
  { 226, "utf8mb4", "utf8mb4_latvian_ci" },
  { 227, "utf8mb4", "utf8mb4_romanian_ci" },
  { 228, "utf8mb4", "utf8mb4_slovenian_ci" },
  { 229, "utf8mb4", "utf8mb4_polish_ci" },
  { 230, "utf8mb4", "utf8mb4_estonian_ci" },
  { 231, "utf8mb4", "utf8mb4_spanish_ci" },
  { 232, "utf8mb4", "utf8mb4_swedish_ci" },
  { 233, "utf8mb4", "utf8mb4_turkish_ci" },
  { 234, "utf8mb4", "utf8mb4_czech_ci" },
  { 235, "utf8mb4", "utf8mb4_danish_ci" },
  { 236, "utf8mb4", "utf8mb4_lithuanian_ci" },
  { 237, "utf8mb4", "utf8mb4_slovak_ci" },
  { 238, "utf8mb4", "utf8mb4_spanish2_ci" },
  { 239, "utf8mb4", "utf8mb4_roman_ci" },
  { 240, "utf8mb4", "utf8mb4_persian_ci" },
  { 241, "utf8mb4", "utf8mb4_esperanto_ci" },
  { 242, "utf8mb4", "utf8mb4_hungarian_ci" },
  { 243, "utf8mb4", "utf8mb4_sinhala_ci" },
  { 244, "utf8mb4", "utf8mb4_german2_ci" },
  { 245, "utf8mb4", "utf8mb4_croatian_ci" },
  { 246, "utf8mb4", "utf8mb4_unicode_520_ci" },
  { 247, "utf8mb4", "utf8mb4_vietnamese_ci" },
  { 248, "gb18030", "gb18030_chinese_ci" },
  { 249, "gb18030", "gb18030_bin" },
  { 250, "gb18030", "gb18030_unicode_520_ci" }
};


std::string Charset::charset_name_from_id(uint32_t id)
{
  return field_from_id(id, &Charset_entry::name);
}

std::string Charset::collation_name_from_id(uint32_t id)
{
  return field_from_id(id, &Charset_entry::collation);
}

std::string Charset::field_from_id(uint32_t id, std::string Charset_entry::*field)
{
  std::string result = (id == 0) ? "" : "?";

  for (size_t i = 0;
    i < sizeof(m_charsets_info) / sizeof(m_charsets_info[0]);
    ++i)
  {
    if (m_charsets_info[i].id == id)
    {
      result = m_charsets_info[i].*field;
      break;
    }
  }

  return result;
}

uint32_t Charset::id_from_collation_name(const std::string& collation_name)
{
  uint32_t result = 0;

  for (size_t i = 0;
    i < sizeof(m_charsets_info) / sizeof(m_charsets_info[0]);
    ++i)
  {
    if (m_charsets_info[i].collation == collation_name)
    {
      result = m_charsets_info[i].id;
      break;
    }
  }

  return result;
}

//--------------------------------------------------------------
