*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.99 2004/10/22 16:04:35 petere Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.100 2004/11/06 19:36:01 tgl Exp $
*
*-------------------------------------------------------------------------
*/
static void _becomeUser(ArchiveHandle *AH, const char *user);
static void _becomeOwner(ArchiveHandle *AH, TocEntry *te);
static void _selectOutputSchema(ArchiveHandle *AH, const char *schemaName);
+static void _selectTablespace(ArchiveHandle *AH, const char *tablespace);
static teReqs _tocEntryRequired(TocEntry *te, RestoreOptions *ropt, bool acl_pass);
static void _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
ArchiveEntry(Archive *AHX,
CatalogId catalogId, DumpId dumpId,
const char *tag,
- const char *namespace, const char *owner, bool withOids,
+ const char *namespace,
+ const char *tablespace,
+ const char *owner, bool withOids,
const char *desc, const char *defn,
const char *dropStmt, const char *copyStmt,
const DumpId *deps, int nDeps,
newToc->tag = strdup(tag);
newToc->namespace = namespace ? strdup(namespace) : NULL;
+ newToc->tablespace = tablespace ? strdup(tablespace) : NULL;
newToc->owner = strdup(owner);
newToc->withOids = withOids;
newToc->desc = strdup(desc);
ahprintf(AH, "; Format: %s\n", fmtName);
ahprintf(AH, "; Integer: %d bytes\n", (int) AH->intSize);
ahprintf(AH, "; Offset: %d bytes\n", (int) AH->offSize);
+ if (AH->archiveRemoteVersion)
+ ahprintf(AH, "; Dumped from database version: %s\n",
+ AH->archiveRemoteVersion);
+ if (AH->archiveDumpVersion)
+ ahprintf(AH, "; Dumped by pg_dump version: %s\n",
+ AH->archiveDumpVersion);
ahprintf(AH, ";\n;\n; Selected TOC Entries:\n;\n");
WriteStr(AH, te->dropStmt);
WriteStr(AH, te->copyStmt);
WriteStr(AH, te->namespace);
+ WriteStr(AH, te->tablespace);
WriteStr(AH, te->owner);
WriteStr(AH, te->withOids ? "true" : "false");
if (AH->version >= K_VERS_1_6)
te->namespace = ReadStr(AH);
+ if (AH->version >= K_VERS_1_10)
+ te->tablespace = ReadStr(AH);
+
te->owner = ReadStr(AH);
if (AH->version >= K_VERS_1_9)
{
destroyPQExpBuffer(qry);
}
+/*
+ * Issue the commands to select the specified tablespace as the current one
+ * in the target database.
+ */
+static void
+_selectTablespace(ArchiveHandle *AH, const char *tablespace)
+{
+ PQExpBuffer qry;
+ const char *want, *have;
+
+ have = AH->currTablespace;
+ want = tablespace;
+
+ /* no need to do anything for non-tablespace object */
+ if (!want)
+ return;
+
+ if (have && strcmp(want, have) == 0)
+ return; /* no need to do anything */
+
+ qry = createPQExpBuffer();
+
+ if (strcmp(want, "") == 0)
+ {
+ /* We want the tablespace to be the database's default */
+ appendPQExpBuffer(qry, "SET default_tablespace = ''");
+ }
+ else
+ {
+ /* We want an explicit tablespace */
+ appendPQExpBuffer(qry, "SET default_tablespace = %s", fmtId(want));
+ }
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, qry->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_die_horribly(AH, modulename,
+ "could not set default_tablespace to %s: %s",
+ fmtId(want), PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s;\n\n", qry->data);
+
+ if (AH->currTablespace)
+ free(AH->currTablespace);
+ AH->currTablespace = strdup(want);
+
+ destroyPQExpBuffer(qry);
+}
/**
* Parses the dropStmt part of a TOC entry and returns
strcmp(te->desc, "SCHEMA") == 0 && strcmp(te->tag, "public") == 0)
return;
- /* Select owner and schema as necessary */
+ /* Select owner, schema, and tablespace as necessary */
_becomeOwner(AH, te);
_selectOutputSchema(AH, te->namespace);
+ _selectTablespace(AH, te->tablespace);
/* Set up OID mode too */
if (strcmp(te->desc, "TABLE") == 0)
ahprintf(AH, "\n");
}
}
- ahprintf(AH, "-- %sName: %s; Type: %s; Schema: %s; Owner: %s\n",
+ ahprintf(AH, "-- %sName: %s; Type: %s; Schema: %s; Owner: %s",
pfx, te->tag, te->desc,
te->namespace ? te->namespace : "-",
te->owner);
+ if (te->tablespace)
+ ahprintf(AH, "; Tablespace: %s", te->tablespace);
+ ahprintf(AH, "\n");
+
if (AH->PrintExtraTocPtr != NULL)
(*AH->PrintExtraTocPtr) (AH, te);
ahprintf(AH, "--\n\n");
WriteInt(AH, crtm.tm_year);
WriteInt(AH, crtm.tm_isdst);
WriteStr(AH, PQdb(AH->connection));
+ WriteStr(AH, AH->public.remoteVersionStr);
+ WriteStr(AH, PG_VERSION);
}
void
write_msg(modulename, "WARNING: invalid creation date in header\n");
}
+ if (AH->version >= K_VERS_1_10)
+ {
+ AH->archiveRemoteVersion = ReadStr(AH);
+ AH->archiveDumpVersion = ReadStr(AH);
+ }
+
}
* by PostgreSQL
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.391 2004/11/05 19:16:19 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.392 2004/11/06 19:36:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
ArchiveEntry(fout, tdinfo->dobj.catId, tdinfo->dobj.dumpId,
tbinfo->dobj.name,
tbinfo->dobj.namespace->dobj.name,
+ NULL,
tbinfo->usename, false,
"TABLE DATA", "", "", copyStmt,
tdinfo->dobj.dependencies, tdinfo->dobj.nDeps,
dbDumpId, /* dump ID */
datname, /* Name */
NULL, /* Namespace */
+ NULL, /* Tablespace */
dba, /* Owner */
false, /* with oids */
"DATABASE", /* Desc */
appendPQExpBuffer(qry, "\n");
ArchiveEntry(AH, nilCatalogId, createDumpId(),
- "DUMP TIMESTAMP", NULL, "",
+ "DUMP TIMESTAMP", NULL, NULL, "",
false, "DUMP TIMESTAMP", qry->data, "", NULL,
NULL, 0,
NULL, NULL);
appendPQExpBuffer(qry, ";\n");
ArchiveEntry(AH, nilCatalogId, createDumpId(),
- "ENCODING", NULL, "",
+ "ENCODING", NULL, NULL, "",
false, "ENCODING", qry->data, "", NULL,
NULL, 0,
NULL, NULL);
appendPQExpBuffer(query, ";\n");
ArchiveEntry(fout, nilCatalogId, createDumpId(),
- target, namespace, owner, false,
+ target, namespace, NULL, owner, false,
"COMMENT", query->data, "", NULL,
&(dumpId), 1,
NULL, NULL);
ArchiveEntry(fout, nilCatalogId, createDumpId(),
target->data,
- tbinfo->dobj.namespace->dobj.name, tbinfo->usename,
+ tbinfo->dobj.namespace->dobj.name,
+ NULL,
+ tbinfo->usename,
false, "COMMENT", query->data, "", NULL,
&(tbinfo->dobj.dumpId), 1,
NULL, NULL);
ArchiveEntry(fout, nilCatalogId, createDumpId(),
target->data,
- tbinfo->dobj.namespace->dobj.name, tbinfo->usename,
+ tbinfo->dobj.namespace->dobj.name,
+ NULL,
+ tbinfo->usename,
false, "COMMENT", query->data, "", NULL,
&(tbinfo->dobj.dumpId), 1,
NULL, NULL);
break;
case DO_BLOBS:
ArchiveEntry(fout, dobj->catId, dobj->dumpId,
- dobj->name, NULL, "",
+ dobj->name, NULL, NULL, "",
false, "BLOBS", "", "", NULL,
NULL, 0,
dumpBlobs, NULL);
ArchiveEntry(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId,
nspinfo->dobj.name,
- NULL, strcmp(nspinfo->dobj.name, "public") == 0 ? nspinfo->usename : "",
+ NULL, NULL,
+ strcmp(nspinfo->dobj.name, "public") == 0 ? nspinfo->usename : "",
false, "SCHEMA", q->data, delq->data, NULL,
nspinfo->dobj.dependencies, nspinfo->dobj.nDeps,
NULL, NULL);
ArchiveEntry(fout, tinfo->dobj.catId, tinfo->dobj.dumpId,
tinfo->dobj.name,
tinfo->dobj.namespace->dobj.name,
+ NULL,
tinfo->usename, false,
"TYPE", q->data, delq->data, NULL,
tinfo->dobj.dependencies, tinfo->dobj.nDeps,
ArchiveEntry(fout, tinfo->dobj.catId, tinfo->dobj.dumpId,
tinfo->dobj.name,
tinfo->dobj.namespace->dobj.name,
+ NULL,
tinfo->usename, false,
"DOMAIN", q->data, delq->data, NULL,
tinfo->dobj.dependencies, tinfo->dobj.nDeps,
ArchiveEntry(fout, tinfo->dobj.catId, tinfo->dobj.dumpId,
tinfo->dobj.name,
tinfo->dobj.namespace->dobj.name,
+ NULL,
tinfo->usename, false,
"TYPE", q->data, delq->data, NULL,
tinfo->dobj.dependencies, tinfo->dobj.nDeps,
ArchiveEntry(fout, plang->dobj.catId, plang->dobj.dumpId,
plang->dobj.name,
- funcInfo->dobj.namespace->dobj.name, "",
+ funcInfo->dobj.namespace->dobj.name, NULL, "",
false, "PROCEDURAL LANGUAGE",
defqry->data, delqry->data, NULL,
plang->dobj.dependencies, plang->dobj.nDeps,
ArchiveEntry(fout, finfo->dobj.catId, finfo->dobj.dumpId,
funcsig_tag,
finfo->dobj.namespace->dobj.name,
+ NULL,
finfo->usename, false,
"FUNCTION", q->data, delqry->data, NULL,
finfo->dobj.dependencies, finfo->dobj.nDeps,
ArchiveEntry(fout, cast->dobj.catId, cast->dobj.dumpId,
castsig->data,
- "pg_catalog", "",
+ "pg_catalog", NULL, "",
false, "CAST", defqry->data, delqry->data, NULL,
cast->dobj.dependencies, cast->dobj.nDeps,
NULL, NULL);
ArchiveEntry(fout, oprinfo->dobj.catId, oprinfo->dobj.dumpId,
oprinfo->dobj.name,
- oprinfo->dobj.namespace->dobj.name, oprinfo->usename,
+ oprinfo->dobj.namespace->dobj.name,
+ NULL,
+ oprinfo->usename,
false, "OPERATOR", q->data, delq->data, NULL,
oprinfo->dobj.dependencies, oprinfo->dobj.nDeps,
NULL, NULL);
ArchiveEntry(fout, opcinfo->dobj.catId, opcinfo->dobj.dumpId,
opcinfo->dobj.name,
- opcinfo->dobj.namespace->dobj.name, opcinfo->usename,
+ opcinfo->dobj.namespace->dobj.name,
+ NULL,
+ opcinfo->usename,
false, "OPERATOR CLASS", q->data, delq->data, NULL,
opcinfo->dobj.dependencies, opcinfo->dobj.nDeps,
NULL, NULL);
ArchiveEntry(fout, convinfo->dobj.catId, convinfo->dobj.dumpId,
convinfo->dobj.name,
- convinfo->dobj.namespace->dobj.name, convinfo->usename,
+ convinfo->dobj.namespace->dobj.name,
+ NULL,
+ convinfo->usename,
false, "CONVERSION", q->data, delq->data, NULL,
convinfo->dobj.dependencies, convinfo->dobj.nDeps,
NULL, NULL);
ArchiveEntry(fout, agginfo->aggfn.dobj.catId, agginfo->aggfn.dobj.dumpId,
aggsig_tag,
- agginfo->aggfn.dobj.namespace->dobj.name, agginfo->aggfn.usename,
+ agginfo->aggfn.dobj.namespace->dobj.name,
+ NULL,
+ agginfo->aggfn.usename,
false, "AGGREGATE", q->data, delq->data, NULL,
- agginfo->aggfn.dobj.dependencies, agginfo->aggfn.dobj.nDeps,
+ agginfo->aggfn.dobj.dependencies, agginfo->aggfn.dobj.nDeps,
NULL, NULL);
/* Dump Aggregate Comments */
if (sql->len > 0)
ArchiveEntry(fout, nilCatalogId, createDumpId(),
tag, nspname,
+ NULL,
owner ? owner : "",
false, "ACL", sql->data, "", NULL,
&(objDumpId), 1,
appendPQExpBuffer(q, ")");
}
- /* Output tablespace clause if not database's default */
- if (strlen(tbinfo->reltablespace) != 0)
- appendPQExpBuffer(q, " TABLESPACE %s",
- fmtId(tbinfo->reltablespace));
-
appendPQExpBuffer(q, ";\n");
/* Loop dumping statistics and storage statements */
ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
tbinfo->dobj.name,
- tbinfo->dobj.namespace->dobj.name, tbinfo->usename,
- (strcmp(reltypename, "TABLE") == 0) ? tbinfo->hasoids : false,
+ tbinfo->dobj.namespace->dobj.name,
+ (tbinfo->relkind == RELKIND_VIEW) ? NULL : tbinfo->reltablespace,
+ tbinfo->usename,
+ (strcmp(reltypename, "TABLE") == 0) ? tbinfo->hasoids : false,
reltypename, q->data, delq->data, NULL,
tbinfo->dobj.dependencies, tbinfo->dobj.nDeps,
NULL, NULL);
ArchiveEntry(fout, adinfo->dobj.catId, adinfo->dobj.dumpId,
tbinfo->attnames[adnum - 1],
- tbinfo->dobj.namespace->dobj.name, tbinfo->usename,
+ tbinfo->dobj.namespace->dobj.name,
+ NULL,
+ tbinfo->usename,
false, "DEFAULT", q->data, delq->data, NULL,
adinfo->dobj.dependencies, adinfo->dobj.nDeps,
NULL, NULL);
ArchiveEntry(fout, indxinfo->dobj.catId, indxinfo->dobj.dumpId,
indxinfo->dobj.name,
tbinfo->dobj.namespace->dobj.name,
+ tbinfo->reltablespace,
tbinfo->usename, false,
"INDEX", q->data, delq->data, NULL,
indxinfo->dobj.dependencies, indxinfo->dobj.nDeps,
fmtId(attname));
}
- appendPQExpBuffer(q, ")");
-
- /* Output tablespace clause if not database's default */
- if (strlen(indxinfo->tablespace) != 0)
- appendPQExpBuffer(q, " USING INDEX TABLESPACE %s",
- fmtId(indxinfo->tablespace));
-
- appendPQExpBuffer(q, ";\n");
+ appendPQExpBuffer(q, ");\n");
/* If the index is clustered, we need to record that. */
if (indxinfo->indisclustered)
ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
coninfo->dobj.name,
tbinfo->dobj.namespace->dobj.name,
+ indxinfo->tablespace,
tbinfo->usename, false,
"CONSTRAINT", q->data, delq->data, NULL,
coninfo->dobj.dependencies, coninfo->dobj.nDeps,
ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
coninfo->dobj.name,
tbinfo->dobj.namespace->dobj.name,
+ NULL,
tbinfo->usename, false,
"FK CONSTRAINT", q->data, delq->data, NULL,
coninfo->dobj.dependencies, coninfo->dobj.nDeps,
ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
coninfo->dobj.name,
tbinfo->dobj.namespace->dobj.name,
+ NULL,
tbinfo->usename, false,
"CHECK CONSTRAINT", q->data, delq->data, NULL,
coninfo->dobj.dependencies, coninfo->dobj.nDeps,
ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
coninfo->dobj.name,
tinfo->dobj.namespace->dobj.name,
+ NULL,
tinfo->usename, false,
"CHECK CONSTRAINT", q->data, delq->data, NULL,
coninfo->dobj.dependencies, coninfo->dobj.nDeps,
max_oid);
ArchiveEntry(fout, nilCatalogId, createDumpId(),
- "Max OID", NULL, "",
+ "Max OID", NULL, NULL, "",
false, "<Init>", sql, "", NULL,
NULL, 0,
NULL, NULL);
ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
tbinfo->dobj.name,
- tbinfo->dobj.namespace->dobj.name, tbinfo->usename,
+ tbinfo->dobj.namespace->dobj.name,
+ NULL,
+ tbinfo->usename,
false, "SEQUENCE", query->data, delqry->data, NULL,
tbinfo->dobj.dependencies, tbinfo->dobj.nDeps,
NULL, NULL);
ArchiveEntry(fout, nilCatalogId, createDumpId(),
tbinfo->dobj.name,
- tbinfo->dobj.namespace->dobj.name, tbinfo->usename,
+ tbinfo->dobj.namespace->dobj.name,
+ NULL,
+ tbinfo->usename,
false, "SEQUENCE SET", query->data, "", NULL,
&(tbinfo->dobj.dumpId), 1,
NULL, NULL);
ArchiveEntry(fout, tginfo->dobj.catId, tginfo->dobj.dumpId,
tginfo->dobj.name,
tbinfo->dobj.namespace->dobj.name,
+ NULL,
tbinfo->usename, false,
"TRIGGER", query->data, delqry->data, NULL,
tginfo->dobj.dependencies, tginfo->dobj.nDeps,
ArchiveEntry(fout, rinfo->dobj.catId, rinfo->dobj.dumpId,
rinfo->dobj.name,
tbinfo->dobj.namespace->dobj.name,
+ NULL,
tbinfo->usename, false,
"RULE", cmd->data, delcmd->data, NULL,
rinfo->dobj.dependencies, rinfo->dobj.nDeps,