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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy