Date: Thursday, January 12, 2006 @ 16:21:22
  Author: csaba
    Path: /cvsroot/carob/libmysequoia

Modified: include/Utils.hpp (1.12 -> 1.13) src/Utils.cpp (1.12 -> 1.13)

Implicit conversion between different mysql data type done.


-------------------+
 include/Utils.hpp |   14 +
 src/Utils.cpp     |  472 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 470 insertions(+), 16 deletions(-)


Index: libmysequoia/include/Utils.hpp
diff -u libmysequoia/include/Utils.hpp:1.12 libmysequoia/include/Utils.hpp:1.13
--- libmysequoia/include/Utils.hpp:1.12 Tue Jan 10 12:22:44 2006
+++ libmysequoia/include/Utils.hpp      Thu Jan 12 16:21:22 2006
@@ -107,4 +107,18 @@
 bool isCarobObject(MYSQL *p);
 bool isCarobObject(MYSQL_STMT *p);
 
+/**
+ * Data conversion functions between different MySQL data types
+ */
+void getFromTiny(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromShort(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromLong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromLonglong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromFloat(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromDouble(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromString(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromDate(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+void getFromDateTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data);
+
 #endif /* _UTILS_HPP */
Index: libmysequoia/src/Utils.cpp
diff -u libmysequoia/src/Utils.cpp:1.12 libmysequoia/src/Utils.cpp:1.13
--- libmysequoia/src/Utils.cpp:1.12     Thu Jan 12 10:14:09 2006
+++ libmysequoia/src/Utils.cpp  Thu Jan 12 16:21:22 2006
@@ -30,7 +30,10 @@
 #include <errmsg.h>
 #include <mysqld_error.h>
 
+#include <climits>
+
 using namespace CarobNS;
+using namespace std;
 
 const char *error_sqlstate[]=
 {
@@ -236,63 +239,499 @@
   return (p != 0) && (p->mem_root.block_size == MYSEQUOIA_MAGIC);
 }
 
-void getFromDecimal(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
-{
-}
-
 void getFromTiny(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+  *bind->error = bind->is_unsigned != is_unsigned;
+    
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      if (is_unsigned)
+        *(unsigned char *)bind->buffer = *(unsigned char *)data;
+      else
+        *(char *)bind->buffer = *(char *)data;
+      *bind->error = *bind->error && *(unsigned char *)data > SCHAR_MAX;
+      break;
+
+    case MYSQL_TYPE_SHORT:
+      if (is_unsigned)
+        *(unsigned short int *)bind->buffer = *(unsigned char *)data;
+      else
+        *(short int *)bind->buffer = *(char *)data;
+      break;
+    
+    case MYSQL_TYPE_LONG:
+      if (is_unsigned)
+        *(unsigned int *)bind->buffer = *(unsigned char *)data;
+      else
+        *(int *)bind->buffer = *(char *)data;
+      break;
+      
+    case MYSQL_TYPE_LONGLONG:
+      if (is_unsigned)
+        *(unsigned long long int *)bind->buffer = *(unsigned char *)data;
+      else
+        *(long long int *)bind->buffer = *(char *)data;
+      break;
+      
+    case MYSQL_TYPE_FLOAT:
+      *(float *)bind->buffer = is_unsigned ? *(unsigned char *)data : *(char 
*)data;
+      break;
+      
+    case MYSQL_TYPE_DOUBLE:
+      *(double *)bind->buffer = is_unsigned ? *(unsigned char *)data : *(char 
*)data;
+      break;
+      
+    case MYSQL_TYPE_STRING:
+      break;
+    
+    case MYSQL_TYPE_TIME:
+      break;
+    
+    case MYSQL_TYPE_DATE:
+      break;
+      
+    case MYSQL_TYPE_DATETIME:
+      break;
+      
+    default:
+      break;
+  }
 }
 
 void getFromShort(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+  *bind->error = bind->is_unsigned != is_unsigned;
+    
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      if (is_unsigned)
+        *(unsigned short int *)bind->buffer = *(unsigned short int *)data;
+      else
+        *(short int *)bind->buffer = *(short int *)data;
+      *bind->error = *bind->error && *(unsigned short int *)data > SHRT_MAX;
+      break;
+
+    case MYSQL_TYPE_LONG:
+      if (is_unsigned)
+        *(unsigned int *)bind->buffer = *(unsigned short int *)data;
+      else
+        *(int *)bind->buffer = *(short int *)data;
+      break;
+
+    case MYSQL_TYPE_LONGLONG:
+      if (is_unsigned)
+        *(unsigned long long int *)bind->buffer = *(unsigned short int *)data;
+      else
+        *(long long int *)bind->buffer = *(short int *)data;
+      break;
+
+    case MYSQL_TYPE_FLOAT:
+      *(float *)bind->buffer = is_unsigned ? *(unsigned short int *)data : 
*(short int *)data;
+      break;
+      
+    case MYSQL_TYPE_DOUBLE:
+      *(double *)bind->buffer = is_unsigned ? *(unsigned short int *)data : 
*(short int *)data;
+      break;
+      
+    case MYSQL_TYPE_STRING:
+      break;
+
+    case MYSQL_TYPE_TIME:
+      break;
+
+    case MYSQL_TYPE_DATE:
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      break;
+
+    default:
+      break;
+  }    
 }
 
 void getFromLong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+  *bind->error = bind->is_unsigned != is_unsigned;
+    
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      break;
+
+    case MYSQL_TYPE_LONG:
+      if (is_unsigned)
+        *(unsigned int *)bind->buffer = *(unsigned int *)data;
+      else
+        *(int *)bind->buffer = *(int *)data;
+      *bind->error = *bind->error && *(unsigned int *)data > INT_MAX;
+      break;
+
+    case MYSQL_TYPE_LONGLONG:
+      if (is_unsigned)
+        *(unsigned long long int *)bind->buffer = *(unsigned int *)data;
+      else
+        *(long long int *)bind->buffer = *(int *)data;
+      break;
+
+    case MYSQL_TYPE_FLOAT:
+      *(float *)bind->buffer = is_unsigned ? *(unsigned int *)data : *(int 
*)data;
+      break;
+      
+    case MYSQL_TYPE_DOUBLE:
+      *(double *)bind->buffer = is_unsigned ? *(unsigned int *)data : *(int 
*)data;
+      break;
+      
+    case MYSQL_TYPE_STRING:
+      break;
+
+    case MYSQL_TYPE_TIME:
+      break;
+
+    case MYSQL_TYPE_DATE:
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      break;
+
+    default:
+      break;
+  }    
+}
+
+void getFromLonglong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+{
+  bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+  *bind->error = bind->is_unsigned != is_unsigned;
+
   switch (bind->buffer_type)
   {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      break;
+
     case MYSQL_TYPE_LONG:
-      *(int *)bind->buffer = *(int *)data;
       break;
+
+    case MYSQL_TYPE_LONGLONG:
+      if (is_unsigned)
+        *(unsigned long long int *)bind->buffer = *(unsigned long long int 
*)data;
+      else
+        *(long long int *)bind->buffer = *(long long int *)data;
+      *bind->error = *bind->error && *(unsigned long long int *)data > 
LONG_MAX;
+      break;
+
+    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:
+      break;
+
+    case MYSQL_TYPE_TIME:
+      break;
+
+    case MYSQL_TYPE_DATE:
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      break;
+
     default:
       break;
-  }
+  }      
 }
 
 void getFromFloat(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+  *bind->error = bind->is_unsigned != is_unsigned;
+
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      break;
+
+    case MYSQL_TYPE_LONG:
+      break;
+
+    case MYSQL_TYPE_LONGLONG:
+      break;
+
+    case MYSQL_TYPE_FLOAT:
+      *(float *)bind->buffer = *(float *)data;
+      break;
+      
+    case MYSQL_TYPE_DOUBLE:
+      *(double *)bind->buffer = *(float *)data;
+      break;
+      
+    case MYSQL_TYPE_STRING:
+      break;
+
+    case MYSQL_TYPE_TIME:
+      break;
+
+    case MYSQL_TYPE_DATE:
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      break;
+
+    default:
+      break;
+  }
 }
 
 void getFromDouble(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
+
+  *bind->error = bind->is_unsigned != is_unsigned;
+
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      break;
+
+    case MYSQL_TYPE_LONG:
+      break;
+
+    case MYSQL_TYPE_LONGLONG:
+      break;
+
+    case MYSQL_TYPE_FLOAT:
+      break;
+
+    case MYSQL_TYPE_DOUBLE:
+      *(double *)bind->buffer = *(double *)data;
+      break;
+      
+    case MYSQL_TYPE_STRING:
+      break;
+
+    case MYSQL_TYPE_TIME:
+      break;
+
+    case MYSQL_TYPE_DATE:
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      break;
+
+    default:
+      break;
+  }
 }
 
