Skip to content

Commit 76d38cb

Browse files
author
Hiroshi Inoue
committed
Changed the error handling as follows.
1) ERRORs cause an SQL_ERROR and the SQLSTATE='S1000'. 2) NOTICEs cause an SQL_SUCCESS_WITH_INFO and the succeeding SQLError() returns the NOTICE message.
1 parent 3709a5a commit 76d38cb

File tree

4 files changed

+52
-27
lines changed

4 files changed

+52
-27
lines changed

src/interfaces/odbc/connection.c

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
916916
int id;
917917
SocketClass *sock = self->sock;
918918
int maxlen;
919+
BOOL msg_truncated;
919920

920921
/* ERROR_MSG_LENGTH is suffcient */
921922
static char msgbuffer[ERROR_MSG_LENGTH + 1];
@@ -1004,6 +1005,8 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
10041005
self->errormsg = "No response from backend while receiving a portal query command";
10051006
mylog("send_query: 'C' - %s\n", self->errormsg);
10061007
CC_set_no_trans(self);
1008+
if (res)
1009+
QR_Destructor(res);
10071010
return NULL;
10081011
}
10091012
else
@@ -1018,7 +1021,8 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
10181021
mylog("send_query: setting cmdbuffer = '%s'\n", cmdbuffer);
10191022

10201023
/* Only save the first command */
1021-
QR_set_status(res, PGRES_COMMAND_OK);
1024+
if (QR_command_successful(res))
1025+
QR_set_status(res, PGRES_COMMAND_OK);
10221026
QR_set_command(res, cmdbuffer);
10231027

10241028
/*
@@ -1049,11 +1053,16 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
10491053
qlog("Command response: '%s'\n", cmdbuffer);
10501054
break;
10511055
case 'N':
1052-
SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
1056+
msg_truncated = SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
1057+
if (QR_command_successful(res))
1058+
QR_set_status(res, PGRES_NONFATAL_ERROR);
1059+
QR_set_notice(res, cmdbuffer); /* will dup this string */
10531060
qlog("NOTICE from backend during clear: '%s'\n", cmdbuffer);
1061+
while (msg_truncated)
1062+
msg_truncated = SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
10541063
break;
10551064
case 'E':
1056-
SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
1065+
msg_truncated = SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
10571066
qlog("ERROR from backend during clear: '%s'\n", cmdbuffer);
10581067

10591068
/*
@@ -1071,8 +1080,10 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
10711080
}
10721081
else
10731082
self->errornumber = CONNECTION_SERVER_REPORTED_WARNING;
1074-
QR_set_status(res, PGRES_NONFATAL_ERROR);
1083+
QR_set_status(res, PGRES_FATAL_ERROR);
10751084
QR_set_aborted(res, TRUE);
1085+
while (msg_truncated)
1086+
msg_truncated = SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
10761087
break;
10771088
}
10781089
}
@@ -1088,14 +1099,17 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
10881099
case 'Z': /* Backend is ready for new query (6.4) */
10891100
break;
10901101
case 'N': /* NOTICE: */
1091-
SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
1092-
1093-
res = QR_Constructor();
1094-
QR_set_status(res, PGRES_NONFATAL_ERROR);
1102+
msg_truncated = SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
1103+
if (!res)
1104+
res = QR_Constructor();
1105+
if (QR_command_successful(res))
1106+
QR_set_status(res, PGRES_NONFATAL_ERROR);
10951107
QR_set_notice(res, cmdbuffer); /* will dup this string */
10961108

10971109
mylog("~~~ NOTICE: '%s'\n", cmdbuffer);
10981110
qlog("NOTICE from backend during send_query: '%s'\n", cmdbuffer);
1111+
while (msg_truncated)
1112+
msg_truncated = SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
10991113

11001114
continue; /* dont return a result -- continue
11011115
* reading */
@@ -1107,20 +1121,22 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
11071121
{
11081122
self->errornumber = CONNECTION_BACKEND_CRAZY;
11091123
self->errormsg = "Unexpected protocol character from backend (send_query - I)";
1110-
res = QR_Constructor();
1124+
if (!res)
1125+
res = QR_Constructor();
11111126
QR_set_status(res, PGRES_FATAL_ERROR);
11121127
return res;
11131128
}
11141129
else
11151130
{
11161131
/* We return the empty query */
1117-
res = QR_Constructor();
1132+
if (!res)
1133+
res = QR_Constructor();
11181134
QR_set_status(res, PGRES_EMPTY_QUERY);
11191135
return res;
11201136
}
11211137
break;
11221138
case 'E':
1123-
SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH);
1139+
msg_truncated = SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH);
11241140

11251141
/* Remove a newline */
11261142
if (msgbuffer[0] != '\0' && msgbuffer[strlen(msgbuffer) - 1] == '\n')
@@ -1132,20 +1148,22 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
11321148
qlog("ERROR from backend during send_query: '%s'\n", self->errormsg);
11331149

