Date: Tuesday, March 28, 2006 @ 14:25:11
  Author: zsolt
    Path: /cvsroot/carob/libmysequoia

Modified: include/CarobCommon.hpp (1.3 -> 1.4) include/CarobMySQL.hpp
          (1.31 -> 1.32) include/CarobStmt.hpp (1.10 -> 1.11)
          src/CarobCommon.cpp (1.7 -> 1.8) src/CarobMySQL.cpp (1.66 ->
          1.67) src/CarobStmt.cpp (1.30 -> 1.31)

- truncation of verbose cluster error messages to mysql specific (fix for LMS-4)
- refactoring of set_error


-------------------------+
 include/CarobCommon.hpp |   36 ++++++++++++++++++++++
 include/CarobMySQL.hpp  |   36 +++++++++-------------
 include/CarobStmt.hpp   |   30 +++++++++---------
 src/CarobCommon.cpp     |   75 ++++++++++++++++++++++++++++++++++++++++++++++
 src/CarobMySQL.cpp      |   58 ++++++-----------------------------
 src/CarobStmt.cpp       |   38 ++---------------------
 6 files changed, 156 insertions(+), 117 deletions(-)


Index: libmysequoia/include/CarobCommon.hpp
diff -u libmysequoia/include/CarobCommon.hpp:1.3 
libmysequoia/include/CarobCommon.hpp:1.4
--- libmysequoia/include/CarobCommon.hpp:1.3    Fri Mar  3 10:57:48 2006
+++ libmysequoia/include/CarobCommon.hpp        Tue Mar 28 14:25:11 2006
@@ -72,6 +72,42 @@
    */
   virtual std::wstring to_wstring(const std::string &s) = 0;
 
+  /**
+   * Set the current mysql error to the specified one. The mysql error message 
will be filled from the error list.
+   * @param errcode mysql error code
+   * @param sqlstate ansi sql specific error code
+   */
+  void set_error (int errcode, int sqlstate);
+
+  /**
+   * Set the current mysql error to the specified one
+   * @param errcode mysql error code
+   * @param errmsg detailed mysql error message
+   * @param sqlstate ansi sql specific error message
+   * @param chop indicate to extract a MySQL specific message from the verbose 
cluster error.
+   */
+  void set_error (int errcode, const char *errmsg, const char *sqlstate, const 
bool chop = false);
+
+  /**
+   * Return a pointer to the last_error number in the mysql structure
+   */
+  virtual unsigned int *get_errno_ptr() = 0;
+
+  /**
+   * Return a pointer to the last_error buffer in the mysql structure
+   */
+  virtual char *get_errmsg_ptr() = 0;
+
+  /**
+   * Return a pointer to the sqlstate buffer in the mysql structure
+   */
+  virtual char *get_sqlstate_ptr() = 0;
+
+  /**
+   * Reset error codes.
+   */
+   
+  virtual void reset_error();  
 private:
   /**
    * Converts a wstring to a char *.
Index: libmysequoia/include/CarobMySQL.hpp
diff -u libmysequoia/include/CarobMySQL.hpp:1.31 
libmysequoia/include/CarobMySQL.hpp:1.32
--- libmysequoia/include/CarobMySQL.hpp:1.31    Fri Mar 24 10:02:40 2006
+++ libmysequoia/include/CarobMySQL.hpp Tue Mar 28 14:25:11 2006
@@ -247,6 +247,22 @@
    */
   unsigned long real_escape_string (char *to, const char *from, unsigned long 
length);
   
+protected:
+  /**
+   * Return a pointer to the last_error number in the mysql structure
+   */
+  virtual unsigned int *get_errno_ptr() { return &mysqlPtr->net.last_errno; }
+
+  /**
+   * Return a pointer to the last_error buffer in the mysql structure
+   */
+  virtual char *get_errmsg_ptr() { return mysqlPtr->net.last_error; }
+
+  /**
+   * Return a pointer to the sqlstate buffer in the mysql structure
+   */
+  virtual char *get_sqlstate_ptr() { return mysqlPtr->net.sqlstate; };
+
 private:
   //pointer to a MYSQL structure which is connected to this class
   MYSQL * mysqlPtr;