-void getFromNull(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromString(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  string *s = (string *)data;
+  size_t s_length = s->length();
+  size_t length = min(s_length, (size_t)bind->buffer_length);
+  
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      break;
+
+    case MYSQL_TYPE_LONG:
+      break;
+
+    case MYSQL_TYPE_LONGLONG:
+      break;
+
+    case MYSQL_TYPE_FLOAT:
+      break;
+
+    case MYSQL_TYPE_DOUBLE:
+      break;
+
+    case MYSQL_TYPE_STRING:
+        memcpy(bind->buffer, s->data(), length);
+        if (length < bind->buffer_length)
+          ((char *)bind->buffer)[length] = '\0';
+        *bind->length = s_length;
+        *bind->error = length < s_length;
+      break;
+
+    case MYSQL_TYPE_TIME:
+      break;
+
+    case MYSQL_TYPE_DATE:
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      break;
+      
+    default:
+      break;
+  }
 }
 
-void getFromTimestamp(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      break;
+
+    case MYSQL_TYPE_LONG:
+      break;
+
+    case MYSQL_TYPE_LONGLONG:
+      break;
+
+    case MYSQL_TYPE_FLOAT:
+      break;
+
+    case MYSQL_TYPE_DOUBLE:
+      break;
+
+    case MYSQL_TYPE_STRING:
+      break;
+
+    case MYSQL_TYPE_TIME:
+      *(MYSQL_TIME *)bind->buffer = *(MYSQL_TIME *)data;
+      break;
+
+    case MYSQL_TYPE_DATE:
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      break;
+
+    default:
+      break;
+  }
 }
 
