Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * pg_backup_null.c
4 : : *
5 : : * Implementation of an archive that is never saved; it is used by
6 : : * pg_dump to output a plain text SQL script instead of saving
7 : : * a real archive.
8 : : *
9 : : * See the headers to pg_restore for more details.
10 : : *
11 : : * Copyright (c) 2000, Philip Warner
12 : : * Rights are granted to use this software in any way so long
13 : : * as this notice is not removed.
14 : : *
15 : : * The author is not responsible for loss or damages that may
16 : : * result from its use.
17 : : *
18 : : *
19 : : * IDENTIFICATION
20 : : * src/bin/pg_dump/pg_backup_null.c
21 : : *
22 : : *-------------------------------------------------------------------------
23 : : */
24 : : #include "postgres_fe.h"
25 : :
26 : : #include "fe_utils/string_utils.h"
27 : : #include "libpq/libpq-fs.h"
28 : : #include "pg_backup_archiver.h"
29 : : #include "pg_backup_utils.h"
30 : :
31 : : static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
32 : : static void _WriteLOData(ArchiveHandle *AH, const void *data, size_t dLen);
33 : : static void _EndData(ArchiveHandle *AH, TocEntry *te);
34 : : static int _WriteByte(ArchiveHandle *AH, const int i);
35 : : static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
36 : : static void _CloseArchive(ArchiveHandle *AH);
37 : : static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
38 : : static void _StartLOs(ArchiveHandle *AH, TocEntry *te);
39 : : static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
40 : : static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
41 : : static void _EndLOs(ArchiveHandle *AH, TocEntry *te);
42 : :
43 : :
44 : : /*
45 : : * Initializer
46 : : */
47 : : void
8424 bruce@momjian.us 48 :CBC 141 : InitArchiveFmt_Null(ArchiveHandle *AH)
49 : : {
50 : : /* Assuming static functions, this can be copied for each format. */
51 : 141 : AH->WriteDataPtr = _WriteData;
52 : 141 : AH->EndDataPtr = _EndData;
53 : 141 : AH->WriteBytePtr = _WriteByte;
54 : 141 : AH->WriteBufPtr = _WriteBuf;
55 : 141 : AH->ClosePtr = _CloseArchive;
5550 andrew@dunslane.net 56 : 141 : AH->ReopenPtr = NULL;
8424 bruce@momjian.us 57 : 141 : AH->PrintTocDataPtr = _PrintTocData;
58 : :
496 peter@eisentraut.org 59 : 141 : AH->StartLOsPtr = _StartLOs;
60 : 141 : AH->StartLOPtr = _StartLO;
61 : 141 : AH->EndLOPtr = _EndLO;
62 : 141 : AH->EndLOsPtr = _EndLOs;
5550 andrew@dunslane.net 63 : 141 : AH->ClonePtr = NULL;
64 : 141 : AH->DeClonePtr = NULL;
65 : :
66 : : /*
67 : : * Now prevent reading...
68 : : */
8424 bruce@momjian.us 69 [ - + ]: 141 : if (AH->mode == archModeRead)
737 tgl@sss.pgh.pa.us 70 :UBC 0 : pg_fatal("this format cannot be read");
8668 pjw@rhyme.com.au 71 :CBC 141 : }
72 : :
73 : : /*
74 : : * - Start a new TOC entry
75 : : */
76 : :
77 : : /*
78 : : * Called by dumper via archiver from within a data dump routine
79 : : */
80 : : static void
7908 peter_e@gmx.net 81 : 1710834 : _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
82 : : {
83 : : /* Just send it to output, ahwrite() already errors on failure */
8424 bruce@momjian.us 84 : 1710834 : ahwrite(data, 1, dLen, AH);
8668 pjw@rhyme.com.au 85 : 1710834 : }
86 : :
87 : : /*
88 : : * Called by dumper via archiver from within a data dump routine
89 : : * We substitute this for _WriteData while emitting a LO
90 : : */
91 : : static void
496 peter@eisentraut.org 92 : 92 : _WriteLOData(ArchiveHandle *AH, const void *data, size_t dLen)
93 : : {
6872 tgl@sss.pgh.pa.us 94 [ + + ]: 92 : if (dLen > 0)
95 : : {
5367 96 : 32 : PQExpBuffer buf = createPQExpBuffer();
97 : :
98 : 32 : appendByteaLiteralAHX(buf,
99 : : (const unsigned char *) data,
100 : : dLen,
101 : : AH);
102 : :
103 : 32 : ahprintf(AH, "SELECT pg_catalog.lowrite(0, %s);\n", buf->data);
104 : :
105 : 32 : destroyPQExpBuffer(buf);
106 : : }
6872 107 : 92 : }
108 : :
109 : : static void
8424 bruce@momjian.us 110 :UBC 0 : _EndData(ArchiveHandle *AH, TocEntry *te)
111 : : {
112 : 0 : ahprintf(AH, "\n\n");
8668 pjw@rhyme.com.au 113 : 0 : }
114 : :
115 : : /*
116 : : * Called by the archiver when starting to save BLOB DATA (not schema).
117 : : * This routine should save whatever format-specific information is needed
118 : : * to read the LOs back into memory.
119 : : *
120 : : * It is called just prior to the dumper's DataDumper routine.
121 : : *
122 : : * Optional, but strongly recommended.
123 : : */
124 : : static void
496 peter@eisentraut.org 125 :CBC 52 : _StartLOs(ArchiveHandle *AH, TocEntry *te)
126 : : {
6872 tgl@sss.pgh.pa.us 127 : 52 : ahprintf(AH, "BEGIN;\n\n");
128 : 52 : }
129 : :
130 : : /*
131 : : * Called by the archiver when the dumper calls StartLO.
132 : : *
133 : : * Mandatory.
134 : : *
135 : : * Must save the passed OID for retrieval at restore-time.
136 : : */
137 : : static void
496 peter@eisentraut.org 138 : 60 : _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
139 : : {
140 : 60 : bool old_lo_style = (AH->version < K_VERS_1_12);
141 : :
6872 tgl@sss.pgh.pa.us 142 [ - + ]: 60 : if (oid == 0)
737 tgl@sss.pgh.pa.us 143 :UBC 0 : pg_fatal("invalid OID for large object");
144 : :
145 : : /* With an old archive we must do drop and create logic here */
496 peter@eisentraut.org 146 [ - + - - ]:CBC 60 : if (old_lo_style && AH->public.ropt->dropSchema)
496 peter@eisentraut.org 147 :UBC 0 : DropLOIfExists(AH, oid);
148 : :
496 peter@eisentraut.org 149 [ - + ]:CBC 60 : if (old_lo_style)
5169 tgl@sss.pgh.pa.us 150 :UBC 0 : ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
151 : : oid, INV_WRITE);
152 : : else
5169 tgl@sss.pgh.pa.us 153 :CBC 60 : ahprintf(AH, "SELECT pg_catalog.lo_open('%u', %d);\n",
154 : : oid, INV_WRITE);
155 : :
496 peter@eisentraut.org 156 : 60 : AH->WriteDataPtr = _WriteLOData;
6872 tgl@sss.pgh.pa.us 157 : 60 : }
158 : :
159 : : /*
160 : : * Called by the archiver when the dumper calls EndLO.
161 : : *
162 : : * Optional.
163 : : */
164 : : static void
496 peter@eisentraut.org 165 : 60 : _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
166 : : {
6872 tgl@sss.pgh.pa.us 167 : 60 : AH->WriteDataPtr = _WriteData;
168 : :
5381 169 : 60 : ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
6872 170 : 60 : }
171 : :
172 : : /*
173 : : * Called by the archiver when finishing saving BLOB DATA.
174 : : *
175 : : * Optional.
176 : : */
177 : : static void
496 peter@eisentraut.org 178 : 52 : _EndLOs(ArchiveHandle *AH, TocEntry *te)
179 : : {
6872 tgl@sss.pgh.pa.us 180 : 52 : ahprintf(AH, "COMMIT;\n\n");
181 : 52 : }
182 : :
183 : : /*------
184 : : * Called as part of a RestoreArchive call; for the NULL archive, this
185 : : * just sends the data for a given TOC entry to the output.
186 : : *------
187 : : */
188 : : static void
3014 189 : 3257 : _PrintTocData(ArchiveHandle *AH, TocEntry *te)
190 : : {
8422 191 [ + - ]: 3257 : if (te->dataDumper)
192 : : {
8668 pjw@rhyme.com.au 193 : 3257 : AH->currToc = te;
194 : :
6872 tgl@sss.pgh.pa.us 195 [ + + ]: 3257 : if (strcmp(te->desc, "BLOBS") == 0)
496 peter@eisentraut.org 196 : 52 : _StartLOs(AH, te);
197 : :
2411 peter_e@gmx.net 198 : 3257 : te->dataDumper((Archive *) AH, te->dataDumperArg);
199 : :
6872 tgl@sss.pgh.pa.us 200 [ + + ]: 3256 : if (strcmp(te->desc, "BLOBS") == 0)
496 peter@eisentraut.org 201 : 52 : _EndLOs(AH, te);
202 : :
8668 pjw@rhyme.com.au 203 : 3256 : AH->currToc = NULL;
204 : : }
205 : 3256 : }
206 : :
207 : : static int
8424 bruce@momjian.us 208 :UBC 0 : _WriteByte(ArchiveHandle *AH, const int i)
209 : : {
210 : : /* Don't do anything */
211 : 0 : return 0;
212 : : }
213 : :
214 : : static void
7908 peter_e@gmx.net 215 : 0 : _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
216 : : {
217 : : /* Don't do anything */
8668 pjw@rhyme.com.au 218 : 0 : }
219 : :
220 : : static void
3014 tgl@sss.pgh.pa.us 221 :CBC 121 : _CloseArchive(ArchiveHandle *AH)
222 : : {
223 : : /* Nothing to do */
8668 pjw@rhyme.com.au 224 : 121 : }
|