@@ -293,26 +309,6 @@
   void delete_connection ();
 
   /**
-   * Set the current mysql error to the specified one. The mysql error message 
will be filled from the error list.
-   * @param errcode mysql error code
-   * @param sqlstate ansi sql specific error code
-   */
-  void set_error (int errcode, int sqlstate);
-
-  /**
-   * Set the current mysql error to the specified one
-   * @param errcode mysql error code
-   * @param errmsg detailed mysql error message
-   * @param sqlstate ansi sql specific error message
-   */
-  void set_error (int errcode, const char *errmsg, const char *sqlstate);
-
-  /**
-   * Reset the error codes
-   */
-  void reset_error ();
-  
-  /**
    * Allocates a row from the freshly fetched results
    * @param row the resulting row
    * @param fields pointer to the field structure to update the max column 
length or null
Index: libmysequoia/include/CarobStmt.hpp
diff -u libmysequoia/include/CarobStmt.hpp:1.10 
libmysequoia/include/CarobStmt.hpp:1.11
--- libmysequoia/include/CarobStmt.hpp:1.10     Fri Mar  3 10:57:48 2006
+++ libmysequoia/include/CarobStmt.hpp  Tue Mar 28 14:25:11 2006
@@ -187,6 +187,21 @@
    */
    void resetParent() {cmysql = 0; m_stmt->mysql = 0; liveResultSet = 0;}
    
+  /**
+   * Return a pointer to the last_error number in the mysql structure
+   */
+  virtual unsigned int *get_errno_ptr() { return &m_stmt->last_errno; }
+
+  /**
+   * Return a pointer to the last_error buffer in the mysql structure
+   */
+  virtual char *get_errmsg_ptr() { return m_stmt->last_error; }
+
+  /**
+   * Return a pointer to the sqlstate buffer in the mysql structure
+   */
+  virtual char *get_sqlstate_ptr() { return m_stmt->sqlstate; };
+
 private:
   //Internal MYSQL_STMT associated with the statement
   MYSQL_STMT *m_stmt;
@@ -251,21 +266,6 @@
    * @param stmt points to the statement which long data buffer should be 
released
    */
   static void free_long_data(MYSQL_STMT *stmt);
-  
-  /**
-   * Set the current mysql error to the specified one. The mysql error message 
will be filled from the error list.
-   * @param errcode mysql error code
-   * @param sqlstate ansi sql specific error code
-   */
-  void set_error (int errcode, int sqlstate);
-
-  /**
-   * Set the current mysql error to the specified one
-   * @param errcode mysql error code
-   * @param errmsg detailed mysql error message
-   * @param sqlstate ansi sql specific error message
-   */
-  void set_error (int errcode, const char *errmsg, const char *sqlstate);
 };
 
 #endif /*_CAROBSTMT_HPP*/
Index: libmysequoia/src/CarobCommon.cpp
diff -u libmysequoia/src/CarobCommon.cpp:1.7 
libmysequoia/src/CarobCommon.cpp:1.8
--- libmysequoia/src/CarobCommon.cpp:1.7        Fri Mar  3 10:57:48 2006
+++ libmysequoia/src/CarobCommon.cpp    Tue Mar 28 14:25:11 2006
@@ -24,6 +24,9 @@
 
 #include <TypeConstants.hpp>
 
+/* MySQL include */
+#include <errmsg.h>
+
 using namespace CarobNS;
 using namespace log4cxx;
 
@@ -117,3 +120,75 @@
 
   LOG4CXX_DEBUG(logger, "Leaving delete_query_fields.");
 }
