Date: Monday, January 30, 2006 @ 13:45:57
  Author: zsolt
    Path: /cvsroot/carob/libmysequoia

Modified: include/CarobMySQL.hpp (1.22 -> 1.23) include/mysql_wrapper.h
          (1.1 -> 1.2) src/CarobCommon.cpp (1.3 -> 1.4) src/CarobMySQL.cpp
          (1.38 -> 1.39) src/CarobStmt.cpp (1.17 -> 1.18) src/MySQLAPI.cpp
          (1.34 -> 1.35) src/Utils.cpp (1.30 -> 1.31)

Backport to mysql 4.1.16. Now the library can be compiled with mysql 4.1


-------------------------+
 include/CarobMySQL.hpp  |    4 
 include/mysql_wrapper.h |    8 +
 src/CarobCommon.cpp     |    7 -
 src/CarobMySQL.cpp      |   19 ++-
 src/CarobStmt.cpp       |   77 +++++++++++++--
 src/MySQLAPI.cpp        |   24 +++-
 src/Utils.cpp           |  234 +++++++++++++++++++++++++++++-----------------
 7 files changed, 260 insertions(+), 113 deletions(-)


Index: libmysequoia/include/CarobMySQL.hpp
diff -u libmysequoia/include/CarobMySQL.hpp:1.22 
libmysequoia/include/CarobMySQL.hpp:1.23
--- libmysequoia/include/CarobMySQL.hpp:1.22    Wed Jan 25 09:46:24 2006
+++ libmysequoia/include/CarobMySQL.hpp Mon Jan 30 13:45:56 2006
@@ -38,10 +38,6 @@
 
 const unsigned long MYSEQUOIA_MAGIC = 0xC00CA10B;
 
-#define CAROB_MYSQL_CLIENT_INFO "5.0.15";
-#define CAROB_MYSQL_CLIENT_VERSION 50015;
-#define PROTOCOL_VERSION 10
-
 #define LOGGER_CONFIG_FILE "logger.cfg"
 
 class CarobMYSQL : public CarobCommon
Index: libmysequoia/include/mysql_wrapper.h
diff -u libmysequoia/include/mysql_wrapper.h:1.1 
libmysequoia/include/mysql_wrapper.h:1.2
--- libmysequoia/include/mysql_wrapper.h:1.1    Tue Jan 10 12:22:44 2006
+++ libmysequoia/include/mysql_wrapper.h        Mon Jan 30 13:45:56 2006
@@ -4,4 +4,12 @@
 #define USE_OLD_FUNCTIONS
 #include <mysql.h>
 
+#if MYSQL_VERSION_ID >= 50000
+#define MYSQL5
+#else
+#define ER_ERROR_FIRST 1000
+#define ER_ERROR_LAST 1302
+#define MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_DECIMAL
+#endif
+
 #endif /*_MYSQL_WRAPPER_H*/
Index: libmysequoia/src/CarobCommon.cpp
diff -u libmysequoia/src/CarobCommon.cpp:1.3 
libmysequoia/src/CarobCommon.cpp:1.4
--- libmysequoia/src/CarobCommon.cpp:1.3        Thu Jan 26 16:42:35 2006
+++ libmysequoia/src/CarobCommon.cpp    Mon Jan 30 13:45:56 2006
@@ -61,8 +61,11 @@
                     (colPtr->type == MYSQL_TYPE_BLOB ? BLOB_FLAG : 0) |
                     (IS_NUM(colPtr->type) && colPtr->type != 
MYSQL_TYPE_TIMESTAMP && 
                       colPtr->type != MYSQL_TYPE_NULL ? NUM_FLAG : 0) | 
-                    (colPtr->type == MYSQL_TYPE_TIMESTAMP ? TIMESTAMP_FLAG : 
0) | 
-                    NO_DEFAULT_VALUE_FLAG;
+                    (colPtr->type == MYSQL_TYPE_TIMESTAMP ? TIMESTAMP_FLAG : 
0) 
+#ifdef MYSQL5
+                    | NO_DEFAULT_VALUE_FLAG
+#endif
+                    ;
   }
   
   LOG4CXX_DEBUG(logger, "Leaving get_query_fields.");
Index: libmysequoia/src/CarobMySQL.cpp
diff -u libmysequoia/src/CarobMySQL.cpp:1.38 
libmysequoia/src/CarobMySQL.cpp:1.39
--- libmysequoia/src/CarobMySQL.cpp:1.38        Fri Jan 27 14:37:33 2006
+++ libmysequoia/src/CarobMySQL.cpp     Mon Jan 30 13:45:56 2006
@@ -41,6 +41,7 @@
    connectionPtr(0), stmtPtr(0), drsPtr(0), liveResultPtr(0)
 {
   LOG4CXX_DEBUG(logger, "Entering constructor.");
+  static char version[6];
     
   /* initialize the mysql structure */
   memset(mysql, 0, sizeof(MYSQL));
@@ -48,7 +49,8 @@
   mysql->field_alloc.block_size = MYSEQUOIA_MAGIC;
   mysql->free_me = free_me;
   //TODO maybe a real server version string ???
-  mysql->server_version = "50018";
+  snprintf(version, sizeof(version), "%ud", MYSQL_VERSION_ID);
+  mysql->server_version = version;
   mysql->protocol_version = PROTOCOL_VERSION;
   // TODO fill in other required mysql fields
 
@@ -112,7 +114,7 @@
 
   if (unix_socket)
   {
-    set_error(CR_NOT_IMPLEMENTED, SQLT_UNKNOWN);
+    set_error(CR_SOCKET_CREATE_ERROR, SQLT_UNKNOWN);
     LOG4CXX_DEBUG(logger, "Leaving connect.");
     return false;
   }
@@ -360,8 +362,10 @@
         mysqlPtr->affected_rows = result->row_count;
         mysqlPtr->fields = result->fields;
       }
+#ifdef MYSQL5
       else
         set_error(CR_NO_RESULT_SET, SQLT_UNKNOWN);
+#endif
 
       LOG4CXX_DEBUG(logger, "Leaving get_results.");
       return result;
@@ -753,9 +757,14 @@
   memset(&b, 0, sizeof(b));
   b.buffer = &buffer;
   b.buffer_length = sizeof(buffer);
+#ifdef MYSQL5
   b.is_null = &b.is_null_value;
   b.error = &b.error_value;
   b.length = &b.length_value;
+#else
+  b.is_null = &b.internal_is_null;
+  b.length = &b.internal_length;
+#endif
   b.buffer_type = MYSQL_TYPE_STRING;
 
   for (unsigned i=0; i<field_count; i++, fPtr++)
@@ -770,13 +779,13 @@
           lData = drsPtr->getAsInt(i+1);
           getFromTime(&b,fPtr,&lData);
           result += buffer;
-          field_len = b.length_value;
+          field_len = *b.length;
           break;
         case MYSQL_TYPE_DATE:
           lData = drsPtr->getAsInt64(i+1);
           getFromDate(&b,fPtr,&lData);
           result += buffer;
-          field_len = b.length_value;
+          field_len = *b.length;
           break;
         case MYSQL_TYPE_DATETIME:
           //TODO when Carob implements Timestamp, change this
@@ -784,7 +793,7 @@
           lData = 0;
           getFromTime(&b,fPtr,&lData);
           result += buffer;
-          field_len = b.length_value;
+          field_len = *b.length;
           break;
         default:
           tmp = toString(drsPtr->getAsString(i+1));
Index: libmysequoia/src/CarobStmt.cpp
diff -u libmysequoia/src/CarobStmt.cpp:1.17 libmysequoia/src/CarobStmt.cpp:1.18
--- libmysequoia/src/CarobStmt.cpp:1.17 Fri Jan 27 14:37:33 2006
+++ libmysequoia/src/CarobStmt.cpp      Mon Jan 30 13:45:56 2006
@@ -51,7 +51,9 @@
   m_stmt->mem_root.used = (USED_MEM *) this;
   m_stmt->mem_root.block_size = MYSEQUOIA_MAGIC;
   m_stmt->mysql = mysql;
+#ifdef MYSQL5
   m_stmt->prefetch_rows = 1;
+#endif
   m_stmt->state = MYSQL_STMT_INIT_DONE;
   
   cmysql = (CarobMYSQL *)mysql->field_alloc.used;
@@ -133,12 +135,20 @@
     {
       if (!p->is_null)
       {
-        p->is_null= &p->is_null_value;
-        p->is_null_value = false;
+#ifdef MYSQL5
+        p->is_null = &p->is_null_value;
+#else
+        p->is_null = &p->internal_is_null;
+#endif
+        *p->is_null = false;
       }
 
       p->long_data_used = 0;
+#ifdef MYSQL5
       p->row_ptr = 0;
+#else
+      p->inter_buffer = 0;
+#endif
       p->param_number = no-1;
       
       switch (p->buffer_type)
@@ -153,7 +163,6 @@
         case MYSQL_TYPE_MEDIUM_BLOB:
         case MYSQL_TYPE_LONG_BLOB:
         case MYSQL_TYPE_BLOB:
-        case MYSQL_TYPE_VARCHAR:
         case MYSQL_TYPE_VAR_STRING:
         case MYSQL_TYPE_STRING:
         case MYSQL_TYPE_TIME:
@@ -161,7 +170,10 @@
         case MYSQL_TYPE_DATETIME:
         case MYSQL_TYPE_TIMESTAMP:
         case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5        
+        case MYSQL_TYPE_VARCHAR:
         case MYSQL_TYPE_NEWDECIMAL:
+#endif
         case MYSQL_TYPE_NULL:
           break;
         default:
@@ -200,9 +212,17 @@
         if (!bind->long_data_used)
         {
           bind->long_data_used = 1;
+#ifdef MYSQL5          
           bind->row_ptr = (unsigned char *)new string;
+#else
+          bind->inter_buffer = (unsigned char *)new string;
+#endif
         }
+#ifdef MYSQL5          
         ((string *)(bind->row_ptr))->append(data, length);
+#else
+        ((string *)(bind->inter_buffer))->append(data, length);
+#endif
       }
       else
         set_error(CR_INVALID_BUFFER_USE, SQLT_UNKNOWN);
@@ -224,7 +244,11 @@
       set_error(CR_PARAMS_NOT_BOUND, SQLT_UNKNOWN);
     else
     {
+#ifdef MYSQL5
       set_fetch_size(m_stmt->prefetch_rows);
+#else
+      set_fetch_size(1);
+#endif
 
       try
       {
@@ -255,16 +279,23 @@
                 c_stmt->setDouble(no, *(double *)p->buffer);
                 break;
               case MYSQL_TYPE_DECIMAL:
-              case MYSQL_TYPE_NEWDECIMAL:
               case MYSQL_TYPE_TINY_BLOB:
               case MYSQL_TYPE_MEDIUM_BLOB:
               case MYSQL_TYPE_LONG_BLOB:
               case MYSQL_TYPE_BLOB:
+#ifdef MYSQL5
+              case MYSQL_TYPE_NEWDECIMAL:
               case MYSQL_TYPE_VARCHAR:
+#endif
               case MYSQL_TYPE_VAR_STRING:
               case MYSQL_TYPE_STRING:
+#ifdef MYSQL5
                 if (p->long_data_used && p->row_ptr)
                   c_stmt->setString(no, fromString(*(string *)(p->row_ptr)));
+#else                  
+                if (p->long_data_used && p->inter_buffer)
+                  c_stmt->setString(no, fromString(*(string 
*)(p->inter_buffer)));
+#endif                  
                 else
                   c_stmt->setString(no, fromString(string((char *)p->buffer, 
p->buffer_length)));
                 break;
@@ -351,11 +382,13 @@
         case MYSQL_TYPE_MEDIUM_BLOB:
         case MYSQL_TYPE_LONG_BLOB:
         case MYSQL_TYPE_BLOB:
-        case MYSQL_TYPE_VARCHAR:
         case MYSQL_TYPE_VAR_STRING:
         case MYSQL_TYPE_STRING:
         case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
+        case MYSQL_TYPE_VARCHAR:
         case MYSQL_TYPE_NEWDECIMAL:
+#endif     
         case MYSQL_TYPE_TIME:
         case MYSQL_TYPE_DATE:
         case MYSQL_TYPE_DATETIME:
@@ -370,9 +403,11 @@
     }
 
     if (!result)
+#ifdef MYSQL5
       if (m_stmt->mysql->options.report_data_truncation)
         m_stmt->bind_result_done = DATA_TRUNCATED;
       else
+#endif
         m_stmt->bind_result_done = DATA_NORMAL;
   }
   
@@ -385,7 +420,9 @@
 {
   LOG4CXX_DEBUG(logger, "Entering fetch.");
   int result = 0;
+#ifdef MYSQL5
   bool truncation = false;
+#endif
   
   if (!m_stmt->bind_result_done || (m_stmt->state < MYSQL_STMT_EXECUTE_DONE))
   {
@@ -403,7 +440,9 @@
       {
         fetch_field(fPtr, bPtr, colNo);
 
+#ifdef MYSQL5
         truncation |= *bPtr->error;
+#endif
       }
       
       if (m_stmt->result.data)
@@ -414,8 +453,10 @@
         m_stmt->affected_rows = m_stmt->result.rows;
       }
       
+#ifdef MYSQL5
       if (truncation && (m_stmt->bind_result_done == DATA_TRUNCATED))
         result = MYSQL_DATA_TRUNCATED;
+#endif
 
       m_stmt->state = MYSQL_STMT_FETCH_DONE;
     }
@@ -559,14 +600,24 @@
 void
 CarobStmt::link_bind(MYSQL_BIND *bind)
 {
+#ifdef MYSQL5
   if (!bind->error)
     bind->error = &bind->error_value;
+#endif
           
   if (!bind->is_null)
+#ifdef MYSQL5
     bind->is_null = &bind->is_null_value;
+#else
+    bind->is_null = &bind->internal_is_null;
+#endif
     
   if (!bind->length)
+#ifdef MYSQL5
     bind->length = &bind->length_value;
+#else
+    bind->length = &bind->internal_length;
+#endif
 }
 
 void
@@ -611,11 +662,13 @@
       case MYSQL_TYPE_MEDIUM_BLOB:
       case MYSQL_TYPE_LONG_BLOB:
       case MYSQL_TYPE_BLOB:
-      case MYSQL_TYPE_VARCHAR:
       case MYSQL_TYPE_VAR_STRING:
       case MYSQL_TYPE_STRING:
       case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
+      case MYSQL_TYPE_VARCHAR:
       case MYSQL_TYPE_NEWDECIMAL:
+#endif
         if ((m_stmt->update_max_length) && (((string *)buffer)->length() > 
fPtr->max_length))
           fPtr->max_length = ((string *)buffer)->length();
         getFromString(bPtr, fPtr, buffer);
@@ -674,11 +727,13 @@
       case MYSQL_TYPE_MEDIUM_BLOB:
       case MYSQL_TYPE_LONG_BLOB:
       case MYSQL_TYPE_BLOB:
-      case MYSQL_TYPE_VARCHAR:
       case MYSQL_TYPE_VAR_STRING:
       case MYSQL_TYPE_STRING:
       case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
+      case MYSQL_TYPE_VARCHAR:
       case MYSQL_TYPE_NEWDECIMAL:
+#endif
         result = new string(toString(liveResultSet->getAsString(colNo)));
         break;
       case MYSQL_TYPE_TIME:
@@ -736,11 +791,13 @@
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
     case MYSQL_TYPE_BLOB:
-    case MYSQL_TYPE_VARCHAR:
     case MYSQL_TYPE_VAR_STRING:
     case MYSQL_TYPE_STRING:
     case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
+    case MYSQL_TYPE_VARCHAR:
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
       delete (string *)buffer;
       break;
     case MYSQL_TYPE_DATETIME:
@@ -784,7 +841,11 @@
       if (params->long_data_used)
       {
         params->long_data_used = 0;
+#ifdef MYSQL5
         delete (string *)(params->row_ptr);
+#else
+        delete (string *)(params->inter_buffer);
+#endif
       }
   }
 }
Index: libmysequoia/src/MySQLAPI.cpp
diff -u libmysequoia/src/MySQLAPI.cpp:1.34 libmysequoia/src/MySQLAPI.cpp:1.35
--- libmysequoia/src/MySQLAPI.cpp:1.34  Thu Jan 26 11:56:28 2006
+++ libmysequoia/src/MySQLAPI.cpp       Mon Jan 30 13:45:56 2006
@@ -278,8 +278,10 @@
       //Because sequoia has only one timeout we set this two together
       mysql->options.read_timeout = mysql->options.write_timeout = *(unsigned 
int *) arg;
       break;
+#ifdef MYSQL5
     case MYSQL_REPORT_DATA_TRUNCATION:
       mysql->options.report_data_truncation = *(my_bool *) arg;
+#endif
     //Unsupported options ... they are set, but not used in any way
     case MYSQL_OPT_CONNECT_TIMEOUT:
       mysql->options.connect_timeout = *(unsigned int *) arg;
@@ -296,9 +298,11 @@
       else
         mysql->options.client_flag &= ~CLIENT_LOCAL_FILES;
       break;
+#ifdef MYSQL5
     case MYSQL_OPT_RECONNECT:
       mysql->reconnect = *(my_bool *) arg;
       break;
+#endif
     //Options that are never will be supported
     case MYSQL_OPT_NAMED_PIPE:
     case MYSQL_SET_CHARSET_DIR:
@@ -964,8 +968,8 @@
 mysql_get_client_info (void)
 {
   LOG4CXX_DEBUG(logger, "Entering mysql_get_client_info.");
-  LOG4CXX_DEBUG(logger, "Leaving mysql_get_client_info.");
-  return CAROB_MYSQL_CLIENT_INFO;
+  LOG4CXX_DEBUG(logger, "Leaving mysql_get_client_info: result = " << 
MYSQL_SERVER_VERSION);
+  return  MYSQL_SERVER_VERSION;
 }
 
 /* Returns client version information as an integer. */
@@ -973,8 +977,8 @@
 mysql_get_client_version (void)
 {
   LOG4CXX_DEBUG(logger, "Entering mysql_get_client_version.");
-  LOG4CXX_DEBUG(logger, "Leaving mysql_get_client_version.");
-  return CAROB_MYSQL_CLIENT_VERSION;
+  LOG4CXX_DEBUG(logger, "Leaving mysql_get_client_version: result = " << 
MYSQL_VERSION_ID);
+  return MYSQL_VERSION_ID;
 }
 
 /* Returns a string describing the connection. */
@@ -995,7 +999,7 @@
 {
   LOG4CXX_DEBUG(logger, "Entering mysql_get_server_info: mysql=" << mysql);
 
-  const char *result = mysql ? mysql->server_version : 0;
+  const char *result = mysql ? MYSQL_SERVER_VERSION : 0;
   
   LOG4CXX_DEBUG(logger, "Leaving mysql_get_server_info: result=" << result);
   return result;
@@ -1198,7 +1202,8 @@
       case STMT_ATTR_UPDATE_MAX_LENGTH:
         *(my_bool *)arg = stmt->update_max_length;
         break;
-  
+
+#ifdef MYSQL5  
       case STMT_ATTR_CURSOR_TYPE:
         *(ulong *)arg = stmt->flags;
         break;
@@ -1206,7 +1211,8 @@
       case STMT_ATTR_PREFETCH_ROWS:
         *(ulong *)arg = stmt->prefetch_rows;
         break;
-  
+#endif
+
       default:
         result = true;
     }
@@ -1239,6 +1245,7 @@
         stmt->update_max_length = arg ? *(my_bool *)arg : false;
         break;
   
+#ifdef MYSQL5
       case STMT_ATTR_CURSOR_TYPE:
         ulong flags;
         flags = arg ? *(ulong *)arg : (ulong) CURSOR_TYPE_NO_CURSOR;
@@ -1259,7 +1266,8 @@
         else
           result = true;
         break;
-  
+#endif
+
       default:
         result = true;
     }
Index: libmysequoia/src/Utils.cpp
diff -u libmysequoia/src/Utils.cpp:1.30 libmysequoia/src/Utils.cpp:1.31
--- libmysequoia/src/Utils.cpp:1.30     Fri Jan 27 14:37:33 2006
+++ libmysequoia/src/Utils.cpp  Mon Jan 30 13:45:56 2006
@@ -176,9 +176,11 @@
 {
   switch (sqltype)
   {
+#ifdef MYSQL5
     case SQLT_BIT:
       return MYSQL_TYPE_BIT;
       break;
+#endif
     case SQLT_BOOLEAN:
     case SQLT_TINYINT:
       return MYSQL_TYPE_TINY;
@@ -303,14 +305,14 @@
 {
   bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
   int64_t time = *(char *)data;
-      
-  *bind->error = 0;
 
+  bool error = 0;
+      
   switch (bind->buffer_type)
   {
     case MYSQL_TYPE_TINY:
       *(unsigned char *)bind->buffer = is_unsigned ? *(unsigned char *)data : 
*(char *)data;
-      *bind->error = bind->is_unsigned != is_unsigned && *(unsigned char 
*)data > SCHAR_MAX;
+      error = bind->is_unsigned != is_unsigned && *(unsigned char *)data > 
SCHAR_MAX;
       break;
 
     case MYSQL_TYPE_SHORT:
@@ -333,8 +335,10 @@
       *(double *)bind->buffer = is_unsigned ? *(unsigned char *)data : *(char 
*)data;
       break;
       
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -342,7 +346,7 @@
     case MYSQL_TYPE_VAR_STRING:
     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);
+      error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
       break;
     
     case MYSQL_TYPE_TIME:
@@ -351,7 +355,7 @@
 
     case MYSQL_TYPE_DATE:
       convertDateTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE, 
false);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATETIME:
@@ -362,6 +366,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }
+  
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromShort(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
@@ -369,18 +377,18 @@
   bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
   int64_t time = *(short int *)data;
 
-  *bind->error = 0;
+  bool error = 0;
 
   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);
+      error = isTruncated(*(short int *)data, SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, 
is_unsigned);
       break;
       
     case MYSQL_TYPE_SHORT:
       *(unsigned short int *)bind->buffer = is_unsigned ? *(unsigned short int 
*)data : *(short int *)data;
-      *bind->error = bind->is_unsigned != is_unsigned && *(unsigned short int 
*)data > SHRT_MAX;
+      error = bind->is_unsigned != is_unsigned && *(unsigned short int *)data 
> SHRT_MAX;
       break;
 
     case MYSQL_TYPE_LONG:
@@ -399,8 +407,10 @@
       *(double *)bind->buffer = is_unsigned ? *(unsigned short int *)data : 
*(short int *)data;
       break;
       
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -408,7 +418,7 @@
     case MYSQL_TYPE_VAR_STRING:
     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);
+      error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
       break;
 
     case MYSQL_TYPE_TIME:
@@ -427,6 +437,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }    
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromLong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
@@ -434,23 +448,23 @@
   bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
   int64_t time = *(int *)data;
 
-  *bind->error = 0;
+  bool error = 0;
 
   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);
+      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);
+      error = isTruncated(*(int *)data, SHRT_MIN, SHRT_MAX, USHRT_MAX, 
is_unsigned);
       break;
 
     case MYSQL_TYPE_LONG:
       *(unsigned int *)bind->buffer = is_unsigned ? *(unsigned int *)data : 
*(int *)data;
-      *bind->error = bind->is_unsigned != is_unsigned && *(unsigned int *)data 
> INT_MAX;
+      error = bind->is_unsigned != is_unsigned && *(unsigned int *)data > 
INT_MAX;
       break;
 
     case MYSQL_TYPE_LONGLONG:
@@ -465,8 +479,10 @@
       *(double *)bind->buffer = is_unsigned ? *(unsigned int *)data : *(int 
*)data;
       break;
       
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -474,7 +490,7 @@
     case MYSQL_TYPE_VAR_STRING:
     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);
+      error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
       break;
 
     case MYSQL_TYPE_TIME:
@@ -483,7 +499,7 @@
 
     case MYSQL_TYPE_DATE:
       convertDateTime(&time, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE, 
false);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATETIME:
@@ -494,34 +510,38 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromLonglong(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
 {
   bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
 
-  *bind->error = 0;
+  bool error = 0;
 
   switch (bind->buffer_type)
   {
     case MYSQL_TYPE_TINY:
       *(unsigned char*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, SCHAR_MIN, SCHAR_MAX, 
UCHAR_MAX, is_unsigned);
+      error = isTruncated(*(int64_t *)data, SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, 
is_unsigned);
       break;
       
     case MYSQL_TYPE_SHORT:
       *(unsigned short int*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, SHRT_MIN, SHRT_MAX, 
USHRT_MAX, is_unsigned);
+      error = isTruncated(*(int64_t *)data, SHRT_MIN, SHRT_MAX, USHRT_MAX, 
is_unsigned);
       break;
 
     case MYSQL_TYPE_LONG:
       *(unsigned int*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, INT_MIN, INT_MAX, UINT_MAX, 
is_unsigned);
+      error = isTruncated(*(int64_t *)data, INT_MIN, INT_MAX, UINT_MAX, 
is_unsigned);
       break;
 
     case MYSQL_TYPE_LONGLONG:
       *(uint64_t *)bind->buffer = is_unsigned ? *(uint64_t *)data : *(int64_t 
*)data;
-      *bind->error = bind->is_unsigned != is_unsigned && *(uint64_t *)data > 
LONG_MAX;
+      error = bind->is_unsigned != is_unsigned && *(uint64_t *)data > LONG_MAX;
       break;
 
     case MYSQL_TYPE_FLOAT:
@@ -534,8 +554,10 @@
       *(double *)bind->buffer = is_unsigned ? *(uint64_t *)data : *(int64_t 
*)data;
       break;
       
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -543,12 +565,12 @@
     case MYSQL_TYPE_VAR_STRING:
     case MYSQL_TYPE_STRING:
       int len = snprintf((char *)bind->buffer, bind->buffer_length, "%lld", 
is_unsigned ? *(uint64_t *)data : *(int64_t *)data);
-      *bind->error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
+      error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
       break;
 
     case MYSQL_TYPE_TIME:
       convertDateTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME, 
false);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATE:
@@ -563,6 +585,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }      
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromFloat(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
@@ -571,28 +597,28 @@
   float ff = f < 0 ? -floorf(-f) : floorf(f);
   int64_t datetime = (int64_t)ff;
 
-  *bind->error = 0;
+  bool error = 0;
   
   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));
+      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));
+      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));
+      error = ff != (bind->is_unsigned ? (float) ((unsigned int)f) : (float) 
((int)f));
       break;
 
     case MYSQL_TYPE_LONGLONG:
       *(uint64_t*)bind->buffer = bind->is_unsigned ? (uint64_t)f : (int64_t)f;
-      *bind->error = ff != (bind->is_unsigned ? (float) ((uint64_t)f) : 
(float) ((int64_t)f));
+      error = ff != (bind->is_unsigned ? (float) ((uint64_t)f) : (float) 
((int64_t)f));
       break;
 
     case MYSQL_TYPE_FLOAT:
@@ -603,8 +629,10 @@
       *(double *)bind->buffer = *(float *)data;
       break;
       
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -613,12 +641,12 @@
     case MYSQL_TYPE_STRING:
       // TODO precision
       int len = snprintf((char *)bind->buffer, bind->buffer_length, "%.*f", 
(int)field->decimals, f);
-      *bind->error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
+      error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
       break;
 
     case MYSQL_TYPE_TIME:
       convertDateTime(&datetime, (MYSQL_TIME *)bind->buffer, 
MYSQL_TIMESTAMP_TIME, false);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATE:
@@ -633,6 +661,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromDouble(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
@@ -641,41 +673,43 @@
   double df = d < 0 ? -floor(-d) : floorf(d);
   int64_t datetime = (int64_t)df;
 
-  *bind->error = 0;
+  bool error = 0;
 
   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));
+      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));
+      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));
+      error = df != (bind->is_unsigned ? (double) ((unsigned int)d) : (double) 
((int)d));
       break;
 
     case MYSQL_TYPE_LONGLONG:
       *(uint64_t*)bind->buffer = bind->is_unsigned ? (uint64_t)d : (int64_t)d;
-      *bind->error = df != (bind->is_unsigned ? (double) ((uint64_t)d) : 
(double) ((int64_t)d));
+      error = df != (bind->is_unsigned ? (double) ((uint64_t)d) : (double) 
((int64_t)d));
       break;
 
     case MYSQL_TYPE_FLOAT:
       *(float *)bind->buffer = (float)d;
-      *bind->error = d != (double) (*(float *)bind->buffer);
+      error = d != (double) (*(float *)bind->buffer);
       break;
 
     case MYSQL_TYPE_DOUBLE:
       *(double *)bind->buffer = d;
       break;
       
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -683,12 +717,12 @@
     case MYSQL_TYPE_VAR_STRING:
     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);
+      error = (len < 0) || ((unsigned int)len >= bind->buffer_length);
       break;
 
     case MYSQL_TYPE_TIME:
       convertDateTime(&datetime, (MYSQL_TIME *)bind->buffer, 
MYSQL_TIMESTAMP_TIME, false);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATE:
@@ -703,6 +737,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromString(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
@@ -713,7 +751,7 @@
   float f;
   double d;
 
-  *bind->error = 0;
+  bool error = 0;
 
   switch (bind->buffer_type)
   {
@@ -721,58 +759,60 @@
       if (convert<int64_t, string>(v, *s))
       {
         *(unsigned char *)bind->buffer = (char)v;
-        *bind->error = isTruncated(v, SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, 
bind->is_unsigned);
+        error = isTruncated(v, SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, 
bind->is_unsigned);
       }
       else
-        *bind->error = true;
+        error = true;
       break;
       
     case MYSQL_TYPE_SHORT:
       if (convert<int64_t, string>(v, *s))
       {
         *(unsigned short int *)bind->buffer = (short int)v;
-        *bind->error = isTruncated(v, SHRT_MIN, SHRT_MAX, USHRT_MAX, 
bind->is_unsigned);
+        error = isTruncated(v, SHRT_MIN, SHRT_MAX, USHRT_MAX, 
bind->is_unsigned);
       }
       else
-        *bind->error = true;
+        error = true;
       break;
 
     case MYSQL_TYPE_LONG:
       if (convert<int64_t, string>(v, *s))
       {
         *(unsigned int *)bind->buffer = (int)v;
-        *bind->error = isTruncated(v, INT_MIN, INT_MAX, UINT_MAX, 
bind->is_unsigned);
+        error = isTruncated(v, INT_MIN, INT_MAX, UINT_MAX, bind->is_unsigned);
       }
       else
-        *bind->error = true;
+        error = true;
       break;
 
     case MYSQL_TYPE_LONGLONG:
       if (convert<int64_t, string>(v, *s))
       {
         *(uint64_t *)bind->buffer = (int64_t)v;
-        *bind->error = bind->is_unsigned && v < 0;
+        error = bind->is_unsigned && v < 0;
       }
       else
-        *bind->error = true;
+        error = true;
       break;
 
     case MYSQL_TYPE_FLOAT:
       if (convert<float, string>(f, *s))
           *(float *)bind->buffer = f;
       else
-        *bind->error = true;
+        error = true;
       break;
 
     case MYSQL_TYPE_DOUBLE:
       if (convert<double, string>(d, *s))
           *(double *)bind->buffer = d;
       else
-        *bind->error = true;
+        error = true;
       break;
 
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -785,39 +825,39 @@
         if (length < bind->buffer_length)
           ((char *)bind->buffer)[length] = '\0';
         *bind->length = s_length;
-        *bind->error = s_length - bind->offset > bind->buffer_length;
+        error = s_length - bind->offset > bind->buffer_length;
       break;
 
     case MYSQL_TYPE_TIME:
       if (str_to_MYSQL_TIME(s->data(), (MYSQL_TIME *)bind->buffer))
       {
-        *bind->error = ((MYSQL_TIME *)bind->buffer)->time_type != 
MYSQL_TIMESTAMP_TIME;
+        error = ((MYSQL_TIME *)bind->buffer)->time_type != 
MYSQL_TIMESTAMP_TIME;
       }
       else
       {
-        *bind->error = true;
+        error = true;
       }
       break;
 
     case MYSQL_TYPE_DATE:
       if (str_to_MYSQL_TIME(s->data(), (MYSQL_TIME *)bind->buffer))
       {
-        *bind->error = ((MYSQL_TIME *)bind->buffer)->time_type != 
MYSQL_TIMESTAMP_DATE;
+        error = ((MYSQL_TIME *)bind->buffer)->time_type != 
MYSQL_TIMESTAMP_DATE;
       }
       else
       {
-        *bind->error = true;
+        error = true;
       }
       break;
 
     case MYSQL_TYPE_DATETIME:
       if (str_to_MYSQL_TIME(s->data(), (MYSQL_TIME *)bind->buffer))
       {
-        *bind->error = ((MYSQL_TIME *)bind->buffer)->time_type != 
MYSQL_TIMESTAMP_DATETIME;
+        error = ((MYSQL_TIME *)bind->buffer)->time_type != 
MYSQL_TIMESTAMP_DATETIME;
       }
       else
       {
-        *bind->error = true;
+        error = true;
       }
       break;
       
@@ -825,6 +865,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
@@ -833,23 +877,23 @@
   MYSQL_TIME time;
   int64_t date = *(int *)data;
 
-  *bind->error = 0;
+  bool error = 0;
 
   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);
+      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);
+      error = isTruncated(*(int *)data, SHRT_MIN, SHRT_MAX, USHRT_MAX, 
is_unsigned);
       break;
 
     case MYSQL_TYPE_LONG:
       *(unsigned int *)bind->buffer = is_unsigned ? *(unsigned int *)data : 
*(int *)data;
-      *bind->error = bind->is_unsigned != is_unsigned && *(unsigned int *)data 
> INT_MAX;
+      error = bind->is_unsigned != is_unsigned && *(unsigned int *)data > 
INT_MAX;
       break;
 
     case MYSQL_TYPE_LONGLONG:
@@ -864,8 +908,10 @@
       *(double *)bind->buffer = is_unsigned ? *(unsigned int *)data : *(int 
*)data;
       break;
 
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -873,7 +919,7 @@
     case MYSQL_TYPE_VAR_STRING:
     case MYSQL_TYPE_STRING:
       convertDateTime(&date, &time, MYSQL_TIMESTAMP_TIME, false);
-      *bind->error = MYSQL_TIME_to_str(&time, (char *)bind->buffer, 
bind->buffer_length); 
+      error = MYSQL_TIME_to_str(&time, (char *)bind->buffer, 
bind->buffer_length); 
       *bind->length = strlen((char *)bind->buffer);
       break;
 
@@ -883,7 +929,7 @@
 
     case MYSQL_TYPE_DATE:
       convertDateTime(&date, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE, 
false);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATETIME:
@@ -894,6 +940,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromDate(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
@@ -901,28 +951,28 @@
   bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
   MYSQL_TIME date;
   
-  *bind->error = 0;
+  bool error = 0;
 
   switch (bind->buffer_type)
   {
     case MYSQL_TYPE_TINY:
       *(unsigned char*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, SCHAR_MIN, SCHAR_MAX, 
UCHAR_MAX, is_unsigned);
+      error = isTruncated(*(int64_t *)data, SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, 
is_unsigned);
       break;
       
     case MYSQL_TYPE_SHORT:
       *(unsigned short int*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, SHRT_MIN, SHRT_MAX, 
USHRT_MAX, is_unsigned);
+      error = isTruncated(*(int64_t *)data, SHRT_MIN, SHRT_MAX, USHRT_MAX, 
is_unsigned);
       break;
 
     case MYSQL_TYPE_LONG:
       *(unsigned int*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, INT_MIN, INT_MAX, UINT_MAX, 
is_unsigned);
+      error = isTruncated(*(int64_t *)data, INT_MIN, INT_MAX, UINT_MAX, 
is_unsigned);
       break;
 
     case MYSQL_TYPE_LONGLONG:
       *(uint64_t *)bind->buffer = is_unsigned ? *(uint64_t *)data : *(int64_t 
*)data;
-      *bind->error = bind->is_unsigned != is_unsigned && *(uint64_t *)data > 
LONG_MAX;
+      error = bind->is_unsigned != is_unsigned && *(uint64_t *)data > LONG_MAX;
       break;
 
     case MYSQL_TYPE_FLOAT:
@@ -935,8 +985,10 @@
       *(double *)bind->buffer = is_unsigned ? *(uint64_t *)data : *(int64_t 
*)data;
       break;
 
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -944,13 +996,13 @@
     case MYSQL_TYPE_VAR_STRING:
     case MYSQL_TYPE_STRING:
       convertDateTime(data, &date, MYSQL_TIMESTAMP_DATE, false);
-      *bind->error = MYSQL_TIME_to_str(&date, (char *)bind->buffer, 
bind->buffer_length); 
+      error = MYSQL_TIME_to_str(&date, (char *)bind->buffer, 
bind->buffer_length); 
       *bind->length = strlen((char *)bind->buffer);
       break;
 
     case MYSQL_TYPE_TIME:
       convertDateTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME, 
false);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATE:
@@ -965,6 +1017,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 void getFromDateTime(MYSQL_BIND *bind, MYSQL_FIELD *field, void *data)
@@ -972,28 +1028,28 @@
   bool is_unsigned = (field->flags & UNSIGNED_FLAG) == UNSIGNED_FLAG;
   MYSQL_TIME datetime;
   
-  *bind->error = 0;
+  bool error = 0;
 
   switch (bind->buffer_type)
   {
     case MYSQL_TYPE_TINY:
       *(unsigned char*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, SCHAR_MIN, SCHAR_MAX, 
UCHAR_MAX, is_unsigned);
+      error = isTruncated(*(int64_t *)data, SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, 
is_unsigned);
       break;
       
     case MYSQL_TYPE_SHORT:
       *(unsigned short int*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, SHRT_MIN, SHRT_MAX, 
USHRT_MAX, is_unsigned);
+      error = isTruncated(*(int64_t *)data, SHRT_MIN, SHRT_MAX, USHRT_MAX, 
is_unsigned);
       break;
 
     case MYSQL_TYPE_LONG:
       *(unsigned int*)bind->buffer = is_unsigned ? *(uint64_t *)data : 
*(int64_t *)data;
-      *bind->error = isTruncated(*(int64_t *)data, INT_MIN, INT_MAX, UINT_MAX, 
is_unsigned);
+      error = isTruncated(*(int64_t *)data, INT_MIN, INT_MAX, UINT_MAX, 
is_unsigned);
       break;
 
     case MYSQL_TYPE_LONGLONG:
       *(uint64_t *)bind->buffer = is_unsigned ? *(uint64_t *)data : *(int64_t 
*)data;
-      *bind->error = bind->is_unsigned != is_unsigned && *(uint64_t *)data > 
LONG_MAX;
+      error = bind->is_unsigned != is_unsigned && *(uint64_t *)data > LONG_MAX;
       break;
 
     case MYSQL_TYPE_FLOAT:
@@ -1006,8 +1062,10 @@
       *(double *)bind->buffer = is_unsigned ? *(uint64_t *)data : *(int64_t 
*)data;
       break;
 
-    case MYSQL_TYPE_DECIMAL:
+#ifdef MYSQL5
     case MYSQL_TYPE_NEWDECIMAL:
+#endif
+    case MYSQL_TYPE_DECIMAL:
     case MYSQL_TYPE_TINY_BLOB:
     case MYSQL_TYPE_MEDIUM_BLOB:
     case MYSQL_TYPE_LONG_BLOB:
@@ -1015,18 +1073,18 @@
     case MYSQL_TYPE_VAR_STRING:
     case MYSQL_TYPE_STRING:
       convertDateTime(data, &datetime, MYSQL_TIMESTAMP_DATETIME, true);
-      *bind->error = MYSQL_TIME_to_str(&datetime, (char *)bind->buffer, 
bind->buffer_length); 
+      error = MYSQL_TIME_to_str(&datetime, (char *)bind->buffer, 
bind->buffer_length); 
       *bind->length = strlen((char *)bind->buffer);
       break;
 
     case MYSQL_TYPE_TIME:
       convertDateTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_TIME, 
true);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATE:
       convertDateTime(data, (MYSQL_TIME *)bind->buffer, MYSQL_TIMESTAMP_DATE, 
true);
-      *bind->error = true;
+      error = true;
       break;
 
     case MYSQL_TYPE_DATETIME:
@@ -1037,6 +1095,10 @@
       LOG4CXX_ERROR(logger, "Not implemented yet!");
       break;
   }
+
+#ifdef MYSQL5
+  *bind->error = error;
+#endif
 }
 
 bool MYSQL_TIME_to_str(MYSQL_TIME *t, char *s, int maxlen)

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

Reply via email to