-void getFromLonglong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromDate(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      break;
+
+    case MYSQL_TYPE_LONG:
+      break;
+
+    case MYSQL_TYPE_LONGLONG:
+      break;
+
+    case MYSQL_TYPE_FLOAT:
+      break;
+
+    case MYSQL_TYPE_DOUBLE:
+      break;
+
+    case MYSQL_TYPE_STRING:
+      break;
+
+    case MYSQL_TYPE_TIME:
+      break;
+
+    case MYSQL_TYPE_DATE:
+      *(MYSQL_TIME *)bind->buffer = *(MYSQL_TIME *)data;
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      break;
+
+    default:
+      break;
+  }
 }
 
-void getFromInt24(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromDateTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
+  switch (bind->buffer_type)
+  {
+    case MYSQL_TYPE_TINY:
+      break;
+      
+    case MYSQL_TYPE_SHORT:
+      break;
+
+    case MYSQL_TYPE_LONG:
+      break;
+
+    case MYSQL_TYPE_LONGLONG:
+      break;
+
+    case MYSQL_TYPE_FLOAT:
+      break;
+
+    case MYSQL_TYPE_DOUBLE:
+      break;
+
+    case MYSQL_TYPE_STRING:
+      break;
+
+    case MYSQL_TYPE_TIME:
+      break;
+
+    case MYSQL_TYPE_DATE:
+      break;
+
+    case MYSQL_TYPE_DATETIME:
+      *(MYSQL_TIME *)bind->buffer = *(MYSQL_TIME *)data;
+      break;
+
+    default:
+      break;
+  }
 }
 
-void getFromDate(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+/* 
+ * TODO Not yet implemented conversion functions!!!
+ * 
+void getFromNull(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
 }
 
-void getFromTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromTimestamp(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
 }
 
-void getFromDateTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromInt24(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
 }
 
@@ -344,10 +783,11 @@
 {
 }
 
-void getFromString(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromGeometry(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
 }
 
-void getFromGeometry(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
+void getFromDecimal(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
-}
\ No newline at end of file
+}
+*/

_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits

Reply via email to