|
15 | 15 | *
|
16 | 16 | *
|
17 | 17 | * IDENTIFICATION
|
18 |
| - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.25 2001/04/25 07:03:19 pjw Exp $ |
| 18 | + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.26 2001/05/12 01:03:59 pjw Exp $ |
19 | 19 | *
|
20 | 20 | * Modifications - 28-Jun-2000 - pjw@rhyme.com.au
|
21 | 21 | *
|
|
51 | 51 | * - Treat OIDs with more respect (avoid using ints, use macros for
|
52 | 52 | * conversion & comparison).
|
53 | 53 | *
|
| 54 | + * Modifications - 10-May-2001 - pjw@rhyme.com.au |
| 55 | + * - Treat SEQUENCE SET TOC entries as data entries rather than schema |
| 56 | + * entries. |
| 57 | + * - Make allowance for data entries that did not have a data dumper |
| 58 | + * routine (eg. SEQUENCE SET) |
| 59 | + * |
54 | 60 | *-------------------------------------------------------------------------
|
55 | 61 | */
|
56 | 62 |
|
@@ -154,6 +160,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
|
154 | 160 | int reqs;
|
155 | 161 | OutputContext sav;
|
156 | 162 | int impliedDataOnly;
|
| 163 | + bool defnDumped; |
157 | 164 |
|
158 | 165 | AH->ropt = ropt;
|
159 | 166 |
|
@@ -276,78 +283,99 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
|
276 | 283 | }
|
277 | 284 | }
|
278 | 285 |
|
| 286 | + defnDumped = false; |
| 287 | + |
279 | 288 | if ((reqs & 1) != 0) /* We want the schema */
|
280 | 289 | {
|
281 | 290 | /* Reconnect if necessary */
|
282 | 291 | _reconnectAsOwner(AH, "-", te);
|
283 | 292 |
|
284 | 293 | ahlog(AH, 1, "Creating %s %s\n", te->desc, te->name);
|
285 | 294 | _printTocEntry(AH, te, ropt, false);
|
| 295 | + defnDumped = true; |
286 | 296 |
|
287 | 297 | /* If we created a DB, connect to it... */
|
288 | 298 | if (strcmp(te->desc, "DATABASE") == 0)
|
289 | 299 | {
|
290 | 300 | ahlog(AH, 1, "Connecting to new DB '%s' as %s\n", te->name, te->owner);
|
291 | 301 | _reconnectAsUser(AH, te->name, te->owner);
|
292 | 302 | }
|
293 |
| - } |
| 303 | + } |
294 | 304 |
|
295 | 305 | /*
|
296 |
| - * If we want data, and it has data, then restore that too |
| 306 | + * If we have a data component, then process it |
297 | 307 | */
|
298 |
| - if (AH->PrintTocDataPtr !=NULL && (reqs & 2) != 0) |
| 308 | + if ( (reqs & 2) != 0 ) |
299 | 309 | {
|
300 |
| -#ifndef HAVE_LIBZ |
301 |
| - if (AH->compression != 0) |
302 |
| - die_horribly(AH, "%s: Unable to restore data from a compressed archive\n", progname); |
303 |
| -#endif |
304 |
| - |
305 |
| - _printTocEntry(AH, te, ropt, true); |
306 |
| - |
307 |
| - /* |
308 |
| - * Maybe we can't do BLOBS, so check if this node is for BLOBS |
| 310 | + /* hadDumper will be set if there is genuine data component for this |
| 311 | + * node. Otherwise, we need to check the defn field for statements |
| 312 | + * that need to be executed in data-only restores. |
309 | 313 | */
|
310 |
| - if ((strcmp(te->desc, "BLOBS") == 0) && !_canRestoreBlobs(AH)) |
| 314 | + if (te->hadDumper) |
311 | 315 | {
|
312 |
| - ahprintf(AH, "--\n-- SKIPPED \n--\n\n"); |
313 |
| - |
314 | 316 | /*
|
315 |
| - * This is a bit nasty - we assume, for the moment, that |
316 |
| - * if a custom output is used, then we don't want |
317 |
| - * warnings. |
| 317 | + * If we can output the data, then restore it. |
318 | 318 | */
|
319 |
| - if (!AH->CustomOutPtr) |
320 |
| - fprintf(stderr, "%s: WARNING - skipping BLOB restoration\n", progname); |
321 |
| - |
322 |
| - } |
323 |
| - else |
324 |
| - { |
325 |
| - |
326 |
| - _disableTriggersIfNecessary(AH, te, ropt); |
327 |
| - |
328 |
| - /* |
329 |
| - * Reconnect if necessary (_disableTriggers may have |
330 |
| - * reconnected) |
331 |
| - */ |
332 |
| - _reconnectAsOwner(AH, "-", te); |
333 |
| - |
334 |
| - ahlog(AH, 1, "Restoring data for %s \n", te->name); |
335 |
| - |
336 |
| - /* |
337 |
| - * If we have a copy statement, use it. As of V1.3, these |
338 |
| - * are separate to allow easy import from withing a |
339 |
| - * database connection. Pre 1.3 archives can not use DB |
340 |
| - * connections and are sent to output only. |
341 |
| - * |
342 |
| - * For V1.3+, the table data MUST have a copy statement so |
343 |
| - * that we can go into appropriate mode with libpq. |
344 |
| - */ |
345 |
| - if (te->copyStmt && strlen(te->copyStmt) > 0) |
346 |
| - ahprintf(AH, te->copyStmt); |
347 |
| - |
348 |
| - (*AH->PrintTocDataPtr) (AH, te, ropt); |
| 319 | + if (AH->PrintTocDataPtr !=NULL && (reqs & 2) != 0) |
| 320 | + { |
| 321 | +#ifndef HAVE_LIBZ |
| 322 | + if (AH->compression != 0) |
| 323 | + die_horribly(AH, "%s: Unable to restore data from a compressed archive\n", |
| 324 | + progname); |
| 325 | +#endif |
349 | 326 |
|
350 |
| - _enableTriggersIfNecessary(AH, te, ropt); |
| 327 | + _printTocEntry(AH, te, ropt, true); |
| 328 | + |
| 329 | + /* |
| 330 | + * Maybe we can't do BLOBS, so check if this node is for BLOBS |
| 331 | + */ |
| 332 | + if ((strcmp(te->desc, "BLOBS") == 0) && !_canRestoreBlobs(AH)) |
| 333 | + { |
| 334 | + ahprintf(AH, "--\n-- SKIPPED \n--\n\n"); |
| 335 | + |
| 336 | + /* |
| 337 | + * This is a bit nasty - we assume, for the moment, that |
| 338 | + * if a custom output is used, then we don't want |
| 339 | + * warnings. |
| 340 | + */ |
| 341 | + if (!AH->CustomOutPtr) |
| 342 | + fprintf(stderr, "%s: WARNING - skipping BLOB restoration\n", progname); |
| 343 | + |
| 344 | + } |
| 345 | + else |
| 346 | + { |
| 347 | + |
| 348 | + _disableTriggersIfNecessary(AH, te, ropt); |
| 349 | + |
| 350 | + /* |
| 351 | + * Reconnect if necessary (_disableTriggers may have |
| 352 | + * reconnected) |
| 353 | + */ |
| 354 | + _reconnectAsOwner(AH, "-", te); |
| 355 | + |
| 356 | + ahlog(AH, 1, "Restoring data for %s \n", te->name); |
| 357 | + |
| 358 | + /* |
| 359 | + * If we have a copy statement, use it. As of V1.3, these |
| 360 | + * are separate to allow easy import from withing a |
| 361 | + * database connection. Pre 1.3 archives can not use DB |
| 362 | + * connections and are sent to output only. |
| 363 | + * |
| 364 | + * For V1.3+, the table data MUST have a copy statement so |
| 365 | + * that we can go into appropriate mode with libpq. |
| 366 | + */ |
| 367 | + if (te->copyStmt && strlen(te->copyStmt) > 0) |
| 368 | + ahprintf(AH, te->copyStmt); |
| 369 | + |
| 370 | + (*AH->PrintTocDataPtr) (AH, te, ropt); |
| 371 | + |
| 372 | + _enableTriggersIfNecessary(AH, te, ropt); |
| 373 | + } |
| 374 | + } |
| 375 | + } else if (!defnDumped) { |
| 376 | + /* If we haven't already dumped the defn part, do so now */ |
| 377 | + ahlog(AH, 1, "Executing %s %s\n", te->desc, te->name); |
| 378 | + _printTocEntry(AH, te, ropt, false); |
351 | 379 | }
|
352 | 380 | }
|
353 | 381 | te = te->next;
|
@@ -1829,26 +1857,22 @@ _tocEntryRequired(TocEntry *te, RestoreOptions *ropt)
|
1829 | 1857 | return 0;
|
1830 | 1858 | }
|
1831 | 1859 |
|
1832 |
| - /* Special Case: If 'SEQUENCE SET' and schemaOnly, then not needed */ |
1833 |
| - if (ropt->schemaOnly && (strcmp(te->desc, "SEQUENCE SET") == 0)) |
1834 |
| - return 0; |
| 1860 | + /* Special Case: If 'SEQUENCE SET' then it is considered a data entry */ |
| 1861 | + if (strcmp(te->desc, "SEQUENCE SET") == 0) |
| 1862 | + res = res & 2; |
1835 | 1863 |
|
1836 | 1864 | /* Mask it if we only want schema */
|
1837 | 1865 | if (ropt->schemaOnly)
|
1838 | 1866 | res = res & 1;
|
1839 | 1867 |
|
1840 | 1868 | /* Mask it we only want data */
|
1841 |
| - if (ropt->dataOnly && (strcmp(te->desc, "SEQUENCE SET") != 0)) |
| 1869 | + if (ropt->dataOnly) |
1842 | 1870 | res = res & 2;
|
1843 | 1871 |
|
1844 | 1872 | /* Mask it if we don't have a schema contribition */
|
1845 | 1873 | if (!te->defn || strlen(te->defn) == 0)
|
1846 | 1874 | res = res & 2;
|
1847 | 1875 |
|
1848 |
| - /* Mask it if we don't have a possible data contribition */ |
1849 |
| - if (!te->hadDumper) |
1850 |
| - res = res & 1; |
1851 |
| - |
1852 | 1876 | /* Finally, if we used a list, limit based on that as well */
|
1853 | 1877 | if (ropt->limitToList && !ropt->idWanted[te->id - 1])
|
1854 | 1878 | return 0;
|
|
0 commit comments