driver/error.h (137 lines of code) (raw):
// Copyright (c) 2001, 2024, Oracle and/or its affiliates.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, version 2.0, as
// published by the Free Software Foundation.
//
// This program is designed to work with certain software (including
// but not limited to OpenSSL) that is licensed under separate terms, as
// designated in a particular file or component or in included license
// documentation. The authors of MySQL hereby grant you an additional
// permission to link the program and your derivative works with the
// separately licensed software that they have either included with
// the program or referenced in the documentation.
//
// Without limiting anything contained in the foregoing, this file,
// which is part of Connector/ODBC, is also subject to the
// Universal FOSS Exception, version 1.0, a copy of which can be found at
// https://oss.oracle.com/licenses/universal-foss-exception.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License, version 2.0, for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
/***************************************************************************
* ERROR.H *
* *
* @description: Definitions for error handling *
* *
* @author : MySQL AB(monty@mysql.com, venu@mysql.com) *
* @date : 2001-Aug-15 *
* @product : myodbc3 *
* *
****************************************************************************/
#ifndef __ERROR_H__
#define __ERROR_H__
/* Including driver version definitions */
#include "../MYODBC_CONF.h"
/*
myodbc internal error constants
*/
#define ER_INVALID_CURSOR_NAME 514
#define ER_ALL_COLUMNS_IGNORED 537
/*
myodbc error prefix
*/
#define MYODBC_ERROR_PREFIX "[MySQL][ODBC " MYODBC_STRDRIVERID " Driver]"
#define MYODBC_ERROR_CODE_START 500
#define CLEAR_ENV_ERROR(env) (((ENV *)env)->error.clear())
#define CLEAR_DBC_ERROR(dbc) (((DBC *)dbc)->error.clear())
#define CLEAR_STMT_ERROR(stmt) (((STMT *)stmt)->error.clear())
#define CLEAR_DESC_ERROR(desc) (((DESC *)desc)->error.clear())
#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
*/
typedef enum myodbc_errid
{
MYERR_01000 = 0,
MYERR_01004,
MYERR_01S02,
MYERR_01S03,
MYERR_01S04,
MYERR_01S06,
MYERR_07001,
MYERR_07005,
MYERR_07006,
MYERR_07009,
MYERR_08002,
MYERR_08003,
MYERR_24000,
MYERR_25000,
MYERR_25S01,
MYERR_34000,
MYERR_HYT00,
MYERR_S1000,
MYERR_S1001,
MYERR_S1002,
MYERR_S1003,
MYERR_S1004,
MYERR_S1007,
MYERR_S1009,
MYERR_S1010,
MYERR_S1011,
MYERR_S1012,
MYERR_S1013,
MYERR_S1015,
MYERR_S1016,
MYERR_S1017,
MYERR_S1024,
MYERR_S1090,
MYERR_S1091,
MYERR_S1092,
MYERR_S1093,
MYERR_S1095,
MYERR_S1106,
MYERR_S1107,
MYERR_S1109,
MYERR_S1C00,
MYERR_21S01,
MYERR_23000,
MYERR_42000,
MYERR_42S01,
MYERR_42S02,
MYERR_42S12,
MYERR_42S21,
MYERR_42S22,
MYERR_08S01,
/* Please add new errors to the end of enum, and not in alphabet order */
MYERR_08004,
} myodbc_errid;
/*
error handler structure
*/
struct MYERROR
{
SQLRETURN retcode = 0;
char current = 0;
std::string message;
SQLINTEGER native_error = 0;
std::string sqlstate;
MYERROR()
{}
MYERROR(SQLRETURN rc) : MYERROR()
{
retcode = rc;
}
MYERROR(myodbc_errid errid, const char *errtext, SQLINTEGER errcode,
const char *prefix);
MYERROR(const char *state, const char *msg, SQLINTEGER errcode,
const char *prefix);
MYERROR(SQLSMALLINT htype, SQLHANDLE handle, SQLRETURN rc)
{
SQLCHAR state[6], msg[SQL_MAX_MESSAGE_LENGTH];
SQLSMALLINT length;
SQLRETURN drc;
/** @todo Handle multiple diagnostic records. */
drc = SQLGetDiagRecA(htype, handle, 1, state, &native_error,
msg, SQL_MAX_MESSAGE_LENGTH - 1, &length);
if (drc == SQL_SUCCESS || drc == SQL_SUCCESS_WITH_INFO)
{
sqlstate = (const char*)state;
message = (const char*)msg;
}
else
{
sqlstate = (const char*)"00000";
message = (const char*)"Did not get expected diagnostics";
}
retcode = rc;
}
operator std::string() const
{
return message;
}
operator bool() const
{
return native_error != 0 || retcode != 0;
}
void clear()
{
retcode = 0;
message.clear();
current = 0;
native_error = 0;
sqlstate.clear();
}
MYERROR(const char* state, MYSQL* mysql) :
MYERROR(state, mysql_error(mysql),
mysql_errno(mysql), MYODBC_ERROR_PREFIX)
{}
MYERROR(const char* state, std::string errmsg) :
MYERROR(state, errmsg.c_str(), 0, MYODBC_ERROR_PREFIX)
{}
};
/*
error handler-predefined structure
odbc2 state, odbc3 state, message and return code
*/
typedef struct myodbc3_err_str {
char sqlstate[6]; /* ODBC3 STATE, if SQL_OV_ODBC2, then ODBC2 STATE */
char message[SQL_MAX_MESSAGE_LENGTH+1];/* ERROR MSG */
SQLRETURN retcode; /* RETURN CODE */
} MYODBC3_ERR_STR;
#endif /* __ERROR_H__ */