Skip to content

Commit a5375bf

Browse files
committed
Make pg_dump/pg_restore --clean options drop large objects too.
In passing, make invocations of lo_xxx functions a bit more schema-safe. Itagaki Takahiro
1 parent 5dedce6 commit a5375bf

File tree

6 files changed

+30
-20
lines changed

6 files changed

+30
-20
lines changed

src/bin/pg_dump/pg_backup_archiver.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*
1616
*
1717
* IDENTIFICATION
18-
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.172 2009/06/11 14:49:07 momjian Exp $
18+
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.173 2009/07/21 21:46:10 tgl Exp $
1919
*
2020
*-------------------------------------------------------------------------
2121
*/
@@ -895,7 +895,7 @@ EndRestoreBlobs(ArchiveHandle *AH)
895895
* Called by a format handler to initiate restoration of a blob
896896
*/
897897
void
898-
StartRestoreBlob(ArchiveHandle *AH, Oid oid)
898+
StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop)
899899
{
900900
Oid loOid;
901901

@@ -906,6 +906,10 @@ StartRestoreBlob(ArchiveHandle *AH, Oid oid)
906906

907907
ahlog(AH, 2, "restoring large object with OID %u\n", oid);
908908

909+
if (drop)
910+
ahprintf(AH, "SELECT CASE WHEN EXISTS(SELECT 1 FROM pg_catalog.pg_largeobject WHERE loid = '%u') THEN pg_catalog.lo_unlink('%u') END;\n",
911+
oid, oid);
912+
909913
if (AH->connection)
910914
{
911915
loOid = lo_create(AH->connection, oid);
@@ -919,7 +923,8 @@ StartRestoreBlob(ArchiveHandle *AH, Oid oid)
919923
}
920924
else
921925
{
922-
ahprintf(AH, "SELECT lo_open(lo_create(%u), %d);\n", oid, INV_WRITE);
926+
ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
927+
oid, INV_WRITE);
923928
}
924929

925930
AH->writingBlob = 1;
@@ -943,7 +948,7 @@ EndRestoreBlob(ArchiveHandle *AH, Oid oid)
943948
}
944949
else
945950
{
946-
ahprintf(AH, "SELECT lo_close(0);\n\n");
951+
ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
947952
}
948953
}
949954

@@ -1254,7 +1259,7 @@ dump_lo_buf(ArchiveHandle *AH)
12541259

12551260
/* Hack: turn off writingBlob so ahwrite doesn't recurse to here */
12561261
AH->writingBlob = 0;
1257-
ahprintf(AH, "SELECT lowrite(0, '%s');\n", str);
1262+
ahprintf(AH, "SELECT pg_catalog.lowrite(0, '%s');\n", str);
12581263
AH->writingBlob = 1;
12591264

12601265
free(str);

src/bin/pg_dump/pg_backup_archiver.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*
1818
*
1919
* IDENTIFICATION
20-
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.79 2009/06/11 14:49:07 momjian Exp $
20+
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.80 2009/07/21 21:46:10 tgl Exp $
2121
*
2222
*-------------------------------------------------------------------------
2323
*/
@@ -355,7 +355,7 @@ int ReadOffset(ArchiveHandle *, pgoff_t *);
355355
size_t WriteOffset(ArchiveHandle *, pgoff_t, int);
356356

357357
extern void StartRestoreBlobs(ArchiveHandle *AH);
358-
extern void StartRestoreBlob(ArchiveHandle *AH, Oid oid);
358+
extern void StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop);
359359
extern void EndRestoreBlob(ArchiveHandle *AH, Oid oid);
360360
extern void EndRestoreBlobs(ArchiveHandle *AH);
361361

src/bin/pg_dump/pg_backup_custom.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*
2020
*
2121
* IDENTIFICATION
22-
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_custom.c,v 1.42 2009/06/11 14:49:07 momjian Exp $
22+
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_custom.c,v 1.43 2009/07/21 21:46:10 tgl Exp $
2323
*
2424
*-------------------------------------------------------------------------
2525
*/
@@ -54,7 +54,7 @@ static void _StartBlobs(ArchiveHandle *AH, TocEntry *te);
5454
static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
5555
static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
5656
static void _EndBlobs(ArchiveHandle *AH, TocEntry *te);
57-
static void _LoadBlobs(ArchiveHandle *AH);
57+
static void _LoadBlobs(ArchiveHandle *AH, bool drop);
5858
static void _Clone(ArchiveHandle *AH);
5959
static void _DeClone(ArchiveHandle *AH);
6060

@@ -501,7 +501,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
501501
break;
502502

503503
case BLK_BLOBS:
504-
_LoadBlobs(AH);
504+
_LoadBlobs(AH, ropt->dropSchema);
505505
break;
506506

507507
default: /* Always have a default */
@@ -622,7 +622,7 @@ _PrintData(ArchiveHandle *AH)
622622
}
623623

624624
static void
625-
_LoadBlobs(ArchiveHandle *AH)
625+
_LoadBlobs(ArchiveHandle *AH, bool drop)
626626
{
627627
Oid oid;
628628

@@ -631,7 +631,7 @@ _LoadBlobs(ArchiveHandle *AH)
631631
oid = ReadInt(AH);
632632
while (oid != 0)
633633
{
634-
StartRestoreBlob(AH, oid);
634+
StartRestoreBlob(AH, oid, drop);
635635
_PrintData(AH);
636636
EndRestoreBlob(AH, oid);
637637
oid = ReadInt(AH);

src/bin/pg_dump/pg_backup_files.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*
2121
*
2222
* IDENTIFICATION
23-
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.35 2009/02/02 20:07:37 adunstan Exp $
23+
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.36 2009/07/21 21:46:10 tgl Exp $
2424
*
2525
*-------------------------------------------------------------------------
2626
*/
@@ -382,7 +382,7 @@ _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt)
382382

383383
while (oid != 0)
384384
{
385-
StartRestoreBlob(AH, oid);
385+
StartRestoreBlob(AH, oid, ropt->dropSchema);
386386
_PrintFileData(AH, fname, ropt);
387387
EndRestoreBlob(AH, oid);
388388
_getBlobTocEntry(AH, &oid, fname);

src/bin/pg_dump/pg_backup_null.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*
1818
*
1919
* IDENTIFICATION
20-
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_null.c,v 1.20 2009/02/02 20:07:37 adunstan Exp $
20+
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_null.c,v 1.21 2009/07/21 21:46:10 tgl Exp $
2121
*
2222
*-------------------------------------------------------------------------
2323
*/
@@ -108,7 +108,7 @@ _WriteBlobData(ArchiveHandle *AH, const void *data, size_t dLen)
108108
if (!str)
109109
die_horribly(AH, NULL, "out of memory\n");
110110

111-
ahprintf(AH, "SELECT lowrite(0, '%s');\n", str);
111+
ahprintf(AH, "SELECT pg_catalog.lowrite(0, '%s');\n", str);
112112

113113
free(str);
114114
}
@@ -149,7 +149,12 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
149149
if (oid == 0)
150150
die_horribly(AH, NULL, "invalid OID for large object\n");
151151

152-
ahprintf(AH, "SELECT lo_open(lo_create(%u), %d);\n", oid, INV_WRITE);
152+
if (AH->ropt->dropSchema)
153+
ahprintf(AH, "SELECT CASE WHEN EXISTS(SELECT 1 FROM pg_catalog.pg_largeobject WHERE loid = '%u') THEN pg_catalog.lo_unlink('%u') END;\n",
154+
oid, oid);
155+
156+
ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
157+
oid, INV_WRITE);
153158

154159
AH->WriteDataPtr = _WriteBlobData;
155160
}
@@ -164,7 +169,7 @@ _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
164169
{
165170
AH->WriteDataPtr = _WriteData;
166171

167-
ahprintf(AH, "SELECT lo_close(0);\n\n");
172+
ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
168173
}
169174

170175
/*

src/bin/pg_dump/pg_backup_tar.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*
1717
*
1818
* IDENTIFICATION
19-
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.65 2009/06/04 19:16:48 tgl Exp $
19+
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.66 2009/07/21 21:46:10 tgl Exp $
2020
*
2121
*-------------------------------------------------------------------------
2222
*/
@@ -729,7 +729,7 @@ _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt)
729729
{
730730
ahlog(AH, 1, "restoring large object OID %u\n", oid);
731731

732-
StartRestoreBlob(AH, oid);
732+
StartRestoreBlob(AH, oid, ropt->dropSchema);
733733

734734
while ((cnt = tarRead(buf, 4095, th)) > 0)
735735
{

0 commit comments

Comments
 (0)