fix compile error problem
This commit is contained in:
parent
2cc36baafd
commit
1199f003e9
@ -144,7 +144,7 @@ struct st_mariadb_methods MARIADB_DEFAULT_METHODS;
|
||||
#define IS_CONNHDLR_ACTIVE(mysql)\
|
||||
((mysql)->extension && (mysql)->extension->conn_hdlr)
|
||||
|
||||
// static void end_server(MYSQL *mysql);
|
||||
static void end_server(MYSQL *mysql);
|
||||
static void mysql_close_memory(MYSQL *mysql);
|
||||
void read_user_name(char *name);
|
||||
my_bool STDCALL mariadb_reconnect(MYSQL *mysql);
|
||||
@ -153,60 +153,6 @@ static int cli_report_progress(MYSQL *mysql, uchar *packet, uint length);
|
||||
extern int mysql_client_plugin_init();
|
||||
extern void mysql_client_plugin_deinit();
|
||||
|
||||
#include "ob_oralce_format_models.h"
|
||||
|
||||
|
||||
#define EXT_NLS_DATE_FORMAT(M) \
|
||||
(NULL != (M) ? (MYSQL_EXTENSION_PTR(M)->nls_date_format) : NULL)
|
||||
#define EXT_NLS_TIMESTAMP_FORMAT(M) \
|
||||
(NULL != (M) ? (MYSQL_EXTENSION_PTR(M)->nls_timestamp_format) : NULL)
|
||||
#define EXT_NLS_TIMESTAMP_TZ_FORMAT(M) \
|
||||
(NULL != (M) ? (MYSQL_EXTENSION_PTR(M)->nls_timestamp_tz_format) : NULL)
|
||||
|
||||
/*
|
||||
MYSQL::extension handling (see sql_common.h for declaration
|
||||
of st_mysql_extension structure).
|
||||
*/
|
||||
|
||||
MYSQL_EXTENSION* mysql_extension_init(MYSQL *mysql __attribute__((unused)))
|
||||
{
|
||||
MYSQL_EXTENSION *ext;
|
||||
const char *nls_date_format = "YYYY-MM-DD HH24:MI:SS";
|
||||
const char *nls_timestamp_format = "YYYY-MM-DD HH24:MI:SS.FF";
|
||||
const char *nls_timestamp_tz_format = "YYYY-MM-DD HH24:MI:SS.FF TZR TZD";
|
||||
|
||||
ext= malloc(sizeof(MYSQL_EXTENSION));
|
||||
memcpy(ext->nls_date_format, nls_date_format, strlen(nls_date_format));
|
||||
memcpy(ext->nls_timestamp_format, nls_timestamp_format, strlen(nls_timestamp_format));
|
||||
memcpy(ext->nls_timestamp_tz_format, nls_timestamp_tz_format, strlen(nls_timestamp_tz_format));
|
||||
return ext;
|
||||
}
|
||||
|
||||
|
||||
void mysql_extension_free(struct st_mysql_extension* ext)
|
||||
{
|
||||
if (!ext)
|
||||
return;
|
||||
|
||||
if (ext->mysql) {
|
||||
mysql_close(ext->mysql);
|
||||
}
|
||||
|
||||
// if (ext->complex_type_hash) {
|
||||
// my_hash_free(ext->complex_type_hash);
|
||||
// my_free(ext->complex_type_hash);
|
||||
// }
|
||||
|
||||
// if (ext->trace_data)
|
||||
// my_free(ext->trace_data);
|
||||
|
||||
// // free state change related resources.
|
||||
// free_state_change_info(ext);
|
||||
|
||||
free(ext);
|
||||
}
|
||||
|
||||
|
||||
/* net_get_error */
|
||||
void net_get_error(char *buf, size_t buf_len,
|
||||
char *error, size_t error_len,
|
||||
@ -541,7 +487,7 @@ int ma_multi_command(MYSQL *mysql, enum enum_multi_status status)
|
||||
}
|
||||
}
|
||||
|
||||
void free_old_query(MYSQL *mysql)
|
||||
static void free_old_query(MYSQL *mysql)
|
||||
{
|
||||
if (mysql->fields)
|
||||
ma_free_root(&mysql->field_alloc,MYF(0));
|
||||
@ -600,7 +546,8 @@ void read_user_name(char *name)
|
||||
/**************************************************************************
|
||||
** Shut down connection
|
||||
**************************************************************************/
|
||||
void
|
||||
|
||||
static void
|
||||
end_server(MYSQL *mysql)
|
||||
{
|
||||
/* if net->error 2 and reconnect is activated, we need to inforn
|
||||
@ -959,12 +906,9 @@ unpack_fields(const MYSQL *mysql,
|
||||
p+= 2;
|
||||
field->decimals= (uint) p[0];
|
||||
p++;
|
||||
//use the filler to support oracle precision
|
||||
field->precision= (uint) p[0];
|
||||
p++;
|
||||
field->ob_routine_param_inout= (enum ObRoutineParamInOut) (p[0] & 0x3);
|
||||
field->is_implicit_rowid= (p[0] & 0x4) > 0 ? TRUE : FALSE;
|
||||
p++;
|
||||
|
||||
/* filler */
|
||||
p+= 2;
|
||||
|
||||
if (INTERNAL_NUM_FIELD(field))
|
||||
field->flags|= NUM_FLAG;
|
||||
@ -989,478 +933,8 @@ error:
|
||||
ma_free_root(alloc, MYF(0));
|
||||
return(0);
|
||||
}
|
||||
/* Read all rows (data) from server */
|
||||
static const char digits[]= "0123456789abcdef";
|
||||
|
||||
char *my_safe_ultoa(int base, ulong val, char *buf, uint length, my_bool need_zero)
|
||||
{
|
||||
char *start = buf;
|
||||
|
||||
if (length <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buf = start + length - 1;
|
||||
do {
|
||||
*buf--= digits[val % base];
|
||||
} while ((val /= base) != 0 && buf >= start);
|
||||
|
||||
while (need_zero && buf >= start) {
|
||||
*buf--= '0';
|
||||
}
|
||||
|
||||
return buf + 1;
|
||||
}
|
||||
|
||||
char *my_safe_ltoa(int base, long val, char *buf, uint length, my_bool need_zero)
|
||||
{
|
||||
const my_bool is_neg= (val < 0);
|
||||
|
||||
if (length <= 1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (is_neg) {
|
||||
val= -val;
|
||||
}
|
||||
|
||||
buf = my_safe_ultoa(base, (ulong)val, buf + 1, length - 1, need_zero);
|
||||
buf--;
|
||||
|
||||
if (is_neg) {
|
||||
*buf--= '-';
|
||||
} else {
|
||||
*buf--= '+';
|
||||
}
|
||||
|
||||
return buf + 1;
|
||||
}
|
||||
|
||||
uchar* get_nls_format(MYSQL *mysql, enum_field_types type)
|
||||
{
|
||||
uchar *mysql_nls = NULL;
|
||||
|
||||
if (type == MYSQL_TYPE_DATETIME) {
|
||||
mysql_nls = EXT_NLS_DATE_FORMAT(mysql);
|
||||
} else if (type == MYSQL_TYPE_OB_TIMESTAMP_NANO || type == MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE) {
|
||||
mysql_nls = EXT_NLS_TIMESTAMP_FORMAT(mysql);
|
||||
} else if (type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE) {
|
||||
mysql_nls = EXT_NLS_TIMESTAMP_TZ_FORMAT(mysql);
|
||||
}
|
||||
|
||||
return mysql_nls;
|
||||
}
|
||||
|
||||
|
||||
//2019-01-01 12:12:12
|
||||
void oracle_date_to_ob_time(struct ObTime *ob_time, uchar *cp, ulong len)
|
||||
{
|
||||
char *start = (char *)cp;
|
||||
char *end = (char *)cp + len;
|
||||
char *pos = NULL;
|
||||
|
||||
ob_time->time_zone_id_ = -1;
|
||||
|
||||
if (len > 0) {
|
||||
pos = end;
|
||||
ob_time->parts_[DT_YEAR] = strtol(start, &pos, 10);
|
||||
if (*pos == '-' && end - pos > 1) {
|
||||
start = pos + 1;
|
||||
pos = end;
|
||||
ob_time->parts_[DT_MON] = strtol(start, &pos, 10);
|
||||
if (*pos == '-' && end - pos > 1) {
|
||||
start = pos + 1;
|
||||
pos = end;
|
||||
ob_time->parts_[DT_MDAY] = strtol(start, &pos, 10);
|
||||
if (*pos == ' ' && end - pos > 1) {
|
||||
start = pos + 1;
|
||||
pos = end;
|
||||
ob_time->parts_[DT_HOUR] = strtol(start, &pos, 10);
|
||||
if (*pos == ':' && end - pos > 1) {
|
||||
start = pos + 1;
|
||||
pos = end;
|
||||
ob_time->parts_[DT_MIN] = strtol(start, &pos, 10);
|
||||
if (*pos == ':' && end - pos > 1) {
|
||||
int error;
|
||||
start = pos + 1;
|
||||
pos = end;
|
||||
ob_time->parts_[DT_SEC] = strtoll10(start, &pos, &error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void oracle_timestamp_to_ob_time(struct ObTime *ob_time, uchar *cp, enum_field_types type)
|
||||
{
|
||||
uint century_offset = 0;
|
||||
uint year_offset = 1;
|
||||
uint mon_offset = 2;
|
||||
|
||||
uint nano_max_len = 9; //nano only need 9 digit, example: 000000001
|
||||
uint nano_offset = 7;
|
||||
uint nano_scale_offset = 11;
|
||||
|
||||
uint hour_offset = 12;
|
||||
uint min_offset = 13;
|
||||
|
||||
uint tz_name_offset = 14;
|
||||
uint tz_m = 0;
|
||||
uint tz_n = 0;
|
||||
|
||||
int8_t sign = 1;
|
||||
uint i = 0;
|
||||
|
||||
if (*(char*)(cp + century_offset) < 0 || *(char*)(cp + year_offset) < 0) {
|
||||
sign = -1;
|
||||
}
|
||||
ob_time->parts_[DT_YEAR] = sign * (abs((*(char *)(cp + century_offset))) * 100 + abs(*(char *)(cp + year_offset)));
|
||||
|
||||
for (; i <= 5; i++) {
|
||||
ob_time->parts_[DT_MON + i] = *(char *)(cp + mon_offset + i);
|
||||
}
|
||||
|
||||
ob_time->parts_[DT_USEC] = uint4korr(cp + nano_offset);
|
||||
ob_time->parts_[DT_DATE] = ob_time_to_date(ob_time);
|
||||
|
||||
//uint trans to string and fill zero, example: 000110000
|
||||
ob_time->nano_scale_ = *(cp + nano_scale_offset);
|
||||
|
||||
//calculate space for nano, include zero before nano
|
||||
if (ob_time->nano_scale_ > nano_max_len) {
|
||||
ob_time->nano_scale_ = nano_max_len;
|
||||
}
|
||||
|
||||
ob_time->time_zone_id_ = -1;
|
||||
if (type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE) {
|
||||
sign = 1;
|
||||
if (*(char*)(cp + hour_offset) < 0 || *(char*)(cp + min_offset) < 0) {
|
||||
sign = -1;
|
||||
}
|
||||
ob_time->parts_[DT_OFFSET_MIN] = sign * (abs((*(int8_t *)(cp + hour_offset))) * 60 + abs(*(int8_t *)(cp + min_offset)));
|
||||
|
||||
tz_m = *(cp + tz_name_offset);
|
||||
tz_n = *(cp + tz_name_offset + 1 + tz_m);
|
||||
if (tz_m > 0) {
|
||||
ob_time->time_zone_id_ = 0;
|
||||
memcpy(ob_time->tz_name_, cp + tz_name_offset + 1, tz_m);
|
||||
if (tz_n > 0) {
|
||||
memcpy(ob_time->tzd_abbr_, cp + tz_name_offset + 1 + tz_m + 1, tz_n);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ulong calculate_new_time_length_with_nls(MYSQL *mysql, uchar *cp, ulong len, enum_field_types type)
|
||||
{
|
||||
struct ObTime ob_time;
|
||||
uchar *mysql_nls = NULL;
|
||||
int64_t length = 0;
|
||||
|
||||
memset(&ob_time, 0, sizeof(struct ObTime));
|
||||
ob_time.mode_ |= DT_TYPE_ORACLE;
|
||||
|
||||
if (type == MYSQL_TYPE_OB_TIMESTAMP_NANO
|
||||
|| type == MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE
|
||||
|| type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE) {
|
||||
oracle_timestamp_to_ob_time(&ob_time, cp, type);
|
||||
} else {
|
||||
oracle_date_to_ob_time(&ob_time, cp, len);
|
||||
}
|
||||
|
||||
if (type == MYSQL_TYPE_DATETIME) {
|
||||
mysql_nls = EXT_NLS_DATE_FORMAT(mysql);
|
||||
} else if (type == MYSQL_TYPE_OB_TIMESTAMP_NANO || type == MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE) {
|
||||
mysql_nls = EXT_NLS_TIMESTAMP_FORMAT(mysql);
|
||||
} else if (type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE) {
|
||||
mysql_nls = EXT_NLS_TIMESTAMP_TZ_FORMAT(mysql);
|
||||
}
|
||||
|
||||
calculate_str_oracle_dfm_length(&ob_time, (char *)mysql_nls, strlen((char *)mysql_nls), ob_time.nano_scale_, &length);
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
//The search starts with a short gallop favoring small numbers,
|
||||
//after which it goes into a hand-woven binary search.
|
||||
inline uint fast_digits10(ulong v)
|
||||
{
|
||||
static const ulong MAX_INTEGER[13] = {
|
||||
0,
|
||||
10,
|
||||
100,
|
||||
1000,
|
||||
10000,
|
||||
100000,
|
||||
1000000,
|
||||
10000000,
|
||||
100000000,
|
||||
1000000000,
|
||||
10000000000,
|
||||
100000000000,
|
||||
1000000000000,
|
||||
};
|
||||
uint ret_int = 0;
|
||||
if (v < MAX_INTEGER[1]) {
|
||||
ret_int = 1;
|
||||
} else if (v < MAX_INTEGER[2]) {
|
||||
ret_int = 2;
|
||||
} else if (v < MAX_INTEGER[3]) {
|
||||
ret_int = 3;
|
||||
} else if (v < MAX_INTEGER[12]) {
|
||||
if (v < MAX_INTEGER[8]) {
|
||||
if (v < MAX_INTEGER[6]) {
|
||||
if (v < MAX_INTEGER[4]) {
|
||||
ret_int = 4;
|
||||
} else {
|
||||
ret_int = 5 + (v >= MAX_INTEGER[5]);
|
||||
}
|
||||
} else {
|
||||
ret_int = 7 + (v >= MAX_INTEGER[7]);
|
||||
}
|
||||
} else if (v < MAX_INTEGER[10]) {
|
||||
ret_int = 9 + (v >= MAX_INTEGER[9]);
|
||||
} else {
|
||||
ret_int = 11 + (v >= MAX_INTEGER[11]);
|
||||
}
|
||||
} else {
|
||||
ret_int = 12 + fast_digits10(v / MAX_INTEGER[12]);
|
||||
}
|
||||
return ret_int;
|
||||
}
|
||||
|
||||
|
||||
ulong calculate_interval_length(uchar *cp, enum_field_types type)
|
||||
{
|
||||
ulong convert_len = 0;
|
||||
|
||||
const ulong MIN_YM_LEN = 7;
|
||||
const ulong MIN_DS_LEN = 14;
|
||||
const ulong MIN_YS_FORMAT_LEN = 6 - 2;//%c%0?d-%02d
|
||||
const ulong MIN_DS_FORMAT_LEN_PART1 = 12 - 2;//%c%0?d %02d:%02d:%02d
|
||||
const ulong MIN_DS_FORMAT_LEN_PART2 = 3 - 2;//.%0?d
|
||||
|
||||
if (type == MYSQL_TYPE_OB_INTERVAL_YM) {
|
||||
const uint32 year_digit_cnt = fast_digits10(uint4korr(cp + 1));
|
||||
const uint8_t year_scale = cp[6];
|
||||
if (year_digit_cnt > year_scale) {
|
||||
convert_len = MIN_YS_FORMAT_LEN + year_digit_cnt;
|
||||
} else {
|
||||
convert_len = MIN_YS_FORMAT_LEN + year_scale;
|
||||
}
|
||||
if (convert_len < MIN_YM_LEN) {
|
||||
convert_len = MIN_YM_LEN;
|
||||
}
|
||||
} else {
|
||||
const uint32 day_digit_cnt = fast_digits10(uint4korr(cp + 1));
|
||||
const uint32 fs_digit_cnt = fast_digits10(uint4korr(cp + 8));
|
||||
const uint8_t day_scale = cp[12];
|
||||
const int8_t fs_scale = cp[13];
|
||||
if (day_digit_cnt > (uint32)day_scale) {
|
||||
convert_len = MIN_DS_FORMAT_LEN_PART1 + day_digit_cnt;
|
||||
} else {
|
||||
convert_len = MIN_DS_FORMAT_LEN_PART1 + day_scale;
|
||||
}
|
||||
if (fs_scale > 0) {
|
||||
convert_len += MIN_DS_FORMAT_LEN_PART2;
|
||||
if (fs_digit_cnt > (uint32)fs_scale) {
|
||||
convert_len += fs_digit_cnt;
|
||||
} else {
|
||||
convert_len += fs_scale;
|
||||
}
|
||||
}
|
||||
if (convert_len < MIN_DS_LEN) {
|
||||
convert_len = MIN_DS_LEN;
|
||||
}
|
||||
}
|
||||
return convert_len;
|
||||
}
|
||||
|
||||
ulong rewrite_new_time_with_nls(MYSQL *mysql, uchar *cp, ulong len, char *to, int64_t buf_len, enum_field_types type)
|
||||
{
|
||||
struct ObTime ob_time;
|
||||
uchar *mysql_nls = NULL;
|
||||
int64_t pos = 0;
|
||||
|
||||
memset(&ob_time, 0, sizeof(struct ObTime));
|
||||
ob_time.mode_ |= DT_TYPE_ORACLE;
|
||||
|
||||
if (type == MYSQL_TYPE_OB_TIMESTAMP_NANO
|
||||
|| type == MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE
|
||||
|| type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE) {
|
||||
oracle_timestamp_to_ob_time(&ob_time, cp, type);
|
||||
} else {
|
||||
oracle_date_to_ob_time(&ob_time, cp, len);
|
||||
}
|
||||
|
||||
if (type == MYSQL_TYPE_DATETIME) {
|
||||
mysql_nls = EXT_NLS_DATE_FORMAT(mysql);
|
||||
} else if (type == MYSQL_TYPE_OB_TIMESTAMP_NANO || type == MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE) {
|
||||
mysql_nls = EXT_NLS_TIMESTAMP_FORMAT(mysql);
|
||||
} else if (type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE) {
|
||||
mysql_nls = EXT_NLS_TIMESTAMP_TZ_FORMAT(mysql);
|
||||
}
|
||||
|
||||
ob_time_to_str_oracle_dfm(&ob_time, (char *)mysql_nls, strlen((char *)mysql_nls), ob_time.nano_scale_, to, buf_len, &pos);
|
||||
|
||||
return pos;
|
||||
}
|
||||
static const char separator[]= "-- ::.";
|
||||
|
||||
ulong rewrite_new_time(uchar *cp, char *to, enum_field_types type)
|
||||
{
|
||||
ulong convert_len = 20; //2012-12-02 12:34:56.
|
||||
|
||||
char nano_buffer[10] = "\0";
|
||||
uint nano_max_len = 9; //nano only need 9 digit, example: 000000001
|
||||
uint nano_offset = 7;
|
||||
uint nano_scale;
|
||||
uint nano_scale_offset = 11;
|
||||
|
||||
uint tz_name_offset = 14;
|
||||
uint tz_m = 0;
|
||||
uint tz_n = 0;
|
||||
|
||||
uint hour_offset = 12;
|
||||
uint min_offset = 13;
|
||||
|
||||
uint i;
|
||||
|
||||
//rewrite the fix data, example: 2012-12-02 12:34:56.
|
||||
my_safe_ultoa(10, *cp, to, 2, TRUE);
|
||||
to += 2;
|
||||
|
||||
for (i = 0; i <= 5; i++) {
|
||||
my_safe_ultoa(10, *(cp + 1 + i), to, 2, TRUE);
|
||||
to += 2;
|
||||
memcpy(to++, separator + i, 1);
|
||||
}
|
||||
|
||||
//rewrite nano
|
||||
nano_scale = *(cp + nano_scale_offset);
|
||||
if (0 != nano_scale) {
|
||||
if (nano_scale > nano_max_len) {
|
||||
nano_scale = nano_max_len;
|
||||
}
|
||||
|
||||
my_safe_ultoa(10, uint4korr(cp + nano_offset), nano_buffer, nano_max_len, TRUE);
|
||||
memcpy(to, nano_buffer, nano_scale);
|
||||
convert_len += nano_scale;
|
||||
to += nano_scale;
|
||||
}
|
||||
|
||||
if (type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE) {
|
||||
memcpy(to++, " ", 1);
|
||||
convert_len += 1;
|
||||
|
||||
tz_m = *(cp + tz_name_offset);
|
||||
tz_n = *(cp + tz_name_offset + 1 + tz_m);
|
||||
if (tz_m > 0) {
|
||||
memcpy(to, cp + tz_name_offset + 1, tz_m);
|
||||
convert_len += tz_m;
|
||||
to += tz_m;
|
||||
if (tz_n > 0) {
|
||||
memcpy(to++, " ", 1);
|
||||
convert_len += 1;
|
||||
|
||||
memcpy(to, cp + tz_name_offset + 1 + tz_m + 1, tz_n);
|
||||
convert_len += tz_n;
|
||||
to += tz_n;
|
||||
}
|
||||
} else {
|
||||
// +/-08:00
|
||||
if (*(char*)(cp + hour_offset) < 0 || *(char*)(cp + min_offset) < 0) {
|
||||
memcpy(to++, "-", 1);
|
||||
} else {
|
||||
memcpy(to++, "+", 1);
|
||||
}
|
||||
convert_len += 1;
|
||||
|
||||
my_safe_ultoa(10, abs(*(char*)(cp + hour_offset)), to, 2, TRUE);
|
||||
convert_len += 2;
|
||||
to += 2;
|
||||
|
||||
memcpy(to++, ":", 1);
|
||||
convert_len += 1;
|
||||
|
||||
my_safe_ultoa(10, abs(*(char*)(cp + min_offset)), to, 2, TRUE);
|
||||
convert_len += 2;
|
||||
to += 2;
|
||||
}
|
||||
}
|
||||
|
||||
return convert_len;
|
||||
}
|
||||
|
||||
|
||||
int rewrite_interval(uchar *cp, char *to, const uint to_size, ulong *convert_len, enum_field_types type)
|
||||
{
|
||||
int wlen = 0;
|
||||
*convert_len = 0;
|
||||
|
||||
if (type == MYSQL_TYPE_OB_INTERVAL_YM) {
|
||||
char format_str[] = "%02u";
|
||||
const int scale_idx = 2;
|
||||
|
||||
to[0] = (cp[0] > 0 ? '-' : '+');
|
||||
*convert_len = 1;
|
||||
|
||||
format_str[scale_idx] = (char)('0' + cp[6]);
|
||||
wlen = snprintf(to + *convert_len, to_size, format_str,
|
||||
uint4korr(cp + 1));
|
||||
if (wlen <= 0) {
|
||||
return 0;
|
||||
} else {
|
||||
(*convert_len) += wlen;
|
||||
to[*convert_len] = '-';
|
||||
my_safe_ultoa(10, cp[5], to + *convert_len + 1, 2, TRUE);
|
||||
(*convert_len) += 3;
|
||||
}
|
||||
} else {
|
||||
char format_str_part1[] = "%02u";
|
||||
const int day_scale_idx = 2;
|
||||
int8 fs_scale = 0;
|
||||
|
||||
to[0] = (cp[0] > 0 ? '-' : '+');
|
||||
*convert_len = 1;
|
||||
|
||||
format_str_part1[day_scale_idx] = (char)('0' + cp[12]);
|
||||
wlen = snprintf(to + *convert_len, to_size, format_str_part1,
|
||||
uint4korr(cp + 1));
|
||||
if (wlen <= 0) {
|
||||
return 0;
|
||||
} else {
|
||||
(*convert_len) += wlen;
|
||||
to[*convert_len] = ' ';
|
||||
my_safe_ultoa(10, cp[5], to + *convert_len + 1, 2, TRUE);
|
||||
to[*convert_len + 3] = ':';
|
||||
my_safe_ultoa(10, cp[6], to + *convert_len + 4, 2, TRUE);
|
||||
to[*convert_len + 6] = ':';
|
||||
my_safe_ultoa(10, cp[7], to + *convert_len + 7, 2, TRUE);
|
||||
(*convert_len) += 9;
|
||||
}
|
||||
|
||||
fs_scale = cp[13];
|
||||
if (fs_scale > 0) {
|
||||
char nano_buffer[10] = {0};
|
||||
const int8 nano_max_len = 9; //nano only need 9 digit, example: 000000001
|
||||
|
||||
to[*convert_len] = '.';
|
||||
(*convert_len) += 1;
|
||||
|
||||
if (fs_scale > nano_max_len) {
|
||||
fs_scale = nano_max_len;
|
||||
}
|
||||
|
||||
my_safe_ultoa(10, uint4korr(cp + 8), nano_buffer, nano_max_len, TRUE);
|
||||
memcpy(to + *convert_len, nano_buffer, fs_scale);
|
||||
(*convert_len) += fs_scale;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/* Read all rows (fields or data) from server */
|
||||
|
||||
MYSQL_DATA *mthd_my_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
|
||||
@ -1475,8 +949,6 @@ MYSQL_DATA *mthd_my_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
|
||||
MYSQL_ROWS **prev_ptr,*cur;
|
||||
NET *net = &mysql->net;
|
||||
|
||||
ulong convert_len;
|
||||
|
||||
if ((pkt_len= ma_net_safe_read(mysql)) == packet_error)
|
||||
return(0);
|
||||
if (!(result=(MYSQL_DATA*) calloc(1, sizeof(MYSQL_DATA))))
|
||||
@ -1492,35 +964,6 @@ MYSQL_DATA *mthd_my_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
|
||||
|
||||
while (*(cp=net->read_pos) != 254 || pkt_len >= 8)
|
||||
{
|
||||
if (mysql_fields) {
|
||||
for (field=0 ; field < fields ; field++) {
|
||||
if ((len=(ulong) net_field_length(&cp)) == NULL_LENGTH) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//calculate the space for new type
|
||||
if (mysql->oracle_mode
|
||||
&& (mysql_fields[field].type == MYSQL_TYPE_DATETIME
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_NANO
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE)) {
|
||||
convert_len = calculate_new_time_length_with_nls(mysql, cp, len, mysql_fields[field].type);
|
||||
//already include '/0' in the end
|
||||
pkt_len = pkt_len - len + convert_len;
|
||||
} else if (mysql_fields[field].type == MYSQL_TYPE_OB_RAW) {
|
||||
convert_len = len * 2;
|
||||
//already include '/0' in the end
|
||||
pkt_len = pkt_len - len + convert_len;
|
||||
} else if (mysql_fields[field].type == MYSQL_TYPE_OB_INTERVAL_YM
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_INTERVAL_DS) {
|
||||
convert_len = calculate_interval_length(cp, mysql_fields[field].type);
|
||||
//already include '/0' in the end
|
||||
pkt_len = pkt_len - len + convert_len;
|
||||
}
|
||||
cp+=len;
|
||||
}
|
||||
}
|
||||
cp = net->read_pos;
|
||||
result->rows++;
|
||||
if (!(cur= (MYSQL_ROWS*) ma_alloc_root(&result->alloc,
|
||||
sizeof(MYSQL_ROWS))) ||
|
||||
@ -1544,66 +987,21 @@ MYSQL_DATA *mthd_my_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
|
||||
}
|
||||
else
|
||||
{
|
||||
int is_done = 0;
|
||||
|
||||
cur->data[field] = to;
|
||||
if ((len > (ulong)(end_to - to) || to > end_to)
|
||||
&& !(mysql->oracle_mode
|
||||
&& (mysql_fields[field].type == MYSQL_TYPE_DATETIME
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_NANO
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE)))
|
||||
if (len > (ulong)(end_to - to) || to > end_to)
|
||||
{
|
||||
free_rows(result);
|
||||
SET_CLIENT_ERROR(mysql, CR_UNKNOWN_ERROR, SQLSTATE_UNKNOWN, 0);
|
||||
return(0);
|
||||
}
|
||||
if (mysql_fields) {
|
||||
if (mysql->oracle_mode
|
||||
&& (mysql_fields[field].type == MYSQL_TYPE_DATETIME
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_NANO
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_WITH_LOCAL_TIME_ZONE
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_TIMESTAMP_WITH_TIME_ZONE)) {
|
||||
convert_len = rewrite_new_time_with_nls(mysql, cp, len, to, end_to - to + 1, mysql_fields[field].type);
|
||||
to[convert_len]=0;
|
||||
to+=convert_len+1;
|
||||
cp+=len;
|
||||
len = convert_len;
|
||||
is_done = 1;
|
||||
} else if (mysql_fields[field].type == MYSQL_TYPE_OB_RAW) {
|
||||
uchar *end = cp + len;
|
||||
for(; cp < end; cp++, to+=2) {
|
||||
sprintf(to, "%02X", *((uchar*)cp));
|
||||
}
|
||||
|
||||
(*to++)=0;
|
||||
len *= 2;
|
||||
is_done = 1;
|
||||
} else if (mysql_fields[field].type == MYSQL_TYPE_OB_INTERVAL_YM
|
||||
|| mysql_fields[field].type == MYSQL_TYPE_OB_INTERVAL_DS) {
|
||||
if (!rewrite_interval(cp, to, (uint)(end_to - to), &convert_len, mysql_fields[field].type)) {
|
||||
free_rows(result);
|
||||
return (0);
|
||||
}
|
||||
to[convert_len]=0;
|
||||
to+=convert_len+1;
|
||||
cp+=len;
|
||||
len = convert_len;
|
||||
is_done = 1;
|
||||
}
|
||||
}
|
||||
if (!is_done) {
|
||||
memcpy(to,(char*) cp,len); to[len]=0;
|
||||
to+=len+1;
|
||||
cp+=len;
|
||||
is_done = 1;
|
||||
}
|
||||
|
||||
memcpy(to,(char*) cp,len); to[len]=0;
|
||||
to+=len+1;
|
||||
cp+=len;
|
||||
if (mysql_fields)
|
||||
{
|
||||
if (mysql_fields[field].max_length < len)
|
||||
mysql_fields[field].max_length=len;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cur->data[field]=to; /* End of last field */
|
||||
@ -1704,13 +1102,6 @@ mysql_init(MYSQL *mysql)
|
||||
mysql->net.extension= 0;
|
||||
}
|
||||
|
||||
/* Initialize extensions. */
|
||||
if (!(mysql->ob_extension= mysql_extension_init(mysql)))
|
||||
{
|
||||
SET_CLIENT_ERROR(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(mysql->net.extension= (struct st_mariadb_net_extension *)
|
||||
calloc(1, sizeof(struct st_mariadb_net_extension))) ||
|
||||
!(mysql->extension= (struct st_mariadb_extension *)
|
||||
@ -1938,47 +1329,6 @@ mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
|
||||
#endif
|
||||
}
|
||||
|
||||
static unsigned long mysql_get_version_tool(const char* version_str)
|
||||
{
|
||||
unsigned long major= 0, minor= 0, version= 0;
|
||||
|
||||
if (version_str)
|
||||
{
|
||||
char *pos= version_str, *end_pos;
|
||||
major= strtoul(pos, &end_pos, 10); pos=end_pos+1;
|
||||
minor= strtoul(pos, &end_pos, 10); pos=end_pos+1;
|
||||
version= strtoul(pos, &end_pos, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
// set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
|
||||
}
|
||||
return major*10000 + minor*100 + version;
|
||||
}
|
||||
static void get_ob_server_version(MYSQL *con)
|
||||
{
|
||||
/* Only one thread calls this, so no synchronization is needed */
|
||||
MYSQL_RES *result;
|
||||
|
||||
/* "limit 1" is protection against SQL_SELECT_LIMIT=0 */
|
||||
char const *sql = con->oracle_mode ? "select @@version_comment, @@version from dual where rownum <= 1" : "select @@version_comment, @@version limit 1";
|
||||
if (!mysql_query(con, sql) &&
|
||||
(result = mysql_use_result(con)))
|
||||
{
|
||||
MYSQL_ROW cur = mysql_fetch_row(result);
|
||||
if (cur && cur[0] && cur[1])
|
||||
{
|
||||
// only get ob server version
|
||||
if (strlen(cur[0]) > 9 && strncasecmp(cur[0], "OceanBase", 9) == 0)
|
||||
{
|
||||
con->ob_server_version = mysql_get_version_tool(cur[1]);
|
||||
}
|
||||
}
|
||||
mysql_free_result(result);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user,
|
||||
const char *passwd, const char *db,
|
||||
uint port, const char *unix_socket, unsigned long client_flag)
|
||||
@ -2316,8 +1666,7 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user,
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
get_ob_server_version(mysql);
|
||||
determine_use_prepare_execute(mysql);
|
||||
|
||||
if (mysql->options.init_command)
|
||||
{
|
||||
char **begin= (char **)mysql->options.init_command->buffer;
|
||||
@ -2801,8 +2150,6 @@ int ma_read_ok_packet(MYSQL *mysql, uchar *pos, ulong length)
|
||||
{
|
||||
uchar *end= mysql->net.read_pos+length;
|
||||
size_t item_len;
|
||||
enum enum_nls_time_type nls_time_type;
|
||||
uchar *mysql_nls = NULL;
|
||||
mysql->affected_rows= net_field_length_ll(&pos);
|
||||
mysql->insert_id= net_field_length_ll(&pos);
|
||||
mysql->server_status=uint2korr(pos);
|
||||
@ -2898,15 +2245,6 @@ int ma_read_ok_packet(MYSQL *mysql, uchar *pos, ulong length)
|
||||
/* make sure that we update charset in case it has changed */
|
||||
if (!strncmp(str->str, "character_set_client", str->length))
|
||||
set_charset= 1;
|
||||
if (!strncmp(str->str, "nls_date_format", str->length)) {
|
||||
nls_time_type = NLS_DATE_FORMAT;
|
||||
} else if(!strncmp(str->str, "nls_timestamp_format", str->length)) {
|
||||
nls_time_type = NLS_TIMESTAMP_FORMAT;
|
||||
} else if (!strncmp(str->str, "nls_timestamp_tz_format", str->length)) {
|
||||
nls_time_type = NLS_TIMESTAMP_TZ_FORMAT;
|
||||
} else {
|
||||
nls_time_type = NLS_TIME_MAX;
|
||||
}
|
||||
plen= net_field_length(&pos);
|
||||
if (pos + plen > end)
|
||||
goto corrupted;
|
||||
@ -2932,17 +2270,6 @@ int ma_read_ok_packet(MYSQL *mysql, uchar *pos, ulong length)
|
||||
if ((cs_info = mysql_find_charset_name(cs_name)))
|
||||
mysql->charset= cs_info;
|
||||
}
|
||||
if (nls_time_type >= NLS_DATE_FORMAT && nls_time_type < NLS_TIME_MAX) {
|
||||
if (nls_time_type == NLS_DATE_FORMAT) {
|
||||
mysql_nls = EXT_NLS_DATE_FORMAT(mysql);
|
||||
} else if (nls_time_type == NLS_TIMESTAMP_FORMAT) {
|
||||
mysql_nls = EXT_NLS_TIMESTAMP_FORMAT(mysql);
|
||||
} else if (nls_time_type == NLS_TIMESTAMP_TZ_FORMAT) {
|
||||
mysql_nls = EXT_NLS_TIMESTAMP_TZ_FORMAT(mysql);
|
||||
}
|
||||
memcpy(mysql_nls, str->str, str->length);
|
||||
mysql_nls[str->length] = '\0';
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -4210,11 +3537,6 @@ MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res)
|
||||
return (res)->fields;
|
||||
}
|
||||
|
||||
MYSQL_FIELD * STDCALL mysql_fetch_params(MYSQL_RES *res)
|
||||
{
|
||||
return (res)->param_fields;
|
||||
}
|
||||
|
||||
MYSQL_ROWS * STDCALL mysql_row_tell(MYSQL_RES *res)
|
||||
{
|
||||
return res->data_cursor;
|
||||
@ -4569,7 +3891,7 @@ mysql_get_server_name(MYSQL *mysql)
|
||||
if (mysql->options.extension &&
|
||||
mysql->options.extension->db_driver != NULL)
|
||||
return mysql->options.extension->db_driver->name;
|
||||
return mariadb_connection(mysql) ? "MariaDB" : "Oceanbase";
|
||||
return mariadb_connection(mysql) ? "MariaDB" : "MySQL";
|
||||
}
|
||||
|
||||
static my_socket mariadb_get_socket(MYSQL *mysql)
|
||||
|
Loading…
x
Reference in New Issue
Block a user