summaryrefslogtreecommitdiff
path: root/libmysql
diff options
context:
space:
mode:
Diffstat (limited to 'libmysql')
-rw-r--r--libmysql/libmysql.c95
-rw-r--r--libmysql/libmysql.def1
-rw-r--r--libmysql/manager.c2
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)
{