Commit 9c50a004 authored by Hiroshi Inoue's avatar Hiroshi Inoue

Change the driver so that large error messages are returned

by multiple SQLError calls.
parent f5d0c6ca
No related merge requests found
......@@ -91,12 +91,16 @@ SQLError(
char *msg;
int status;
mylog("**** SQLError: henv=%u, hdbc=%u, hstmt=%u\n", henv, hdbc, hstmt);
mylog("**** SQLError: henv=%u, hdbc=%u, hstmt=%u <%d>\n", henv, hdbc, hstmt, cbErrorMsgMax);
if (cbErrorMsgMax < 0)
return SQL_ERROR;
if (SQL_NULL_HSTMT != hstmt)
{
/* CC: return an error of a hstmt */
StatementClass *stmt = (StatementClass *) hstmt;
SWORD msglen;
BOOL once_again = FALSE;
if (SC_get_error(stmt, &status, &msg))
{
......@@ -112,8 +116,18 @@ SQLError(
return SQL_NO_DATA_FOUND;
}
msglen = (SWORD) strlen(msg);
if (NULL != pcbErrorMsg)
*pcbErrorMsg = (SWORD) strlen(msg);
{
*pcbErrorMsg = msglen;
if (cbErrorMsgMax == 0)
once_again = TRUE;
else if (msglen >= cbErrorMsgMax)
{
once_again = TRUE;
*pcbErrorMsg = cbErrorMsgMax - 1;
}
}
if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0))
strncpy_null(szErrorMsg, msg, cbErrorMsgMax);
......@@ -238,7 +252,27 @@ SQLError(
return SQL_NO_DATA_FOUND;
}
return SQL_SUCCESS;
if (once_again)
{
int outlen;
stmt->errornumber = status;
if (cbErrorMsgMax > 0)
outlen = *pcbErrorMsg;
else
outlen = 0;
if (!stmt->errormsg_malloced || !stmt->errormsg)
{
stmt->errormsg = malloc(msglen - outlen + 1);
stmt->errormsg_malloced = TRUE;
}
memmove(stmt->errormsg, msg + outlen, msglen - outlen + 1);
}
else if (stmt->errormsg_malloced)
SC_clear_error(stmt);
if (cbErrorMsgMax == 0)
return SQL_SUCCESS_WITH_INFO;
else
return SQL_SUCCESS;
}
else if (SQL_NULL_HDBC != hdbc)
{
......
......@@ -248,6 +248,7 @@ SC_Constructor(void)
rv->errormsg = NULL;
rv->errornumber = 0;
rv->errormsg_created = FALSE;
rv->errormsg_malloced = FALSE;
rv->statement = NULL;
rv->stmt_with_params = NULL;
......@@ -530,9 +531,12 @@ SC_recycle_statement(StatementClass *self)
self->bind_row = 0;
self->last_fetch_count = 0;
if (self->errormsg_malloced && self->errormsg)
free(self->errormsg);
self->errormsg = NULL;
self->errornumber = 0;
self->errormsg_created = FALSE;
self->errormsg_malloced = FALSE;
self->lobj_fd = -1;
......@@ -610,9 +614,12 @@ SC_unbind_cols(StatementClass *self)
void
SC_clear_error(StatementClass *self)
{
if (self->errormsg_malloced && self->errormsg)
free(self->errormsg);
self->errornumber = 0;
self->errormsg = NULL;
self->errormsg_created = FALSE;
self->errormsg_malloced = FALSE;
}
......@@ -675,7 +682,8 @@ SC_get_error(StatementClass *self, int *number, char **message)
{
*number = self->errornumber;
*message = self->errormsg;
self->errormsg = NULL;
if (!self->errormsg_malloced)
self->errormsg = NULL;
}
rv = (self->errornumber != 0);
......
......@@ -218,6 +218,8 @@ struct StatementClass_
char pre_executing; /* This statement is prematurely executing */
char inaccurate_result; /* Current status is PREMATURE but
* result is inaccurate */
char errormsg_malloced; /* Current status is PREMATURE but
* result is inaccurate */
};
#define SC_get_conn(a) (a->hdbc)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment