Introduce macros QR_concat(), QR_detach() and QR_next().
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)
{
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);
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;
}
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;
}
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)
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);
* 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);
}
/*
{
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;
}
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);
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;
rv->deleted_keyset = NULL;
}
- MYLOG(0, "leaving\n");
+ MYLOG(0, "leaving %p\n", rv);
return rv;
}
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);
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 */
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)
res = SC_get_Curres(stmt);
if (res)
{
- res = res->next;
+ res = QR_nextr(res);
SC_set_Curres(stmt, res);
}
if (res)
{
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);
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 &&
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))
{
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;
}
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))
{
{
break;
}
- nres = qres->next;
+ nres = QR_nextr(qres);
if (nres && QR_get_notice(qres) != NULL)
{
if (QR_command_successful(nres) &&
}
QR_add_notice(nres, QR_get_notice(qres));
}
- qres->next = NULL;
+ QR_detach(qres);
QR_Destructor(qres);
qres = nres;
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);
}
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);
{
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))
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);