Index: src/bin/psql/common.c =================================================================== *** common-orig.c Tue Oct 29 20:35:33 2002 --- common.c Sun Feb 16 11:06:33 2003 *************** *** 337,342 **** --- 337,343 ---- struct _timeb before, after; #endif + bool use_cursor, own_work; if (!pset.db) { *************** *** 370,383 **** #ifndef WIN32 if (pset.timing) gettimeofday(&before, NULL); - results = PQexec(pset.db, query); - if (pset.timing) - gettimeofday(&after, NULL); #else if (pset.timing) _ftime(&before); results = PQexec(pset.db, query); if (pset.timing) _ftime(&after); #endif --- 371,403 ---- #ifndef WIN32 if (pset.timing) gettimeofday(&before, NULL); #else if (pset.timing) _ftime(&before); + #endif + use_cursor = GetVariableBool(pset.vars, "USECURSOR"); + if (use_cursor) { + char *cursor_query; + int len, len1; + results = PQexec(pset.db, "begin work"); + own_work = PQresultStatus(results) == PGRES_COMMAND_OK; + len1 = strlen(query) + 1; + len = 7+1 + 8+1 + 6+1 + 3+1 + len1; + cursor_query = malloc(len); + sprintf(cursor_query, "declare PQcursor cursor for %s", query); + results = PQexec(pset.db, cursor_query); + free(cursor_query); + if (PQresultStatus(results) == PGRES_COMMAND_OK) { + query = "fetch PQcursor"; + results = PQexec(pset.db, query); + } + } else results = PQexec(pset.db, query); + #ifndef WIN32 if (pset.timing) + gettimeofday(&after, NULL); + #else + if (pset.timing) _ftime(&after); #endif *************** *** 415,420 **** --- 435,478 ---- break; } + if (use_cursor) { + bool tuples_only, default_footer; + int cnt; + tuples_only = pset.popt.topt.tuples_only; + default_footer = pset.popt.default_footer; + pset.popt.default_footer = false; + cnt = 0; + do { + cnt++; + printQuery(results, &pset.popt, pset.queryFout); + pset.popt.topt.tuples_only = true; + if (results) + PQclear(results); + results = PQexec(pset.db, query); + } while (PQresultStatus(results) == PGRES_TUPLES_OK + && PQntuples(results) > 0); + if (default_footer) { + if (cnt == 1) + printf(gettext("(1 row)")); + else + printf(gettext("(%d rows)"), cnt); + printf("\n"); + } + pset.popt.topt.tuples_only = tuples_only; + pset.popt.default_footer = default_footer; + query = "close cursor PQcursor"; + results = PQexec(pset.db, query); + if (own_work) + results = PQexec(pset.db, "commit work"); + #ifndef WIN32 + if (pset.timing) + gettimeofday(&after, NULL); + #else + if (pset.timing) + _ftime(&after); + #endif + } else + printQuery(results, &pset.popt, pset.queryFout); /* close file/pipe, restore old setting */ *************** *** 430,435 **** --- 488,531 ---- } else { + if (use_cursor && PQntuples(results) > 0) { + bool tuples_only, default_footer; + int cnt; + tuples_only = pset.popt.topt.tuples_only; + default_footer = pset.popt.default_footer; + pset.popt.default_footer = false; + cnt = 0; + do { + cnt++; + printQuery(results, &pset.popt, pset.queryFout); + pset.popt.topt.tuples_only = true; + if (results) + PQclear(results); + results = PQexec(pset.db, query); + } while (PQresultStatus(results) == PGRES_TUPLES_OK + && PQntuples(results) > 0); + if (default_footer) { + if (cnt == 1) + printf(gettext("(1 row)")); + else + printf(gettext("(%d rows)"), cnt); + printf("\n"); + } + pset.popt.topt.tuples_only = tuples_only; + pset.popt.default_footer = default_footer; + query = "close cursor PQcursor"; + results = PQexec(pset.db, query); + if (own_work) + results = PQexec(pset.db, "commit work"); + #ifndef WIN32 + if (pset.timing) + gettimeofday(&after, NULL); + #else + if (pset.timing) + _ftime(&after); + #endif + } else + printQuery(results, &pset.popt, pset.queryFout); success = true; }