Date: Monday, January 16, 2006 @ 13:51:20
Author: csaba
Path: /cvsroot/carob/libmysequoia/src
Modified: Utils.cpp (1.17 -> 1.18)
Implemented the missing conversion functions. Everything except the datetime,
date and time is ready.
-----------+
Utils.cpp | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 113 insertions(+), 3 deletions(-)
Index: libmysequoia/src/Utils.cpp
diff -u libmysequoia/src/Utils.cpp:1.17 libmysequoia/src/Utils.cpp:1.18
--- libmysequoia/src/Utils.cpp:1.17 Fri Jan 13 10:01:08 2006
+++ libmysequoia/src/Utils.cpp Mon Jan 16 13:51:20 2006
@@ -31,6 +31,8 @@
#include <mysqld_error.h>
#include <climits>
+#include <cmath>
+#include <sstream>
using namespace CarobNS;
using namespace std;
@@ -239,6 +241,27 @@
return (p != 0) && (p->mem_root.block_size == MYSEQUOIA_MAGIC);
}
+/**
+ * Convert to out_type from in_type
+ * on error return false
+ */
+template <class in_type, class out_type>
+bool convert(const in_type & t, out_type & o)
+{
+ stringstream s;
+ s << t;
+ return !(s >> o).fail();
+}
+
+/**
+ * return true if the value is not in the range (min, max)
+ * or (0, umax) for unsigned
+ */
+inline bool isTruncated(long long int value, long long int min, long long int
max, long long int umax, bool is_unsigned)
+{
+ return is_unsigned ? (value > umax) || (value < 0) : (value > max) || (value
< min);
+}
+
void getFromTiny(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
@@ -271,6 +294,8 @@
break;
case MYSQL_TYPE_STRING:
+ int len = snprintf((char *)bind->buffer, bind->buffer_length, "%hhd",
is_unsigned ? *(unsigned char *)data : *(char *)data);
+ *bind->error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
break;
case MYSQL_TYPE_TIME:
@@ -294,6 +319,8 @@
switch (bind->buffer_type)
{
case MYSQL_TYPE_TINY:
+ *(unsigned char*)bind->buffer = is_unsigned ? *(unsigned short int
*)data : *(short int *)data;
+ *bind->error = isTruncated(*(short int *)data, SCHAR_MIN, SCHAR_MAX,
UCHAR_MAX, is_unsigned);
break;
case MYSQL_TYPE_SHORT:
@@ -318,6 +345,8 @@
break;
case MYSQL_TYPE_STRING:
+ int len = snprintf((char *)bind->buffer, bind->buffer_length, "%hd",
is_unsigned ? *(unsigned short int *)data : *(short int *)data);
+ *bind->error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
break;
case MYSQL_TYPE_TIME:
@@ -341,9 +370,13 @@
switch (bind->buffer_type)
{
case MYSQL_TYPE_TINY:
+ *(unsigned char*)bind->buffer = is_unsigned ? *(unsigned int *)data :
*(int *)data;
+ *bind->error = isTruncated(*(int *)data, SCHAR_MIN, SCHAR_MAX,
UCHAR_MAX, is_unsigned);
break;
case MYSQL_TYPE_SHORT:
+ *(unsigned short int*)bind->buffer = is_unsigned ? *(unsigned int *)data
: *(int *)data;
+ *bind->error = isTruncated(*(int *)data, SHRT_MIN, SHRT_MAX, USHRT_MAX,
is_unsigned);
break;
case MYSQL_TYPE_LONG:
@@ -364,6 +397,8 @@
break;
case MYSQL_TYPE_STRING:
+ int len = snprintf((char *)bind->buffer, bind->buffer_length, "%d",
is_unsigned ? *(unsigned int *)data : *(int *)data);
+ *bind->error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
break;
case MYSQL_TYPE_TIME:
@@ -387,12 +422,18 @@
switch (bind->buffer_type)
{
case MYSQL_TYPE_TINY:
+ *(unsigned char*)bind->buffer = is_unsigned ? *(unsigned long long int
*)data : *(long long int *)data;
+ *bind->error = isTruncated(*(long long int *)data, SCHAR_MIN, SCHAR_MAX,
UCHAR_MAX, is_unsigned);
break;
case MYSQL_TYPE_SHORT:
+ *(unsigned short int*)bind->buffer = is_unsigned ? *(unsigned long long
int *)data : *(long long int *)data;
+ *bind->error = isTruncated(*(long long int *)data, SHRT_MIN, SHRT_MAX,
USHRT_MAX, is_unsigned);
break;
case MYSQL_TYPE_LONG:
+ *(unsigned int*)bind->buffer = is_unsigned ? *(unsigned long long int
*)data : *(long long int *)data;
+ *bind->error = isTruncated(*(long long int *)data, INT_MIN, INT_MAX,
UINT_MAX, is_unsigned);
break;
case MYSQL_TYPE_LONGLONG:
@@ -403,12 +444,14 @@
case MYSQL_TYPE_FLOAT:
*(float *)bind->buffer = is_unsigned ? *(unsigned long long int *)data :
*(long long int *)data;
break;
-
+
case MYSQL_TYPE_DOUBLE:
*(double *)bind->buffer = is_unsigned ? *(unsigned long long int *)data
: *(long long int *)data;
break;
case MYSQL_TYPE_STRING:
+ int len = snprintf((char *)bind->buffer, bind->buffer_length, "%lld",
is_unsigned ? *(unsigned long long int *)data : *(long long int *)data);
+ *bind->error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
break;
case MYSQL_TYPE_TIME:
@@ -427,18 +470,29 @@
void getFromFloat(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ float f = *(float *)data;
+ float ff = f < 0 ? -floorf(-f) : floorf(f);
+
switch (bind->buffer_type)
{
case MYSQL_TYPE_TINY:
+ *(unsigned char*)bind->buffer = bind->is_unsigned ? (unsigned char)f :
(char)f;
+ *bind->error = ff != (bind->is_unsigned ? (float) ((unsigned char)f) :
(float) ((char)f));
break;
case MYSQL_TYPE_SHORT:
+ *(unsigned short int*)bind->buffer = bind->is_unsigned ? (unsigned short
int)f : (short int)f;
+ *bind->error = ff != (bind->is_unsigned ? (float) ((unsigned short
int)f) : (float) ((short int)f));
break;
case MYSQL_TYPE_LONG:
+ *(unsigned int*)bind->buffer = bind->is_unsigned ? (unsigned int)f :
(int)f;
+ *bind->error = ff != (bind->is_unsigned ? (float) ((unsigned int)f) :
(float) ((int)f));
break;
case MYSQL_TYPE_LONGLONG:
+ *(unsigned long long int*)bind->buffer = bind->is_unsigned ? (unsigned
long long int)f : (long long int)f;
+ *bind->error = ff != (bind->is_unsigned ? (float) ((unsigned long long
int)f) : (float) ((long long int)f));
break;
case MYSQL_TYPE_FLOAT:
@@ -450,6 +504,8 @@
break;
case MYSQL_TYPE_STRING:
+ int len = snprintf((char *)bind->buffer, bind->buffer_length, "%.*f",
(int)field->decimals, f);
+ *bind->error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
break;
case MYSQL_TYPE_TIME:
@@ -468,28 +524,43 @@
void getFromDouble(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
{
+ double d = *(double *)data;
+ double df = d < 0 ? -floor(-d) : floorf(d);
+
switch (bind->buffer_type)
{
case MYSQL_TYPE_TINY:
+ *(unsigned char*)bind->buffer = bind->is_unsigned ? (unsigned char)d :
(char)d;
+ *bind->error = df != (bind->is_unsigned ? (double) ((unsigned char)d) :
(double) ((char)d));
break;
case MYSQL_TYPE_SHORT:
+ *(unsigned short int*)bind->buffer = bind->is_unsigned ? (unsigned short
int)d : (short int)d;
+ *bind->error = df != (bind->is_unsigned ? (double) ((unsigned short
int)d) : (double) ((short int)d));
break;
case MYSQL_TYPE_LONG:
+ *(unsigned int*)bind->buffer = bind->is_unsigned ? (unsigned int)d :
(int)d;
+ *bind->error = df != (bind->is_unsigned ? (double) ((unsigned int)d) :
(double) ((int)d));
break;
case MYSQL_TYPE_LONGLONG:
+ *(unsigned long long int*)bind->buffer = bind->is_unsigned ? (unsigned
long long int)d : (long long int)d;
+ *bind->error = df != (bind->is_unsigned ? (double) ((unsigned long long
int)d) : (double) ((long long int)d));
break;
case MYSQL_TYPE_FLOAT:
+ *(float *)bind->buffer = (float)d;
+ *bind->error = d != (double) (*(float *)bind->buffer);
break;
case MYSQL_TYPE_DOUBLE:
- *(double *)bind->buffer = *(double *)data;
+ *(double *)bind->buffer = d;
break;
case MYSQL_TYPE_STRING:
+ int len = snprintf((char *)bind->buffer, bind->buffer_length, "%.*f",
(int)field->decimals, d);
+ *bind->error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
break;
case MYSQL_TYPE_TIME:
@@ -511,25 +582,64 @@
string *s = (string *)data;
size_t s_length = s->length();
size_t length = min(s_length, (size_t)bind->buffer_length);
-
+ long long int v;
+ float f;
+ double d;
+
switch (bind->buffer_type)
{
case MYSQL_TYPE_TINY:
+ if (convert<long long int, string>(v, *s))
+ {
+ *(unsigned char *)bind->buffer = (char)v;
+ *bind->error = isTruncated(v, SCHAR_MIN, SCHAR_MAX, UCHAR_MAX,
bind->is_unsigned);
+ }
+ else
+ *bind->error = true;
break;
case MYSQL_TYPE_SHORT:
+ if (convert<long long int, string>(v, *s))
+ {
+ *(unsigned short int *)bind->buffer = (short int)v;
+ *bind->error = isTruncated(v, SHRT_MIN, SHRT_MAX, USHRT_MAX,
bind->is_unsigned);
+ }
+ else
+ *bind->error = true;
break;
case MYSQL_TYPE_LONG:
+ if (convert<long long int, string>(v, *s))
+ {
+ *(unsigned int *)bind->buffer = (int)v;
+ *bind->error = isTruncated(v, INT_MIN, INT_MAX, UINT_MAX,
bind->is_unsigned);
+ }
+ else
+ *bind->error = true;
break;
case MYSQL_TYPE_LONGLONG:
+ if (convert<long long int, string>(v, *s))
+ {
+ *(unsigned long long int *)bind->buffer = (long long int)v;
+ *bind->error = bind->is_unsigned && v < 0;
+ }
+ else
+ *bind->error = true;
break;
case MYSQL_TYPE_FLOAT:
+ if (convert<float, string>(f, *s))
+ *(float *)bind->buffer = f;
+ else
+ *bind->error = true;
break;
case MYSQL_TYPE_DOUBLE:
+ if (convert<double, string>(d, *s))
+ *(double *)bind->buffer = d;
+ else
+ *bind->error = true;
break;
case MYSQL_TYPE_STRING:
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits