Date: Friday, March 3, 2006 @ 10:43:13
  Author: zsolt
    Path: /cvsroot/carob/libmysequoia/src

Modified: CarobCommon.cpp (1.5 -> 1.6) CarobMySQL.cpp (1.56 -> 1.57)
          CarobStmt.cpp (1.26 -> 1.27)

- modified to use ByteArray for binary fields
- introduced flag BINARY_FLAG in MYSQL_FIELD when the data is binary


-----------------+
 CarobCommon.cpp |   19 ++++++++++++++++++-
 CarobMySQL.cpp  |    9 ++++++++-
 CarobStmt.cpp   |   36 ++++++++++++++++++++++--------------
 3 files changed, 48 insertions(+), 16 deletions(-)


Index: libmysequoia/src/CarobCommon.cpp
diff -u libmysequoia/src/CarobCommon.cpp:1.5 
libmysequoia/src/CarobCommon.cpp:1.6
--- libmysequoia/src/CarobCommon.cpp:1.5        Tue Jan 31 16:31:52 2006
+++ libmysequoia/src/CarobCommon.cpp    Fri Mar  3 10:43:13 2006
@@ -22,6 +22,8 @@
 #include <CarobCommon.hpp>
 #include <Utils.hpp>
 
+#include <TypeConstants.hpp>
+
 using namespace CarobNS;
 using namespace log4cxx;
 
@@ -53,7 +55,8 @@
     colPtr->decimals = rsmPtr->getScale(colNo);
 
     //TODO more compatible flags...
-    colPtr->type = sql_to_mysql_type(rsmPtr->getColumnType(colNo));
+    int colType = rsmPtr->getColumnType(colNo);
+    colPtr->type = sql_to_mysql_type(colType);
 
     colPtr->flags = (rsmPtr->isNullable(colNo) ? 0 : NOT_NULL_FLAG) |
                     (rsmPtr->isAutoIncrement(colNo) ? AUTO_INCREMENT_FLAG : 0) 
|
@@ -66,6 +69,20 @@
                     | NO_DEFAULT_VALUE_FLAG
 #endif
                     ;
+                    
+    switch (colType)
+    {
+#ifdef MYSQL5
+      case SQLT_BIT:
+#endif
+      case SQLT_BINARY:
+      case SQLT_VARBINARY:
+      case SQLT_BLOB:
+      case SQLT_CLOB:
+      case SQLT_LONGVARBINARY:
+        colPtr->flags |= BINARY_FLAG;
+        break;
+    }
   }
   
   LOG4CXX_DEBUG(logger, "Leaving get_query_fields: result=" << colNum);
Index: libmysequoia/src/CarobMySQL.cpp
diff -u libmysequoia/src/CarobMySQL.cpp:1.56 
libmysequoia/src/CarobMySQL.cpp:1.57
--- libmysequoia/src/CarobMySQL.cpp:1.56        Tue Feb 28 15:19:37 2006
+++ libmysequoia/src/CarobMySQL.cpp     Fri Mar  3 10:43:13 2006
@@ -904,7 +904,14 @@
           field_len = *b.length;
           break;
         default:
-          tmp = toString(drsPtr->getAsString(i+1));
+          if (fPtr->flags & BINARY_FLAG)
+          {
+            LargeData &d = drsPtr->getByteArray(i+1);
+            tmp = string((char *)d.data, d.length);
+          }
+          else
+            tmp = toString(drsPtr->getAsString(i+1));
+            
           field_len = tmp.length();
           result += tmp;
       }
Index: libmysequoia/src/CarobStmt.cpp
diff -u libmysequoia/src/CarobStmt.cpp:1.26 libmysequoia/src/CarobStmt.cpp:1.27
--- libmysequoia/src/CarobStmt.cpp:1.26 Wed Feb 22 16:55:29 2006
+++ libmysequoia/src/CarobStmt.cpp      Fri Mar  3 10:43:13 2006
@@ -302,24 +302,27 @@
               case MYSQL_TYPE_DOUBLE:
                 c_stmt->setDouble(no, *(double *)p->buffer);
                 break;
-              case MYSQL_TYPE_DECIMAL:
               case MYSQL_TYPE_TINY_BLOB:
               case MYSQL_TYPE_MEDIUM_BLOB:
               case MYSQL_TYPE_LONG_BLOB:
               case MYSQL_TYPE_BLOB:
+                if (p->long_data_used && LONGDATAFIELD(p))
+                {
+                  string *s = (string *)LONGDATAFIELD(p);
+                  c_stmt->setBlob(no, s->data(), s->size());
+                }
+                else
+                  c_stmt->setBlob(no, p->buffer, p->buffer_length);
+                break;
+              case MYSQL_TYPE_DECIMAL:
 #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                  
+                if (p->long_data_used && LONGDATAFIELD(p))
+                  c_stmt->setString(no, fromString(*(string 
*)LONGDATAFIELD(p)));
                 else
                   c_stmt->setString(no, fromString(string((char *)p->buffer, 
p->buffer_length)));
                 break;
@@ -335,7 +338,7 @@
                 break;
               default:
                 LOG4CXX_FATAL(logger, "This should never happen!!");
-/* TODO support other types */
+                /* TODO support other types */
             }
         }
         if (!c_stmt->execute())
@@ -796,7 +799,13 @@
       case MYSQL_TYPE_VARCHAR:
       case MYSQL_TYPE_NEWDECIMAL:
 #endif
-        result = new string(toString(liveResultSet->getAsString(colNo)));
+        if (fPtr->flags & BINARY_FLAG)
+        {
+          LargeData &d = liveResultSet->getByteArray(colNo);
+          result = new string((char *)d.data, d.length);
+        }
+        else
+          result = new string(toString(liveResultSet->getAsString(colNo)));
         break;
       case MYSQL_TYPE_TIME:
         result = new int(liveResultSet->getAsInt(colNo));
@@ -829,7 +838,7 @@
 void
 CarobStmt::delete_fetch_field(MYSQL_FIELD *fPtr, void *buffer)
 {
-  LOG4CXX_DEBUG(logger, "Entering delete_fetch_field.");
+  LOG4CXX_DEBUG(logger, "Entering delete_fetch_field fPtr="<< fPtr << " type=" 
<< fPtr->type << " buffer=" << buffer); 
 
   switch (fPtr->type)
   {
@@ -970,11 +979,10 @@
 
   liveResultSet = 0;
 
-  delete_query_fields(m_stmt->fields, m_stmt->field_count);
-  
   free_catched_result(m_stmt);
   free_long_data(m_stmt);
-        
+  delete_query_fields(m_stmt->fields, m_stmt->field_count);
+  
   FREE_AND_NULL_ARRAY(m_stmt->params);
   FREE_AND_NULL_ARRAY(m_stmt->bind);
   

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

Reply via email to