diff options
Diffstat (limited to 'libmysql')
-rw-r--r-- | libmysql/libmysql.c | 95 | ||||
-rw-r--r-- | libmysql/libmysql.def | 1 | ||||
-rw-r--r-- | libmysql/manager.c | 2 |
3 files changed, 56 insertions, 42 deletions
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 2ad6771cc69..deb09c856ec 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -1516,6 +1516,16 @@ uint STDCALL mysql_thread_safe(void) #endif } + +my_bool STDCALL mysql_embedded(void) +{ +#ifdef EMBEDDED_LIBRARY + return 1; +#else + return 0; +#endif +} + /**************************************************************************** Some support functions ****************************************************************************/ @@ -3196,24 +3206,20 @@ mysql_stmt_send_long_data(MYSQL_STMT *stmt, uint param_number, read_binary_{date,time,datetime}() tm MYSQL_TIME structure to fill pos pointer to current position in network buffer. - These functions increase pos to point to the beginning of this - field (this is just due to implementation of net_field_length - which is used to get length of binary representation of - time value). + These functions increase pos to point to the beginning of the + next column. Auxiliary functions to read time (date, datetime) values from network buffer and store in MYSQL_TIME structure. Jointly used by conversion and no-conversion fetching. */ -static uint read_binary_time(MYSQL_TIME *tm, uchar **pos) +static void read_binary_time(MYSQL_TIME *tm, uchar **pos) { - uint length; - /* net_field_length will set pos to the first byte of data */ - if (!(length= net_field_length(pos))) - set_zero_time(tm); - else + uint length= net_field_length(pos); + + if (length) { uchar *to= *pos; tm->neg= (bool) to[0]; @@ -3226,17 +3232,18 @@ static uint read_binary_time(MYSQL_TIME *tm, uchar **pos) tm->year= tm->month= 0; tm->time_type= MYSQL_TIMESTAMP_TIME; + + *pos+= length; } - return length; + else + set_zero_time(tm); } -static uint read_binary_datetime(MYSQL_TIME *tm, uchar **pos) +static void read_binary_datetime(MYSQL_TIME *tm, uchar **pos) { - uint length; + uint length= net_field_length(pos); - if (!(length= net_field_length(pos))) - set_zero_time(tm); - else + if (length) { uchar *to= *pos; @@ -3255,17 +3262,18 @@ static uint read_binary_datetime(MYSQL_TIME *tm, uchar **pos) tm->hour= tm->minute= tm->second= 0; tm->second_part= (length > 7) ? (ulong) sint4korr(to+7) : 0; tm->time_type= MYSQL_TIMESTAMP_DATETIME; + + *pos+= length; } - return length; + else + set_zero_time(tm); } -static uint read_binary_date(MYSQL_TIME *tm, uchar **pos) +static void read_binary_date(MYSQL_TIME *tm, uchar **pos) { - uint length; + uint length= net_field_length(pos); - if (!(length= net_field_length(pos))) - set_zero_time(tm); - else + if (length) { uchar *to= *pos; tm->year = (uint) sint2korr(to); @@ -3276,8 +3284,11 @@ static uint read_binary_date(MYSQL_TIME *tm, uchar **pos) tm->second_part= 0; tm->neg= 0; tm->time_type= MYSQL_TIMESTAMP_DATE; + + *pos+= length; } - return length; + else + set_zero_time(tm); } @@ -3604,18 +3615,18 @@ static void fetch_datetime_with_conversion(MYSQL_BIND *param, static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, uchar **row) { - ulong length; enum enum_field_types field_type= field->type; uint field_is_unsigned= field->flags & UNSIGNED_FLAG; switch (field_type) { case MYSQL_TYPE_TINY: { - char value= (char) **row; - longlong data= field_is_unsigned ? (longlong) (unsigned char) value : - (longlong) value; + uchar value= **row; + /* sic: we need to cast to 'signed char' as 'char' may be unsigned */ + longlong data= field_is_unsigned ? (longlong) value : + (longlong) (signed char) value; fetch_long_with_conversion(param, field, data); - length= 1; + *row+= 1; break; } case MYSQL_TYPE_SHORT: @@ -3625,7 +3636,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, longlong data= field_is_unsigned ? (longlong) (unsigned short) value : (longlong) value; fetch_long_with_conversion(param, field, data); - length= 2; + *row+= 2; break; } case MYSQL_TYPE_INT24: /* mediumint is sent as 4 bytes int */ @@ -3635,14 +3646,14 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, longlong data= field_is_unsigned ? (longlong) (unsigned long) value : (longlong) value; fetch_long_with_conversion(param, field, data); - length= 4; + *row+= 4; break; } case MYSQL_TYPE_LONGLONG: { longlong value= (longlong)sint8korr(*row); fetch_long_with_conversion(param, field, value); - length= 8; + *row+= 8; break; } case MYSQL_TYPE_FLOAT: @@ -3650,7 +3661,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, float value; float4get(value,*row); fetch_float_with_conversion(param, field, value, FLT_DIG); - length= 4; + *row+= 4; break; } case MYSQL_TYPE_DOUBLE: @@ -3658,14 +3669,14 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, double value; float8get(value,*row); fetch_float_with_conversion(param, field, value, DBL_DIG); - length= 8; + *row+= 8; break; } case MYSQL_TYPE_DATE: { MYSQL_TIME tm; - length= read_binary_date(&tm, row); + read_binary_date(&tm, row); fetch_datetime_with_conversion(param, &tm); break; } @@ -3673,7 +3684,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, { MYSQL_TIME tm; - length= read_binary_time(&tm, row); + read_binary_time(&tm, row); fetch_datetime_with_conversion(param, &tm); break; } @@ -3682,16 +3693,18 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, { MYSQL_TIME tm; - length= read_binary_datetime(&tm, row); + read_binary_datetime(&tm, row); fetch_datetime_with_conversion(param, &tm); break; } default: - length= net_field_length(row); + { + ulong length= net_field_length(row); fetch_string_with_conversion(param, (char*) *row, length); + *row+= length; break; } - *row+= length; + } } @@ -3760,19 +3773,19 @@ static void fetch_result_double(MYSQL_BIND *param, uchar **row) static void fetch_result_time(MYSQL_BIND *param, uchar **row) { MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer; - *row+= read_binary_time(tm, row); + read_binary_time(tm, row); } static void fetch_result_date(MYSQL_BIND *param, uchar **row) { MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer; - *row+= read_binary_date(tm, row); + read_binary_date(tm, row); } static void fetch_result_datetime(MYSQL_BIND *param, uchar **row) { MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer; - *row+= read_binary_datetime(tm, row); + read_binary_datetime(tm, row); } static void fetch_result_bin(MYSQL_BIND *param, uchar **row) diff --git a/libmysql/libmysql.def b/libmysql/libmysql.def index 38ac9505e4b..bc91e90a41c 100644 --- a/libmysql/libmysql.def +++ b/libmysql/libmysql.def @@ -144,3 +144,4 @@ EXPORTS mysql_rpl_probe mysql_rpl_query_type mysql_slave_query + mysql_embedded diff --git a/libmysql/manager.c b/libmysql/manager.c index f030eb17889..631bfa26cb2 100644 --- a/libmysql/manager.c +++ b/libmysql/manager.c @@ -237,7 +237,7 @@ int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con, char* res_buf, char* res_buf_end=res_buf+res_buf_size; char* net_buf=(char*) con->net.read_pos, *net_buf_end; int res_buf_shift=RES_BUF_SHIFT; - uint num_bytes; + ulong num_bytes; if (res_buf_size<RES_BUF_SHIFT) { |