patch 4.0
This commit is contained in:
165
src/sql/ob_sql_character_set.cpp
Normal file
165
src/sql/ob_sql_character_set.cpp
Normal file
@ -0,0 +1,165 @@
|
||||
/**
|
||||
* Copyright (c) 2021 OceanBase
|
||||
* OceanBase CE is licensed under Mulan PubL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
||||
* You may obtain a copy of Mulan PubL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPubL-2.0
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PubL v2 for more details.
|
||||
*/
|
||||
|
||||
#include "sql/ob_sql_character_set.h"
|
||||
#include <strings.h>
|
||||
#include <stdio.h>
|
||||
#include "share/ob_define.h"
|
||||
namespace oceanbase
|
||||
{
|
||||
namespace sql
|
||||
{
|
||||
|
||||
typedef struct CharacterSet
|
||||
{
|
||||
const char *name_;
|
||||
int32_t number_;
|
||||
} ObCharacterSet;
|
||||
|
||||
typedef struct CharacterSetR
|
||||
{
|
||||
int32_t number_;
|
||||
const char *name_;
|
||||
} ObCharacterSetR;
|
||||
|
||||
static const ObCharacterSet charset[] =
|
||||
{
|
||||
{"armscii8", 32},
|
||||
{"ascii", 11},
|
||||
{"big5", 1},
|
||||
{"binary", 63},
|
||||
{"cp1250", 26},
|
||||
{"cp1251", 14},
|
||||
{"cp1256", 57},
|
||||
{"cp1257", 29},
|
||||
{"cp850", 4},
|
||||
{"cp852", 40},
|
||||
{"cp866", 36},
|
||||
{"cp932", 95},
|
||||
{"dec8", 3},
|
||||
{"eucjpms", 97},
|
||||
{"euckr", 19},
|
||||
{"gb2312", 24},
|
||||
{"gbk", 28},
|
||||
{"geostd8", 92},
|
||||
{"greek", 25},
|
||||
{"hebrew", 16},
|
||||
{"hp8", 6},
|
||||
{"keybcs2", 37},
|
||||
{"koi8r", 7},
|
||||
{"koi8u", 22},
|
||||
{"latin1", 5},
|
||||
{"latin2", 2},
|
||||
{"latin5", 30},
|
||||
{"latin7", 20},
|
||||
{"macce", 38},
|
||||
{"macroman", 39},
|
||||
{"sjis", 13},
|
||||
{"swe7", 10},
|
||||
{"tis620", 18},
|
||||
{"ucs2", 35},
|
||||
{"ujis", 12},
|
||||
{"utf8", 33}
|
||||
};
|
||||
|
||||
static const ObCharacterSetR charsetR[] =
|
||||
{
|
||||
{1, "big5"},
|
||||
{2, "latin2"},
|
||||
{3, "dec8"},
|
||||
{4, "cp850"},
|
||||
{5, "latin1"},
|
||||
{6, "hp8"},
|
||||
{7, "koi8r"},
|
||||
{10, "swe7"},
|
||||
{11, "ascii"},
|
||||
{12, "ujis"},
|
||||
{13, "sjis"},
|
||||
{14, "cp1251"},
|
||||
{16, "hebrew"},
|
||||
{18, "tis620"},
|
||||
{19, "euckr"},
|
||||
{20, "latin7"},
|
||||
{22, "koi8u"},
|
||||
{24, "gb2312"},
|
||||
{25, "greek"},
|
||||
{26, "cp1250"},
|
||||
{28, "gbk"},
|
||||
{29, "cp1257"},
|
||||
{30, "latin5"},
|
||||
{32, "armscii8"},
|
||||
{33, "utf8"},
|
||||
{35, "ucs2"},
|
||||
{36, "cp866"},
|
||||
{37, "keybcs2"},
|
||||
{38, "macce"},
|
||||
{39, "macroman"},
|
||||
{40, "cp852"},
|
||||
{57, "cp1256"},
|
||||
{63, "binary"},
|
||||
{92, "geostd8"},
|
||||
{95, "cp932"},
|
||||
{97, "eucjpms"},
|
||||
};
|
||||
|
||||
int32_t get_char_number_from_name(const common::ObString &name)
|
||||
{
|
||||
int32_t ret = 0;
|
||||
int32_t low = 0;
|
||||
int32_t high = ARRAYSIZEOF(charset) - 1;
|
||||
int cret = 0;
|
||||
while (low <= high) {
|
||||
ret = low + (high - low) / 2;
|
||||
cret = name.case_compare(charset[ret].name_);
|
||||
if (0 == cret) {
|
||||
break;
|
||||
} else if (0 > cret) {
|
||||
high = ret - 1;
|
||||
} else {
|
||||
low = ret + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (low > high) {
|
||||
ret = -1;
|
||||
} else {
|
||||
ret = charset[ret].number_;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *get_char_name_from_number(int32_t number)
|
||||
{
|
||||
const char *name = "gbk";
|
||||
int32_t ret = 0;
|
||||
int32_t low = 0;
|
||||
int32_t high = ARRAYSIZEOF(charsetR) - 1;
|
||||
while (low <= high) {
|
||||
ret = low + (high - low) / 2;
|
||||
if (charsetR[ret].number_ == number) {
|
||||
break;
|
||||
} else if (charsetR[ret].number_ > number) {
|
||||
high = ret - 1;
|
||||
} else {
|
||||
low = ret + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (low > high) {
|
||||
ret = -1;
|
||||
} else {
|
||||
name = charsetR[ret].name_;
|
||||
}
|
||||
return name;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user