add support for returning right SQLSTATE from SQLGetDiagField and SQLGetDiagRec
authorLudek Finstrle <luf@pzkagis.cz>
Thu, 26 Jan 2006 19:34:25 +0000 (19:34 +0000)
committerLudek Finstrle <luf@pzkagis.cz>
Thu, 26 Jan 2006 19:34:25 +0000 (19:34 +0000)
connection.c
environ.c
statement.c

index b7fe650c4dab41fe43521a175193795d0b40fa93..49dddfe73b32c43cea486f51e9ffd369f2f3f0a6 100644 (file)
@@ -1574,8 +1574,8 @@ CC_log_error(const char *func, const char *desc, const ConnectionClass *self)
 
    if (self)
    {
-       qlog("CONN ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__error_message));
-       mylog("CONN ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__error_message));
+       qlog("CONN ERROR: func=%s, desc='%s', errnum=%d, sqlstate=%s, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__sqlstate), nullcheck(self->__error_message));
+       mylog("CONN ERROR: func=%s, desc='%s', errnum=%d, sqlstate=%s, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__sqlstate), nullcheck(self->__error_message));
        qlog("            ------------------------------------------------------------\n");
        qlog("            henv=%u, conn=%u, status=%u, num_stmts=%d\n", self->henv, self, self->status, self->num_stmts);
    }
index feb6df1fecb6ae1b0d079c45edea849a474a47ed..70d500e58c45d29a6bfa6dbde44491321cad6ab9 100644 (file)
--- a/environ.c
+++ b/environ.c
@@ -311,134 +311,134 @@ PGAPI_StmtError(    HSTMT hstmt,
 
    if (NULL != szSqlState)
 
-       switch (status)
-       {
-               /* now determine the SQLSTATE to be returned */
-           case STMT_ROW_VERSION_CHANGED:
-               pg_sqlstate_set(env, szSqlState, "01001", "01001");
-               /* data truncated */
-               break;
-           case STMT_TRUNCATED:
-               pg_sqlstate_set(env, szSqlState, "01004", "01004");
-               /* data truncated */
-               break;
-           case STMT_INFO_ONLY:
-               pg_sqlstate_set(env, szSqlState, "00000", "0000");
-               /* just information that is returned, no error */
-               break;
-           case STMT_BAD_ERROR:
-               pg_sqlstate_set(env, szSqlState, "08S01", "08S01");
-               /* communication link failure */
-               break;
-           case STMT_CREATE_TABLE_ERROR:
-               pg_sqlstate_set(env, szSqlState, "42S01", "S0001");
-               /* table already exists */
-               break;
-           case STMT_STATUS_ERROR:
-           case STMT_SEQUENCE_ERROR:
-               pg_sqlstate_set(env, szSqlState, "HY010", "S1010");
-               /* Function sequence error */
-               break;
-           case STMT_NO_MEMORY_ERROR:
-               pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
-               /* memory allocation failure */
-               break;
-           case STMT_COLNUM_ERROR:
-               pg_sqlstate_set(env, szSqlState, "07009", "S1002");
-               /* invalid column number */
-               break;
-           case STMT_NO_STMTSTRING:
-               pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
-               /* having no stmtstring is also a malloc problem */
-               break;
-           case STMT_ERROR_TAKEN_FROM_BACKEND:
-               pg_sqlstate_set(env, szSqlState, SC_get_sqlstate(stmt), "S1000");
-               /* Use the ODBC 3 sqlstate reported by the backend. */
-               break;
-           case STMT_INTERNAL_ERROR:
-               pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
-               /* general error */
-               break;
-           case STMT_FETCH_OUT_OF_RANGE:
-               pg_sqlstate_set(env, szSqlState, "HY106", "S1106");
-               break;
-
-           case STMT_ROW_OUT_OF_RANGE:
-               pg_sqlstate_set(env, szSqlState, "HY107", "S1107");
-               break;
-
-           case STMT_OPERATION_CANCELLED:
-               pg_sqlstate_set(env, szSqlState, "HY008", "S1008");
-               break;
-
-           case STMT_NOT_IMPLEMENTED_ERROR:
-               pg_sqlstate_set(env, szSqlState, "HYC00", "S1C00"); /* == 'driver not
-                                                    * capable' */
-               break;
-           case STMT_OPTION_OUT_OF_RANGE_ERROR:
-               pg_sqlstate_set(env, szSqlState, "HY092", "S1092");
-               break;
-           case STMT_BAD_PARAMETER_NUMBER_ERROR:
-               pg_sqlstate_set(env, szSqlState, "07009", "S1093");
-               break;
-           case STMT_INVALID_COLUMN_NUMBER_ERROR:
-               pg_sqlstate_set(env, szSqlState, "07009", "S1002");
-               break;
-           case STMT_RESTRICTED_DATA_TYPE_ERROR:
-               pg_sqlstate_set(env, szSqlState, "07006", "07006");
-               break;
-           case STMT_INVALID_CURSOR_STATE_ERROR:
-               pg_sqlstate_set(env, szSqlState, "07005", "24000");
-               break;
-           case STMT_ERROR_IN_ROW:
-               pg_sqlstate_set(env, szSqlState, "01S01", "01S01");
-               break;
-           case STMT_OPTION_VALUE_CHANGED:
-               pg_sqlstate_set(env, szSqlState, "01S02", "01S02");
-               break;
-           case STMT_POS_BEFORE_RECORDSET:
-               pg_sqlstate_set(env, szSqlState, "01S06", "01S06");
-               break;
-           case STMT_INVALID_CURSOR_NAME:
-               pg_sqlstate_set(env, szSqlState, "34000", "34000");
-               break;
-           case STMT_NO_CURSOR_NAME:
-               pg_sqlstate_set(env, szSqlState, "S1015", "S1015");
-               break;
-           case STMT_INVALID_ARGUMENT_NO:
-               pg_sqlstate_set(env, szSqlState, "HY024", "S1009");
-               /* invalid argument value */
-               break;
-           case STMT_INVALID_CURSOR_POSITION:
-               pg_sqlstate_set(env, szSqlState, "HY109", "S1109");
-               break;
-           case STMT_RETURN_NULL_WITHOUT_INDICATOR:
-               pg_sqlstate_set(env, szSqlState, "22002", "22002");
-               break;
-           case STMT_VALUE_OUT_OF_RANGE:
-               pg_sqlstate_set(env, szSqlState, "HY019", "22003");
-               break;
-           case STMT_OPERATION_INVALID:
-               pg_sqlstate_set(env, szSqlState, "HY011", "S1011");
-               break;
-           case STMT_INVALID_DESCRIPTOR_IDENTIFIER:
-               pg_sqlstate_set(env, szSqlState, "HY091", "HY091");
-               break;
-           case STMT_INVALID_OPTION_IDENTIFIER:
-               pg_sqlstate_set(env, szSqlState, "HY092", "HY092");
-               break;
-           case STMT_OPTION_NOT_FOR_THE_DRIVER:
-               pg_sqlstate_set(env, szSqlState, "HYC00", "HYC00");
-               break;
-           case STMT_COUNT_FIELD_INCORRECT:
-               pg_sqlstate_set(env, szSqlState, "07002", "07002");
-               break;
-           case STMT_EXEC_ERROR:
-           default:
-               pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
-               /* also a general error */
-               break;
-       }
+       if ((stmt->__sqlstate != NULL) && (stmt->__sqlstate[0] != '\0'))
+               pg_sqlstate_set(env, szSqlState, stmt->__sqlstate, stmt->__sqlstate);
+       else
+           switch (status)
+           {
+                   /* now determine the SQLSTATE to be returned */
+               case STMT_ROW_VERSION_CHANGED:
+                   pg_sqlstate_set(env, szSqlState, "01001", "01001");
+                   /* data truncated */
+                   break;
+               case STMT_TRUNCATED:
+                   pg_sqlstate_set(env, szSqlState, "01004", "01004");
+                   /* data truncated */
+                   break;
+               case STMT_INFO_ONLY:
+                   pg_sqlstate_set(env, szSqlState, "00000", "0000");
+                   /* just information that is returned, no error */
+                   break;
+               case STMT_BAD_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "08S01", "08S01");
+                   /* communication link failure */
+                   break;
+               case STMT_CREATE_TABLE_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "42S01", "S0001");
+                   /* table already exists */
+                   break;
+               case STMT_STATUS_ERROR:
+               case STMT_SEQUENCE_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "HY010", "S1010");
+                   /* Function sequence error */
+                   break;
+               case STMT_NO_MEMORY_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
+                   /* memory allocation failure */
+                   break;
+               case STMT_COLNUM_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "07009", "S1002");
+                   /* invalid column number */
+                   break;
+               case STMT_NO_STMTSTRING:
+                   pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
+                   /* having no stmtstring is also a malloc problem */
+                   break;
+               case STMT_ERROR_TAKEN_FROM_BACKEND:
+                   pg_sqlstate_set(env, szSqlState, SC_get_sqlstate(stmt), "S1000");
+                   /* Use the ODBC 3 sqlstate reported by the backend. */
+                   break;
+               case STMT_INTERNAL_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
+                   /* general error */
+                   break;
+               case STMT_FETCH_OUT_OF_RANGE:
+                   pg_sqlstate_set(env, szSqlState, "HY106", "S1106");
+                   break;
+               case STMT_ROW_OUT_OF_RANGE:
+                   pg_sqlstate_set(env, szSqlState, "HY107", "S1107");
+                   break;
+               case STMT_OPERATION_CANCELLED:
+                   pg_sqlstate_set(env, szSqlState, "HY008", "S1008");
+                   break;
+               case STMT_NOT_IMPLEMENTED_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "HYC00", "S1C00"); /* == 'driver not
+                                                        * capable' */
+                   break;
+               case STMT_OPTION_OUT_OF_RANGE_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "HY092", "S1092");
+                   break;
+               case STMT_BAD_PARAMETER_NUMBER_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "07009", "S1093");
+                   break;
+               case STMT_INVALID_COLUMN_NUMBER_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "07009", "S1002");
+                   break;
+               case STMT_RESTRICTED_DATA_TYPE_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "07006", "07006");
+                   break;
+               case STMT_INVALID_CURSOR_STATE_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "07005", "24000");
+                   break;
+               case STMT_ERROR_IN_ROW:
+                   pg_sqlstate_set(env, szSqlState, "01S01", "01S01");
+                   break;
+               case STMT_OPTION_VALUE_CHANGED:
+                   pg_sqlstate_set(env, szSqlState, "01S02", "01S02");
+                   break;
+               case STMT_POS_BEFORE_RECORDSET:
+                   pg_sqlstate_set(env, szSqlState, "01S06", "01S06");
+                   break;
+               case STMT_INVALID_CURSOR_NAME:
+                   pg_sqlstate_set(env, szSqlState, "34000", "34000");
+                   break;
+               case STMT_NO_CURSOR_NAME:
+                   pg_sqlstate_set(env, szSqlState, "S1015", "S1015");
+                   break;
+               case STMT_INVALID_ARGUMENT_NO:
+                   pg_sqlstate_set(env, szSqlState, "HY024", "S1009");
+                   /* invalid argument value */
+                   break;
+               case STMT_INVALID_CURSOR_POSITION:
+                   pg_sqlstate_set(env, szSqlState, "HY109", "S1109");
+                   break;
+               case STMT_RETURN_NULL_WITHOUT_INDICATOR:
+                   pg_sqlstate_set(env, szSqlState, "22002", "22002");
+                   break;
+               case STMT_VALUE_OUT_OF_RANGE:
+                   pg_sqlstate_set(env, szSqlState, "HY019", "22003");
+                   break;
+               case STMT_OPERATION_INVALID:
+                   pg_sqlstate_set(env, szSqlState, "HY011", "S1011");
+                   break;
+               case STMT_INVALID_DESCRIPTOR_IDENTIFIER:
+                   pg_sqlstate_set(env, szSqlState, "HY091", "HY091");
+                   break;
+               case STMT_INVALID_OPTION_IDENTIFIER:
+                   pg_sqlstate_set(env, szSqlState, "HY092", "HY092");
+                   break;
+               case STMT_OPTION_NOT_FOR_THE_DRIVER:
+                   pg_sqlstate_set(env, szSqlState, "HYC00", "HYC00");
+                   break;
+               case STMT_COUNT_FIELD_INCORRECT:
+                   pg_sqlstate_set(env, szSqlState, "07002", "07002");
+                   break;
+               case STMT_EXEC_ERROR:
+               default:
+                   pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
+                   /* also a general error */
+                   break;
+           }
    mylog("      szSqlState = '%s',len=%d, szError='%s'\n", szSqlState, pcblen, szErrorMsg);
    if (clear_str)
    {
@@ -503,77 +503,79 @@ PGAPI_ConnectError(HDBC hdbc,
        *pfNativeError = status;
 
    if (NULL != szSqlState)
-       switch (status)
-       {
-           case STMT_OPTION_VALUE_CHANGED:
-           case CONN_OPTION_VALUE_CHANGED:
-               pg_sqlstate_set(env, szSqlState, "01S02", "01S02");
-               break;
-           case STMT_TRUNCATED:
-           case CONN_TRUNCATED:
-               pg_sqlstate_set(env, szSqlState, "01004", "01004");
-               /* data truncated */
-               break;
-           case CONN_INIREAD_ERROR:
-               pg_sqlstate_set(env, szSqlState, "IM002", "IM002");
-               /* data source not found */
-               break;
-           case CONNECTION_SERVER_NOT_REACHED:
-           case CONN_OPENDB_ERROR:
-               pg_sqlstate_set(env, szSqlState, "08001", "08001");
-               /* unable to connect to data source */
-               break;
-           case CONN_INVALID_AUTHENTICATION:
-           case CONN_AUTH_TYPE_UNSUPPORTED:
-               pg_sqlstate_set(env, szSqlState, "28000", "28000");
-               break;
-           case CONN_STMT_ALLOC_ERROR:
-               pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
-               /* memory allocation failure */
-               break;
-           case CONN_IN_USE:
-               pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
-               /* general error */
-               break;
-           case CONN_UNSUPPORTED_OPTION:
-               pg_sqlstate_set(env, szSqlState, "IM001", "IM001");
-               /* driver does not support this function */
-           case CONN_INVALID_ARGUMENT_NO:
-               pg_sqlstate_set(env, szSqlState, "HY009", "S1009");
-               /* invalid argument value */
-               break;
-           case CONN_TRANSACT_IN_PROGRES:
-               pg_sqlstate_set(env, szSqlState, "HY010", "S1010");
-
-               /*
-                * when the user tries to switch commit mode in a
-                * transaction
-                */
-               /* -> function sequence error */
-               break;
-           case CONN_NO_MEMORY_ERROR:
-               pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
-               break;
-           case CONN_NOT_IMPLEMENTED_ERROR:
-           case STMT_NOT_IMPLEMENTED_ERROR:
-               pg_sqlstate_set(env, szSqlState, "HYC00", "S1C00");
-               break;
-           case STMT_RETURN_NULL_WITHOUT_INDICATOR:
-               pg_sqlstate_set(env, szSqlState, "22002", "22002");
-               break;
-           case CONN_VALUE_OUT_OF_RANGE:
-           case STMT_VALUE_OUT_OF_RANGE:
-               pg_sqlstate_set(env, szSqlState, "HY019", "22003");
-               break;
-           case CONNECTION_COULD_NOT_SEND:
-           case CONNECTION_COULD_NOT_RECEIVE:
-               pg_sqlstate_set(env, szSqlState, "08S01", "08S01");
-               break;
-           default:
-               pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
-               /* general error */
-               break;
-       }
+       if ((conn->__sqlstate != NULL) && (conn->__sqlstate[0] != '\0'))
+           pg_sqlstate_set(env, szSqlState, conn->__sqlstate, conn->__sqlstate);
+       else
+           switch (status)
+           {
+               case STMT_OPTION_VALUE_CHANGED:
+               case CONN_OPTION_VALUE_CHANGED:
+                   pg_sqlstate_set(env, szSqlState, "01S02", "01S02");
+                   break;
+               case STMT_TRUNCATED:
+               case CONN_TRUNCATED:
+                   pg_sqlstate_set(env, szSqlState, "01004", "01004");
+                   /* data truncated */
+                   break;
+               case CONN_INIREAD_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "IM002", "IM002");
+                   /* data source not found */
+                   break;
+               case CONNECTION_SERVER_NOT_REACHED:
+               case CONN_OPENDB_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "08001", "08001");
+                   /* unable to connect to data source */
+                   break;
+               case CONN_INVALID_AUTHENTICATION:
+               case CONN_AUTH_TYPE_UNSUPPORTED:
+                   pg_sqlstate_set(env, szSqlState, "28000", "28000");
+                   break;
+               case CONN_STMT_ALLOC_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
+                   /* memory allocation failure */
+                   break;
+               case CONN_IN_USE:
+                   pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
+                   /* general error */
+                   break;
+               case CONN_UNSUPPORTED_OPTION:
+                   pg_sqlstate_set(env, szSqlState, "IM001", "IM001");
+                   /* driver does not support this function */
+               case CONN_INVALID_ARGUMENT_NO:
+                   pg_sqlstate_set(env, szSqlState, "HY009", "S1009");
+                   /* invalid argument value */
+                   break;
+               case CONN_TRANSACT_IN_PROGRES:
+                   pg_sqlstate_set(env, szSqlState, "HY010", "S1010");
+                   /*
+                    * when the user tries to switch commit mode in a
+                    * transaction
+                    */
+                   /* -> function sequence error */
+                   break;
+               case CONN_NO_MEMORY_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
+                   break;
+               case CONN_NOT_IMPLEMENTED_ERROR:
+               case STMT_NOT_IMPLEMENTED_ERROR:
+                   pg_sqlstate_set(env, szSqlState, "HYC00", "S1C00");
+                   break;
+               case STMT_RETURN_NULL_WITHOUT_INDICATOR:
+                   pg_sqlstate_set(env, szSqlState, "22002", "22002");
+                   break;
+               case CONN_VALUE_OUT_OF_RANGE:
+               case STMT_VALUE_OUT_OF_RANGE:
+                   pg_sqlstate_set(env, szSqlState, "HY019", "22003");
+                   break;
+               case CONNECTION_COULD_NOT_SEND:
+               case CONNECTION_COULD_NOT_RECEIVE:
+                   pg_sqlstate_set(env, szSqlState, "08S01", "08S01");
+                   break;
+               default:
+                   pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
+                   /* general error */
+                   break;
+           }
 
    mylog("      szSqlState = '%s',len=%d, szError='%s'\n", szSqlState, msglen, szErrorMsg);
    if (once_again)
index 451a650680364dad71586ea20625724f5e161a54..ce115361a35632360d317421177e2e0903fd57fd 100644 (file)
@@ -1481,8 +1481,8 @@ SC_log_error(const char *func, const char *desc, const StatementClass *self)
 
        rowsetSize = (7 == self->transition_status ? opts->size_of_rowset_odbc2 : opts->size_of_rowset);
 
-       qlog("STATEMENT ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__error_message));
-       mylog("STATEMENT ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__error_message));
+       qlog("STATEMENT ERROR: func=%s, desc='%s', errnum=%d, sqlstate=%s, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__sqlstate), nullcheck(self->__error_message));
+       mylog("STATEMENT ERROR: func=%s, desc='%s', errnum=%d, sqlstate=%s, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__sqlstate), nullcheck(self->__error_message));
        qlog("                 ------------------------------------------------------------\n");
        qlog("                 hdbc=%u, stmt=%u, result=%u\n", self->hdbc, self, res);
        qlog("                 manual_result=%d, prepare=%d, internal=%d\n", self->manual_result, self->prepare, self->internal);