From c29bc983a38d5f61329767fa619665c1c571071f Mon Sep 17 00:00:00 2001 From: Hiroshi Inoue Date: Wed, 24 Jun 2020 19:46:44 +0900 Subject: [PATCH] Revise the handling of QResultClass list. Introduce macros QR_concat(), QR_detach() and QR_next(). --- connection.c | 34 +++++++++++++++++----------------- execute.c | 4 ++-- qresult.c | 10 +++++----- qresult.h | 6 +++++- results.c | 8 ++++---- statement.c | 20 ++++++++++---------- 6 files changed, 43 insertions(+), 39 deletions(-) diff --git a/connection.c b/connection.c index abd8b07..dc85fa5 100644 --- a/connection.c +++ b/connection.c @@ -1352,7 +1352,7 @@ static int handle_show_results(const QResultClass *res) const QResultClass *qres; ConnectionClass *conn = QR_get_conn(res); - for (qres = res; qres; qres = qres->next) + for (qres = res; qres; qres = QR_nextr(qres)) { if (!qres->command || stricmp(qres->command, "SHOW") != 0) @@ -1838,7 +1838,7 @@ CC_send_query_append(ConnectionClass *self, const char *query, QueryInfo *qi, UD { cmdres = CC_send_query_append(self, appendq, qi, flag & (~(GO_INTO_TRANSACTION)), stmt, NULL); if (QR_command_maybe_successful(cmdres)) - res->next = cmdres; + QR_attach(res, cmdres); else { QR_Destructor(res); @@ -1975,15 +1975,15 @@ CC_send_query_append(ConnectionClass *self, const char *query, QueryInfo *qi, UD if (query_completed) /* allow for "show" style notices */ { - res->next = QR_Constructor(); - if (!res->next) + QR_attach(res, QR_Constructor()); + if (!QR_nextr(res)) { CC_set_error(self, CONNECTION_COULD_NOT_RECEIVE, "Could not create result info in send_query.", func); ReadyToReturn = TRUE; retres = NULL; break; } - res = res->next; + res = QR_nextr(res); nrarg.res = res; } @@ -2098,8 +2098,8 @@ MYLOG(DETAIL_LOG_LEVEL, "Discarded a RELEASE result\n"); case PGRES_SINGLE_TUPLE: if (query_completed) { - res->next = QR_Constructor(); - if (!res->next) + QR_attach(res, QR_Constructor()); + if (!QR_nextr(res)) { CC_set_error(self, CONNECTION_COULD_NOT_RECEIVE, "Could not create result info in send_query.", func); ReadyToReturn = TRUE; @@ -2108,16 +2108,16 @@ MYLOG(DETAIL_LOG_LEVEL, "Discarded a RELEASE result\n"); } if (create_keyset) { - QR_set_haskeyset(res->next); + QR_set_haskeyset(QR_nextr(res)); if (stmt) { if (stmt->num_key_fields < 0) /* for safety */ CheckPgClassInfo(stmt); - res->next->num_key_fields = stmt->num_key_fields; + QR_nextr(res)->num_key_fields = stmt->num_key_fields; } } - MYLOG(0, " 'T' no result_in: res = %p\n", res->next); - res = res->next; + MYLOG(0, " 'T' no result_in: res = %p\n", QR_nextr(res)); + res = QR_nextr(res); nrarg.res = res; if (qi) @@ -2191,15 +2191,15 @@ MYLOG(DETAIL_LOG_LEVEL, "Discarded a RELEASE result\n"); case PGRES_COPY_IN: if (query_completed) { - res->next = QR_Constructor(); - if (!res->next) + QR_attach(res, QR_Constructor()); + if (!QR_nextr(res)) { CC_set_error(self, CONNECTION_COULD_NOT_RECEIVE, "Could not create result info in send_query.", func); ReadyToReturn = TRUE; retres = NULL; break; } - res = res->next; + res = QR_nextr(res); nrarg.res = res; } QR_set_rstatus(res, PORES_COPY_IN); @@ -2296,12 +2296,12 @@ MYLOG(DETAIL_LOG_LEVEL, " rollback_on_error=%d CC_is_in_trans=%d discard_next_sa * discard results other than errors. */ QResultClass *qres; - for (qres = retres; qres->next; qres = retres) + for (qres = retres; QR_nextr(qres); qres = retres) { if (QR_get_aborted(qres)) break; - retres = qres->next; - qres->next = NULL; + retres = QR_nextr(qres); + QR_detach(qres); QR_Destructor(qres); } /* diff --git a/execute.c b/execute.c index 25985fa..11cf4bc 100644 --- a/execute.c +++ b/execute.c @@ -574,12 +574,12 @@ MYLOG(0, "count_of_deffered=%d\n", count_of_deffered); { QResultClass *kres; - if (kres = res->next, kres) + if (kres = QR_nextr(res), kres) { QR_set_fields(kres, QR_get_fields(res)); QR_set_fields(res, NULL); kres->num_fields = res->num_fields; - res->next = NULL; + QR_detach(res); SC_set_Result(stmt, kres); res = kres; } diff --git a/qresult.c b/qresult.c index c89a3ea..db7901f 100644 --- a/qresult.c +++ b/qresult.c @@ -102,7 +102,7 @@ QR_set_cursor(QResultClass *self, const char *name) QResultClass *res; self->cursor_name = NULL; - for (res = self->next; NULL != res; res = res->next) + for (res = QR_nextr(self); NULL != res; res = QR_nextr(res)) { if (NULL != res->cursor_name) free(res->cursor_name); @@ -195,7 +195,7 @@ QR_Constructor(void) rv->command = NULL; rv->notice = NULL; rv->conn = NULL; - rv->next = NULL; + QR_nextr(rv) = NULL; rv->count_backend_allocated = 0; rv->count_keyset_allocated = 0; rv->num_total_read = 0; @@ -239,7 +239,7 @@ QR_Constructor(void) rv->deleted_keyset = NULL; } - MYLOG(0, "leaving\n"); + MYLOG(0, "leaving %p\n", rv); return rv; } @@ -305,8 +305,8 @@ QR_close_result(QResultClass *self, BOOL destroy) self->notice = NULL; } /* Destruct the result object in the chain */ - next = self->next; - self->next = NULL; + next = QR_nextr(self); + QR_detach(self); if (destroy) free(self); diff --git a/qresult.h b/qresult.h index a032a09..0fb812c 100644 --- a/qresult.h +++ b/qresult.h @@ -55,7 +55,7 @@ struct QResultClass_ ColumnInfoClass *fields; /* the Column information */ ConnectionClass *conn; /* the connection this result is using * (backend) */ - QResultClass *next; /* the following result class */ + QResultClass *lnext; /* the following result class */ /* Stuff for declare/fetch tuples */ SQLULEN num_total_read; /* the highest absolute position ever read in + 1 */ @@ -189,6 +189,10 @@ do { \ MYLOG(1, "to " FORMAT_LEN " to next read\n", self->fetch_number); \ } while (0) +#define QR_concat(self, a) ((self)->lnext=(a)) +#define QR_detach(self) ((self)->lnext=NULL) +#define QR_nextr(self) ((self)->lnext) + #define QR_get_message(self) ((self)->message ? (self)->message : (self)->messageref) #define QR_get_command(self) (self->command) #define QR_get_notice(self) (self->notice) diff --git a/results.c b/results.c index f2fcd74..b8c6f45 100644 --- a/results.c +++ b/results.c @@ -1984,7 +1984,7 @@ PGAPI_MoreResults(HSTMT hstmt) res = SC_get_Curres(stmt); if (res) { - res = res->next; + res = QR_nextr(res); SC_set_Curres(stmt, res); } if (res) @@ -3023,7 +3023,7 @@ ProcessRollback(ConnectionClass *conn, BOOL undo, BOOL partial) { if (stmt = conn->stmts[i], !stmt) continue; - for (res = SC_get_Result(stmt); res; res = res->next) + for (res = SC_get_Result(stmt); res; res = QR_nextr(res)) { if (undo) UndoRollback(stmt, res, partial); @@ -4374,7 +4374,7 @@ irow_insert(RETCODE ret, StatementClass *stmt, StatementClass *istmt, const char *cmdstr; BindInfoClass *bookmark; - tres = (ires->next ? ires->next : ires); + tres = (QR_nextr(ires) ? QR_nextr(ires) : ires); cmdstr = QR_get_command(tres); if (cmdstr && sscanf(cmdstr, "INSERT %u %d", &oid, &addcnt) == 2 && @@ -5171,7 +5171,7 @@ MYLOG(0, "i=%d bidx=" FORMAT_LEN " cached=" FORMAT_ULEN "\n", i, bidx, res->num_ QR_set_num_cached_rows(res, size_of_rowset); res->num_total_read = size_of_rowset; rowStatusArray = (SC_get_IRDF(stmt))->rowStatusArray; - for (i = 0, qres = res; i < size_of_rowset && NULL != qres; i++, qres = qres->next) + for (i = 0, qres = res; i < size_of_rowset && NULL != qres; i++, qres = QR_nextr(qres)) { if (1 == QR_get_num_cached_tuples(qres)) { diff --git a/statement.c b/statement.c index 93964fb..df882d5 100644 --- a/statement.c +++ b/statement.c @@ -1281,7 +1281,7 @@ SC_create_errorinfo(const StatementClass *self, PG_ErrorInfo *pgerror_fail_safe) looponce = (SC_get_Result(self) != res); msg[0] = '\0'; - for (loopend = FALSE; (NULL != res) && !loopend; res = res->next) + for (loopend = FALSE; (NULL != res) && !loopend; res = QR_nextr(res)) { if (looponce) loopend = TRUE; @@ -2012,7 +2012,7 @@ SC_execute(StatementClass *self) } res = SC_get_Result(self); if (self->curr_param_result && res) - SC_set_Result(self, res->next); + SC_set_Result(self, QR_nextr(res)); res = CC_send_query_append(conn, self->stmt_with_params, qryi, qflag, SC_get_ancestor(self), appendq); if (useCursor && QR_command_maybe_successful(res)) { @@ -2032,7 +2032,7 @@ SC_execute(StatementClass *self) { break; } - nres = qres->next; + nres = QR_nextr(qres); if (nres && QR_get_notice(qres) != NULL) { if (QR_command_successful(nres) && @@ -2042,7 +2042,7 @@ SC_execute(StatementClass *self) } QR_add_notice(nres, QR_get_notice(qres)); } - qres->next = NULL; + QR_detach(qres); QR_Destructor(qres); qres = nres; @@ -2128,7 +2128,7 @@ SC_execute(StatementClass *self) QResultClass *tres; /* see if the query did return any result columns */ - for (tres = res, numcols = 0; !numcols && tres; tres = tres->next) + for (tres = res, numcols = 0; !numcols && tres; tres = QR_nextr(tres)) { numcols = QR_NumResultCols(tres); } @@ -2155,12 +2155,12 @@ MYLOG(DETAIL_LOG_LEVEL, "!!%p->miscinfo=%x res=%p\n", self, self->miscinfo, res) SQL_CONCUR_READ_ONLY != self->options.scroll_concurrency && !useCursor) { - if (tres = res->next, tres) + if (tres = QR_nextr(res), tres) { QR_set_fields(tres, QR_get_fields(res)); QR_set_fields(res, NULL); tres->num_fields = res->num_fields; - res->next = NULL; + QR_detach(res); QR_Destructor(res); SC_init_Result(self); SC_set_Result(self, tres); @@ -2197,13 +2197,13 @@ MYLOG(DETAIL_LOG_LEVEL, "!!%p->miscinfo=%x res=%p\n", self, self->miscinfo, res) { QResultClass *last; - for (last = SC_get_Result(self); NULL != last->next; last = last->next) + for (last = SC_get_Result(self); NULL != QR_nextr(last); last = QR_nextr(last)) { if (last == res) break; } if (last != res) - last->next = res; + QR_attach(last, res); self->curr_param_result = 1; } if (NULL == SC_get_Curres(self)) @@ -2507,7 +2507,7 @@ QResultClass *add_libpq_notice_receiver(StatementClass *stmt, notice_receiver_ar QResultClass *res = NULL, *newres = NULL; if (stmt->curr_param_result) - for (res = SC_get_Result(stmt); NULL != res && NULL != res->next; res = res->next); + for (res = SC_get_Result(stmt); NULL != res && NULL != QR_nextr(res); res = QR_nextr(res)); if (!res) newres = res = QR_Constructor(); nrarg->conn = SC_get_conn(stmt); -- 2.39.5