11341150
/* We should report that an error occured. Zoltan */
1135-
res = QR_Constructor();
1151+
if (!res)
1152+
res = QR_Constructor();
11361153

11371154
if (!strncmp(self->errormsg, "FATAL", 5))
11381155
{
11391156
self->errornumber = CONNECTION_SERVER_REPORTED_ERROR;
11401157
CC_set_no_trans(self);
1141-
QR_set_status(res, PGRES_FATAL_ERROR);
11421158
}
11431159
else
11441160
{
11451161
self->errornumber = CONNECTION_SERVER_REPORTED_WARNING;
1146-
QR_set_status(res, PGRES_NONFATAL_ERROR);
11471162
}
1163+
QR_set_status(res, PGRES_FATAL_ERROR);
11481164
QR_set_aborted(res, TRUE);
1165+
while (msg_truncated)
1166+
msg_truncated = SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
11491167

11501168
return res; /* instead of NULL. Zoltan */
11511169

@@ -1188,19 +1206,25 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
11881206

11891207
return result_in;
11901208
case 'D': /* Copy in command began successfully */
1191-
res = QR_Constructor();
1192-
QR_set_status(res, PGRES_COPY_IN);
1209+
if (!res)
1210+
res = QR_Constructor();
1211+
if (QR_command_successful(res))
1212+
QR_set_status(res, PGRES_COPY_IN);
11931213
return res;
11941214
case 'B': /* Copy out command began successfully */
1195-
res = QR_Constructor();
1196-
QR_set_status(res, PGRES_COPY_OUT);
1215+
if (!res)
1216+
res = QR_Constructor();
1217+
if (QR_command_successful(res))
1218+
QR_set_status(res, PGRES_COPY_OUT);
11971219
return res;
11981220
default:
11991221
self->errornumber = CONNECTION_BACKEND_CRAZY;
12001222
self->errormsg = "Unexpected protocol character from backend (send_query)";
12011223
CC_set_no_trans(self);
12021224

12031225
mylog("send_query: error - %s\n", self->errormsg);
1226+
if (res)
1227+
QR_Destructor(res);
12041228
return NULL;
12051229
}
12061230
}

src/interfaces/odbc/socket.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,17 +195,19 @@ SOCK_put_n_char(SocketClass *self, char *buffer, int len)
195195
/*
196196
* bufsize must include room for the null terminator
197197
* will read at most bufsize-1 characters + null.
198+
* returns TRUE if truncation occurs.
198199
*/
199-
void
200+
BOOL
200201
SOCK_get_string(SocketClass *self, char *buffer, int bufsize)
201202
{
202203
register int lf = 0;
203204

204205
for (lf = 0; lf < bufsize; lf++)
205206
if (!(buffer[lf] = SOCK_get_next_byte(self)))
206-
return;
207+
return FALSE;
207208

208209
buffer[bufsize - 1] = '\0';
210+
return TRUE;
209211
}
210212

211213

src/interfaces/odbc/socket.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void SOCK_Destructor(SocketClass *self);
8686
char SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname);
8787
void SOCK_get_n_char(SocketClass *self, char *buffer, int len);
8888
void SOCK_put_n_char(SocketClass *self, char *buffer, int len);
89-
void SOCK_get_string(SocketClass *self, char *buffer, int bufsize);
89+
BOOL SOCK_get_string(SocketClass *self, char *buffer, int bufsize);
9090
void SOCK_put_string(SocketClass *self, char *string);
9191
int SOCK_get_int(SocketClass *self, short len);
9292
void SOCK_put_int(SocketClass *self, int value, short len);

src/interfaces/odbc/statement.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,8 @@ SC_create_errormsg(StatementClass *self)
652652
sprintf(&msg[pos], ";\n%s", sock->errormsg);
653653
}
654654
}
655+
if (!msg[0] && res && QR_get_notice(res))
656+
return QR_get_notice(res);
655657

656658
return msg;
657659
}
@@ -1044,14 +1046,11 @@ SC_execute(StatementClass *self)
10441046

10451047
if (self->errornumber == STMT_OK)
10461048
return SQL_SUCCESS;
1047-
1049+
else if (self->errornumber == STMT_INFO_ONLY)
1050+
return SQL_SUCCESS_WITH_INFO;
10481051
else
10491052
{
1050-
/* Modified, 2000-04-29, Zoltan */
1051-
if (self->errornumber == STMT_INFO_ONLY)
1052-
self->errormsg = "Error while executing the query (non-fatal)";
1053-
else
1054-
self->errormsg = "Unknown error";
1053+
self->errormsg = "Error while executing the query";
10551054
SC_log_error(func, "", self);
10561055
return SQL_ERROR;
10571056
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy