Revise the handling of QResultClass list.
authorHiroshi Inoue <h-inoue@dream.email.ne.jp>
Wed, 24 Jun 2020 10:46:44 +0000 (19:46 +0900)
committerHiroshi Inoue <h-inoue@dream.email.ne.jp>
Wed, 1 Jul 2020 09:14:35 +0000 (18:14 +0900)
Introduce macros QR_concat(), QR_detach() and QR_next().

connection.c
execute.c
qresult.c
qresult.h
results.c
statement.c

index abd8b0796f31f90372e270422c257928cd73324b..dc85fa5da78edacffe82e363573d229bdfc4f805 100644 (file)
@@ -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);
                }
                /*
index 25985fa3bc65b546788a0cd022fd9cb7d999a3d1..11cf4bcff415d06e2b39ce7a832d3d7d12bfc2b2 100644 (file)
--- 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;
        }
index c89a3eab70e92192b764409cdfcb583b5bd0b144..db7901f8acf79f66550307328f204c9f64c01000 100644 (file)
--- 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);
 
index a032a09508205947240425c1dd1f7df6015cf679..0fb812c8239c287e55c98cadbbe7bb09ee635436 100644 (file)
--- 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)
index f2fcd74b693d9b061a6a463e4e976ed7ea6f2a86..b8c6f456070073a9bcfd68d8f699bec358a2b630 100644 (file)
--- 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))
        {
index 93964fb6eeb314056d7adb8e13b6929822ab8c81..df882d58916f68a12fbf81cd333bfb576a8f2827 100644 (file)
@@ -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);