+
+void
+CarobCommon::set_error(int errcode, int sqlstate)
+{
+//Commented out because of too much debug info
+//  LOG4CXX_DEBUG(logger, "Entering set_error: errcode=" << errcode << " 
sqlstate=" << sqlstate);
+  set_error(errcode, client_errors[errcode-CR_MIN_ERROR], 
error_sqlstate[sqlstate], false);
+//  LOG4CXX_DEBUG(logger, "Leaving set_error.");
+}
+
+void
+CarobCommon::set_error(int errcode, const char *errmsg, const char *sqlstate, 
const bool chop)
+{
+  LOG4CXX_DEBUG(logger, "Entering set_error");
+
+  LOG4CXX_ERROR(logger, "errcode=" << errcode << " errmsg=" << errmsg << " 
sqlstate=" << sqlstate);
+
+  *get_errno_ptr() = convert_errcode(errcode);
+  
+  if (errmsg)
+  {
+    char *p = get_errmsg_ptr();
+    const char *sf = 0;
+    int size;
+    
+    //need some chopping from strings like "xxxyyy (err msg)"
+    if (chop)
+    {
+      sf = strrchr(errmsg, '(');
+      if (sf)
+      {
+        sf++;
+        const char *sl = strchr(sf, ')');
+        if (!sl) 
+          sf = 0;
+        else
+          size = sl - sf - 1;
+      }
+    }
+    if (!sf)
+    {
+      sf = errmsg;
+      size = strlen(errmsg);
+    }
+    
+    //buffer overflow protection
+    size = std::min(size, MYSQL_ERRMSG_SIZE-1);
+    strncpy(p, sf, size+1);
+  }
+  else
+    *get_errmsg_ptr() = 0;
+
+  if (sqlstate)
+  {
+    char *p = get_sqlstate_ptr();
+    strncpy(p, sqlstate, SQLSTATE_LENGTH);
+    p[SQLSTATE_LENGTH] = 0;
+  }
+  else
+    *get_sqlstate_ptr() = 0;
+
+  LOG4CXX_DEBUG(logger, "Leaving set_error.");
+}
+
+void
+CarobCommon::reset_error ()
+{
+  *get_errno_ptr() = 0;
+  *get_errmsg_ptr() = 0;
+  *get_sqlstate_ptr() = 0;
+}
+
Index: libmysequoia/src/CarobMySQL.cpp
diff -u libmysequoia/src/CarobMySQL.cpp:1.66 
libmysequoia/src/CarobMySQL.cpp:1.67
--- libmysequoia/src/CarobMySQL.cpp:1.66        Fri Mar 24 14:00:37 2006
+++ libmysequoia/src/CarobMySQL.cpp     Tue Mar 28 14:25:11 2006
@@ -25,13 +25,13 @@
 #include <Utils.hpp>
 #include <HostTokenizer.hpp>
 
-/* MySQL include */
-#include <errmsg.h>
-
 /* Carob include */
 #include <StringCodecs.hpp>
 #include <ResultSetMetaData.hpp>
 
+/* MySQL include */
+#include <errmsg.h>
+
 #include <cstdlib>
 #include <string>
 #include <algorithm>
@@ -229,7 +229,7 @@
     } 
     catch (CarobException &e)
     {
-      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
       //TODO error handling
       LOG4CXX_DEBUG(logger, "Leaving connect.");
       return false;
@@ -348,7 +348,7 @@
     }
     catch (CarobException &e)
     {
-      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
       LOG4CXX_DEBUG(logger, "Leaving real_query: result=0");
       return false;
     }
@@ -449,7 +449,7 @@
     }
     catch (CarobException &e)
     {
-      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
       LOG4CXX_DEBUG(logger, "Leaving get_results: result=0");
       return 0;
     }
@@ -536,7 +536,7 @@
       }
       catch (CarobException &e)
       {
-        set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+        set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
         result = 1;
       }
     }
@@ -646,7 +646,7 @@
     }
     catch (CarobException &e)
     {
-      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
       LOG4CXX_DEBUG(logger, "Leaving set_autocommit: result=0");
       return 0;
     }
@@ -684,7 +684,7 @@
     }
     catch (CarobException &e)
     {
-      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
       LOG4CXX_DEBUG(logger, "Leaving commit: result=0");
       return 0;
     }
@@ -722,7 +722,7 @@
     }
     catch (CarobException &e)
     {
-      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
       LOG4CXX_DEBUG(logger, "Leaving rollback: result=0");
       return false;
     }
@@ -881,44 +881,6 @@
 }
 
 void
-CarobMYSQL::set_error(int errcode, int sqlstate)
-{
-  LOG4CXX_DEBUG(logger, "Entering set_error: errcode=" << errcode << " 
sqlstate=" << sqlstate);
-  set_error(errcode, client_errors[errcode-CR_MIN_ERROR], 
error_sqlstate[sqlstate]);
-  LOG4CXX_DEBUG(logger, "Leaving set_error.");
-}
-
-void
-CarobMYSQL::set_error(int errcode, const char *errmsg, const char *sqlstate)
-{
-  LOG4CXX_DEBUG(logger, "Entering set_error: errcode=" << errcode << " 
errmsg=" << errmsg << " sqlstate=" << sqlstate);
-  
-  LOG4CXX_ERROR(logger, "errcode=" << errcode << " errmsg=" << errmsg << " 
sqlstate=" << sqlstate);
-
-  mysqlPtr->net.last_errno = convert_errcode(errcode);
-
-  if (errmsg)
-    strcpy(mysqlPtr->net.last_error, errmsg);
-  else
-    *mysqlPtr->net.last_error = 0;
-
-  if (sqlstate)
-    strcpy(mysqlPtr->net.sqlstate, sqlstate);
-  else
-    *mysqlPtr->net.sqlstate = 0;
-
-  LOG4CXX_DEBUG(logger, "Leaving set_error.");
-}
-
-void
-CarobMYSQL::reset_error ()
-{
-  mysqlPtr->net.last_errno = 0;
-  *mysqlPtr->net.last_error = 0;
-  *mysqlPtr->net.sqlstate = 0;
-}
-
-void
 CarobMYSQL::alloc_row_data(MYSQL_ROW &row, MYSQL_FIELD *fields, const unsigned 
int field_count, unsigned long &length, unsigned long *lengths)
 {
 //Commented out because the debug info get unusable
Index: libmysequoia/src/CarobStmt.cpp
diff -u libmysequoia/src/CarobStmt.cpp:1.30 libmysequoia/src/CarobStmt.cpp:1.31
--- libmysequoia/src/CarobStmt.cpp:1.30 Fri Mar 24 14:00:37 2006
+++ libmysequoia/src/CarobStmt.cpp      Tue Mar 28 14:25:11 2006
@@ -123,7 +123,7 @@
     }
     catch (CarobException &e)
     {
-      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+      set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
       result = 1;
     }
   }
@@ -362,7 +362,7 @@
         }
         catch (CarobException &e)
         {
-          set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+          set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
         }
       }
       catch (ConverterException &e)
@@ -669,7 +669,7 @@
       }
       catch (CarobException &e)
       {
-        set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+        set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
         result = 1;
       }
     }
@@ -874,7 +874,7 @@
   }
   catch (CarobException &e)
   {
-    set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str());
+    set_error(e.getErrorCode(), from_wstring(e.description()).c_str(), 
from_wstring(e.getSQLState()).c_str(), true);
   }
         
   LOG4CXX_DEBUG(logger, "Leaving alloc_fetch_field: result=" << result);
@@ -983,36 +983,6 @@
 }
 
 void
-CarobStmt::set_error(int errcode, int sqlstate)
-{
-  LOG4CXX_DEBUG(logger, "Entering set_error: errcode=" << errcode << " 
sqlstate=" << sqlstate);
-  set_error(errcode, client_errors[errcode-CR_MIN_ERROR], 
error_sqlstate[sqlstate]);
-  LOG4CXX_DEBUG(logger, "Leaving set_error.");
-}
-
-void
-CarobStmt::set_error(int errcode, const char *errmsg, const char *sqlstate)
-{
-  LOG4CXX_DEBUG(logger, "Entering set_error: errcode=" << errcode << " 
errmsg=" << errmsg << " sqlstate" << sqlstate);
-
-  LOG4CXX_ERROR(logger, "Entering set_error: errcode=" << errcode << " 
errmsg=" << errmsg << " sqlstate" << sqlstate);
-
-  m_stmt->last_errno = convert_errcode(errcode);
-
-  if (errmsg)
-    strcpy(m_stmt->last_error, errmsg);
-  else
-    *m_stmt->last_error = 0;
-
-  if (sqlstate)
-    strcpy(m_stmt->sqlstate, sqlstate);
-  else
-    *m_stmt->sqlstate = 0;
-
-  LOG4CXX_DEBUG(logger, "Leaving set_error.");
-}
-
-void
 CarobStmt::clear()
 {
   LOG4CXX_DEBUG(logger, "Entering clear.");

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

Reply via email to