mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
Use a cursor for fetching data in -d or -D mode, so that pg_dump doesn't
run out of memory with large tables in these modes. Patch from Martijn van Oosterhout.
This commit is contained in:
parent
545c6696a6
commit
814f40cf43
@ -22,7 +22,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.226 2001/08/27 01:09:59 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.227 2001/08/27 20:33:07 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -400,20 +400,34 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv)
|
|||||||
|
|
||||||
if (fout->remoteVersion >= 70100)
|
if (fout->remoteVersion >= 70100)
|
||||||
{
|
{
|
||||||
appendPQExpBuffer(q, "SELECT * FROM ONLY %s", fmtId(classname, force_quotes));
|
appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR SELECT * FROM ONLY %s", fmtId(classname, force_quotes));
|
||||||
} else {
|
} else {
|
||||||
appendPQExpBuffer(q, "SELECT * FROM %s", fmtId(classname, force_quotes));
|
appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR SELECT * FROM %s", fmtId(classname, force_quotes));
|
||||||
}
|
}
|
||||||
|
|
||||||
res = PQexec(g_conn, q->data);
|
res = PQexec(g_conn, q->data);
|
||||||
if (!res ||
|
if (!res ||
|
||||||
PQresultStatus(res) != PGRES_TUPLES_OK)
|
PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||||
{
|
{
|
||||||
write_msg(NULL, "dumpClasses(): SQL command failed\n");
|
write_msg(NULL, "dumpClasses(): SQL command failed\n");
|
||||||
write_msg(NULL, "Error message from server: %s", PQerrorMessage(g_conn));
|
write_msg(NULL, "Error message from server: %s", PQerrorMessage(g_conn));
|
||||||
write_msg(NULL, "The command was: %s\n", q->data);
|
write_msg(NULL, "The command was: %s\n", q->data);
|
||||||
exit_nicely();
|
exit_nicely();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
PQclear(res);
|
||||||
|
|
||||||
|
res = PQexec(g_conn, "FETCH 100 FROM _pg_dump_cursor");
|
||||||
|
if (!res ||
|
||||||
|
PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
|
{
|
||||||
|
write_msg(NULL, "dumpClasses(): SQL command failed\n");
|
||||||
|
write_msg(NULL, "Error message from server: %s", PQerrorMessage(g_conn));
|
||||||
|
write_msg(NULL, "The command was: FETCH 100 FROM _pg_dump_cursor\n");
|
||||||
|
exit_nicely();
|
||||||
|
}
|
||||||
|
|
||||||
for (tuple = 0; tuple < PQntuples(res); tuple++)
|
for (tuple = 0; tuple < PQntuples(res); tuple++)
|
||||||
{
|
{
|
||||||
archprintf(fout, "INSERT INTO %s ", fmtId(classname, force_quotes));
|
archprintf(fout, "INSERT INTO %s ", fmtId(classname, force_quotes));
|
||||||
@ -470,7 +484,21 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv)
|
|||||||
}
|
}
|
||||||
archprintf(fout, ");\n");
|
archprintf(fout, ");\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} while( PQntuples(res) > 0 );
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
|
|
||||||
|
res = PQexec(g_conn, "CLOSE _pg_dump_cursor");
|
||||||
|
if (!res ||
|
||||||
|
PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||||
|
{
|
||||||
|
write_msg(NULL, "dumpClasses(): SQL command failed\n");
|
||||||
|
write_msg(NULL, "Error message from server: %s", PQerrorMessage(g_conn));
|
||||||
|
write_msg(NULL, "The command was: CLOSE _pg_dump_cursor\n");
|
||||||
|
exit_nicely();
|
||||||
|
}
|
||||||
|
PQclear(res);
|
||||||
|
|
||||||
destroyPQExpBuffer(q);
|
destroyPQExpBuffer(q);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user