static int _tocSortCompareByIDNum(const void *p1, const void *p2);
static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt,
const int compression, ArchiveMode mode);
-static int _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
+static int _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData);
static void _reconnectAsOwner(ArchiveHandle *AH, const char *dbname, TocEntry *te);
static void _reconnectAsUser(ArchiveHandle *AH, const char *dbname, char *user);
_reconnectAsOwner(AH, "-", te);
ahlog(AH, 1, "Creating %s %s\n", te->desc, te->name);
- _printTocEntry(AH, te, ropt);
+ _printTocEntry(AH, te, ropt, false);
/* If we created a DB, connect to it... */
if (strcmp(te->desc, "DATABASE") == 0)
die_horribly(AH, "%s: Unable to restore data from a compressed archive\n", progname);
#endif
- ahprintf(AH, "--\n-- Data for TOC Entry ID %d (OID %s) %s %s\n--\n\n",
- te->id, te->oid, te->desc, te->name);
+ _printTocEntry(AH, te, ropt, true);
/*
* Maybe we can't do BLOBS, so check if this node is for BLOBS
}
static int
-_printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
+_printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData)
{
- ahprintf(AH, "--\n-- TOC Entry ID %d (OID %s)\n--\n-- Name: %s Type: %s Owner: %s\n",
- te->id, te->oid, te->name, te->desc, te->owner);
+ char *pfx;
+
+ if (isData)
+ {
+ pfx = "Data for ";
+ } else {
+ pfx = "";
+ }
+
+ ahprintf(AH, "--\n-- %sTOC Entry ID %d (OID %s)\n--\n-- Name: %s Type: %s Owner: %s\n",
+ pfx, te->id, te->oid, te->name, te->desc, te->owner);
if (AH->PrintExtraTocPtr !=NULL)
(*AH->PrintExtraTocPtr) (AH, te);
ahprintf(AH, "--\n\n");
PGresult *res2;
resetPQExpBuffer(query);
- appendPQExpBuffer(query, "SELECT pg_get_viewdef(");
+ appendPQExpBuffer(query, "SELECT definition as viewdef, ");
+ /* XXX 7.2 - replace with att from pg_views or some other generic source */
+ appendPQExpBuffer(query, "(select oid from pg_rewrite where rulename='_RET'"
+ " || viewname) as view_oid from pg_views"
+ " where viewname = ");
formatStringLiteral(query, tblinfo[i].relname, CONV_ALL);
- appendPQExpBuffer(query, ") as viewdef");
+ appendPQExpBuffer(query, ";");
+
res2 = PQexec(g_conn, query->data);
if (!res2 || PQresultStatus(res2) != PGRES_TUPLES_OK)
{
{
if (PQntuples(res2) < 1)
{
- fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned no definitions",
+ fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned no definitions\n",
tblinfo[i].relname);
}
else
{
- fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned more than 1 definition",
+ fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned more than 1 definition\n",
tblinfo[i].relname);
}
exit_nicely(g_conn);
}
+ if (PQgetisnull(res2, 0, 1))
+ {
+ fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned NULL oid\n", tblinfo[i].relname);
+ fprintf(stderr, "SELECT was: %s\n", query->data);
+ exit_nicely(g_conn);
+ }
+
tblinfo[i].viewdef = strdup(PQgetvalue(res2, 0, 0));
+ tblinfo[i].viewoid = strdup(PQgetvalue(res2, 0, 1));
if (strlen(tblinfo[i].viewdef) == 0)
{
int numParents;
int actual_atts; /* number of attrs in this CREATE statment */
char *reltypename;
+ char *objoid;
/* First - dump SEQUENCEs */
if (tablename && strlen(tablename) > 0)
if (tblinfo[i].viewdef != NULL)
{
reltypename = "VIEW";
-
+ objoid = tblinfo[i].viewoid;
appendPQExpBuffer(delq, "DROP VIEW %s;\n", fmtId(tblinfo[i].relname, force_quotes));
- appendPQExpBuffer(q, "CREATE VIEW %s as %s", fmtId(tblinfo[i].relname, force_quotes), tblinfo[i].viewdef);
+ appendPQExpBuffer(q, "CREATE VIEW %s as %s\n", fmtId(tblinfo[i].relname, force_quotes), tblinfo[i].viewdef);
}
else
{
reltypename = "TABLE";
-
+ objoid = tblinfo[i].oid;
parentRels = tblinfo[i].parentRels;
numParents = tblinfo[i].numParents;
if (!dataOnly)
{
- ArchiveEntry(fout, tblinfo[i].oid, tblinfo[i].relname,
+ ArchiveEntry(fout, objoid, tblinfo[i].relname,
reltypename, NULL, q->data, delq->data, "", tblinfo[i].usename,
NULL, NULL);
if (res == NULL ||
PQresultStatus(res) != PGRES_TUPLES_OK)
{
- fprintf(stderr, "pg_dump: error in finding the last system OID");
+ fprintf(stderr, "pg_dump: error in finding the last system OID. ");
fprintf(stderr, "Explanation from backend: '%s'.\n", PQerrorMessage(g_conn));
exit_nicely(g_conn);
}