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

Reply via email to