List:Commits« Previous MessageNext Message »
From:jwinstead Date:December 1 2007 6:30am
Subject:Connector/ODBC 3.51 commit: r904 - in branches/guffert: . driver test
View as plain text  
Modified:
   branches/guffert/ChangeLog
   branches/guffert/driver/ansi.c
   branches/guffert/driver/error.h
   branches/guffert/driver/unicode.c
   branches/guffert/test/my_error.c
Log:
SQLError() incorrectly cleared the error information, making it
unavailable from subsequent calls to SQLGetDiagRec().


Modified: branches/guffert/ChangeLog
===================================================================
--- branches/guffert/ChangeLog	2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/ChangeLog	2007-12-01 06:30:47 UTC (rev 904)
@@ -48,6 +48,8 @@
   * Binding of columns between calling prepare and execute causes
     statement execution. (Bug #29239)
   * ADO can't open a recordset that has a Decimal field (Bug #31720)
+  * SQLError() incorrectly cleared the error information, making it
+    unavailable from subsequent calls to SQLGetDiagRec().
   
   Includes changes from Connector/ODBC 3.51.21 and 3.51.22.
 

Modified: branches/guffert/driver/ansi.c
===================================================================
--- branches/guffert/driver/ansi.c	2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/driver/ansi.c	2007-12-01 06:30:47 UTC (rev 904)
@@ -412,24 +412,21 @@
 
   if (hstmt)
   {
-    rc= SQLGetDiagRecImpl(SQL_HANDLE_STMT, hstmt, 1, sqlstate, native_error,
-                          message, message_max, message_len);
-    if (rc == SQL_SUCCESS)
-      CLEAR_STMT_ERROR(hstmt);
+    rc= SQLGetDiagRecImpl(SQL_HANDLE_STMT, hstmt, NEXT_STMT_ERROR(hstmt),
+                          sqlstate, native_error, message, message_max,
+                          message_len);
   }
   else if (hdbc)
   {
-    rc= SQLGetDiagRecImpl(SQL_HANDLE_DBC, hdbc, 1, sqlstate, native_error,
-                          message, message_max, message_len);
-    if (rc == SQL_SUCCESS)
-      CLEAR_DBC_ERROR(hdbc);
+    rc= SQLGetDiagRecImpl(SQL_HANDLE_DBC, hdbc, NEXT_DBC_ERROR(hdbc),
+                          sqlstate, native_error, message, message_max,
+                          message_len);
   }
   else if (henv)
   {
-    rc= SQLGetDiagRecImpl(SQL_HANDLE_ENV, henv, 1, sqlstate, native_error,
-                          message, message_max, message_len);
-    if (rc == SQL_SUCCESS)
-      CLEAR_ENV_ERROR(henv);
+    rc= SQLGetDiagRecImpl(SQL_HANDLE_ENV, henv, NEXT_ENV_ERROR(henv),
+                          sqlstate, native_error, message, message_max,
+                          message_len);
   }
 
   return rc;

Modified: branches/guffert/driver/error.h
===================================================================
--- branches/guffert/driver/error.h	2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/driver/error.h	2007-12-01 06:30:47 UTC (rev 904)
@@ -50,20 +50,33 @@
   error handler structure
 */
 typedef struct tagERROR {
+  SQLRETURN   retcode;
+  char        current;
 
   char	   sqlstate[6];
   char	   message[SQL_MAX_MESSAGE_LENGTH+1];
   SQLINTEGER  native_error;
-  SQLRETURN   retcode;
 
 } MYERROR;
 
+#define CLEAR_ERROR(error) do {\
+  error.message[0]= '\0'; \
+  error.current= 0; \
+} while (0)
 
-#define CLEAR_ENV_ERROR(env)   (((ENV *)env)->error.message[0]='\0')
-#define CLEAR_DBC_ERROR(dbc)   (((DBC *)dbc)->error.message[0]='\0')
-#define CLEAR_STMT_ERROR(stmt) (((STMT *)stmt)->error.message[0]='\0')
-#define CLEAR_DESC_ERROR(desc) (((DESC *)desc)->error.message[0]='\0')
+#define CLEAR_ENV_ERROR(env)   CLEAR_ERROR(((ENV *)env)->error)
+#define CLEAR_DBC_ERROR(dbc)   CLEAR_ERROR(((DBC *)dbc)->error)
+#define CLEAR_STMT_ERROR(stmt) CLEAR_ERROR(((STMT *)stmt)->error)
+#define CLEAR_DESC_ERROR(desc) CLEAR_ERROR(((DESC *)desc)->error)
 
+#define NEXT_ERROR(error) \
+  (error.current ? 2 : (error.current= 1))
+
+#define NEXT_ENV_ERROR(env)   NEXT_ERROR(((ENV *)env)->error)
+#define NEXT_DBC_ERROR(dbc)   NEXT_ERROR(((DBC *)dbc)->error)
+#define NEXT_STMT_ERROR(stmt) NEXT_ERROR(((STMT *)stmt)->error)
+#define NEXT_DESC_ERROR(desc) NEXT_ERROR(((DESC *)desc)->error)
+
 /*
   list of MyODBC3 error codes
 */

Modified: branches/guffert/driver/unicode.c
===================================================================
--- branches/guffert/driver/unicode.c	2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/driver/unicode.c	2007-12-01 06:30:47 UTC (rev 904)
@@ -299,24 +299,21 @@
 
   if (hstmt)
   {
-    rc= SQLGetDiagRecWImpl(SQL_HANDLE_STMT, hstmt, 1, sqlstate, native_error,
-                           message, message_max, message_len);
-    if (rc == SQL_SUCCESS)
-      CLEAR_STMT_ERROR(hstmt);
+    rc= SQLGetDiagRecWImpl(SQL_HANDLE_STMT, hstmt, NEXT_STMT_ERROR(hstmt),
+                           sqlstate, native_error, message, message_max,
+                           message_len);
   }
   else if (hdbc)
   {
-    rc= SQLGetDiagRecWImpl(SQL_HANDLE_DBC, hdbc, 1, sqlstate, native_error,
-                           message, message_max, message_len);
-    if (rc == SQL_SUCCESS)
-      CLEAR_DBC_ERROR(hdbc);
+    rc= SQLGetDiagRecWImpl(SQL_HANDLE_DBC, hdbc, NEXT_DBC_ERROR(hstmt),
+                           sqlstate, native_error, message, message_max,
+                           message_len);
   }
   else if (henv)
   {
-    rc= SQLGetDiagRecWImpl(SQL_HANDLE_ENV, henv, 1, sqlstate, native_error,
-                           message, message_max, message_len);
-    if (rc == SQL_SUCCESS)
-      CLEAR_ENV_ERROR(henv);
+    rc= SQLGetDiagRecWImpl(SQL_HANDLE_ENV, henv, NEXT_ENV_ERROR(henv),
+                           sqlstate, native_error, message, message_max,
+                           message_len);
   }
 
   return rc;

Modified: branches/guffert/test/my_error.c
===================================================================
--- branches/guffert/test/my_error.c	2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/test/my_error.c	2007-12-01 06:30:47 UTC (rev 904)
@@ -278,6 +278,7 @@
  */
 DECLARE_TEST(bind_invalidcol)
 {
+  SQLCHAR dummy[10];
   ok_sql(hstmt, "select 1,2,3,4");
 
   /* test out of range column number */
@@ -290,8 +291,8 @@
   is(check_sqlstate(hstmt, "07009") == OK);
 
   /* SQLDescribeCol() */
-  expect_stmt(hstmt, SQLDescribeCol(hstmt, 0, NULL, 0, NULL, NULL, NULL,
-                                    NULL, NULL), SQL_ERROR);
+  expect_stmt(hstmt, SQLDescribeCol(hstmt, 0, dummy, sizeof(dummy), NULL, NULL,
+                                    NULL, NULL, NULL), SQL_ERROR);
   is(check_sqlstate(hstmt, "07009") == OK);
 
   expect_stmt(hstmt, SQLDescribeCol(hstmt, 5, NULL, 0, NULL, NULL, NULL,
@@ -318,7 +319,7 @@
 DECLARE_TEST(bind_notenoughparam1)
 {
   SQLINTEGER i= 0;
-  ok_stmt(hstmt, SQLPrepare(hstmt, "select ?, ?", SQL_NTS));
+  ok_stmt(hstmt, SQLPrepare(hstmt, (SQLCHAR *)"select ?, ?", SQL_NTS));
 
   ok_stmt(hstmt, SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG,
                                   SQL_INTEGER, 0, 0, &i, 0, NULL));
@@ -336,7 +337,7 @@
 {
   SQLINTEGER i= 0;
   SQLSMALLINT cols= 0;
-  ok_stmt(hstmt, SQLPrepare(hstmt, "select ?, ?", SQL_NTS));
+  ok_stmt(hstmt, SQLPrepare(hstmt, (SQLCHAR *)"select ?, ?", SQL_NTS));
 
   /* trigger pre-execute */
   ok_stmt(hstmt, SQLNumResultCols(hstmt, &cols));
@@ -401,6 +402,31 @@
 }
 
 
+DECLARE_TEST(sqlerror)
+{
+  SQLCHAR message[SQL_MAX_MESSAGE_LENGTH + 1];
+  SQLCHAR sqlstate[SQL_SQLSTATE_SIZE + 1];
+  SQLINTEGER error;
+  SQLSMALLINT len;
+
+  expect_sql(hstmt, "SELECT * FROM tabledoesnotexist", SQL_ERROR);
+
+  ok_stmt(hstmt, SQLError(henv, hdbc, hstmt, sqlstate, &error,
+                          message, sizeof(message), &len));
+
+  /* Message has been consumed. */
+  expect_stmt(hstmt, SQLError(henv, hdbc, hstmt, sqlstate, &error,
+                              message, sizeof(message), &len),
+              SQL_NO_DATA_FOUND);
+
+  /* But should still be available using SQLGetDiagRec. */
+  ok_stmt(hstmt, SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, sqlstate, &error,
+                               message, sizeof(message), &len));
+
+  return OK;
+}
+
+
 BEGIN_TESTS
 #ifndef NO_DRIVERMANAGER
   ADD_TEST(t_odbc2_error)
@@ -417,6 +443,7 @@
   ADD_TEST(bind_notenoughparam2)
   ADD_TEST(getdata_need_nullind)
   ADD_TEST(t_handle_err)
+  ADD_TEST(sqlerror)
 END_TESTS
 
 RUN_TESTS

Thread
Connector/ODBC 3.51 commit: r904 - in branches/guffert: . driver testjwinstead1 Dec