From 287ba74f5ad0b4150339ce06111f83b50e6e83ec Mon Sep 17 00:00:00 2001
From: erthalion <9erthalion6@gmail.com>
Date: Wed, 23 Jan 2019 14:58:33 +0100
Subject: [PATCH] ArchiveOpts structure

ArchiveEntry function has some number of arguments, that can be
considered as optional. Refactor out arguments for ArchiveEntry into
ArchiveOpts structure, to make it more flexible for changes.
---
 src/bin/pg_dump/pg_backup_archiver.c |   57 +-
 src/bin/pg_dump/pg_backup_archiver.h |   31 +-
 src/bin/pg_dump/pg_dump.c            | 1085 ++++++++++++++++++----------------
 3 files changed, 632 insertions(+), 541 deletions(-)

diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 2c2f6fb4a9..ab6b042c58 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -1066,17 +1066,8 @@ WriteData(Archive *AHX, const void *data, size_t dLen)
 
 /* Public */
 TocEntry *
-ArchiveEntry(Archive *AHX,
-			 CatalogId catalogId, DumpId dumpId,
-			 const char *tag,
-			 const char *namespace,
-			 const char *tablespace,
-			 const char *owner,
-			 const char *desc, teSection section,
-			 const char *defn,
-			 const char *dropStmt, const char *copyStmt,
-			 const DumpId *deps, int nDeps,
-			 DataDumperPtr dumpFn, void *dumpArg)
+ArchiveEntry(Archive *AHX, CatalogId catalogId,
+			 DumpId dumpId, ArchiveOpts *opts)
 {
 	ArchiveHandle *AH = (ArchiveHandle *) AHX;
 	TocEntry   *newToc;
@@ -1094,22 +1085,22 @@ ArchiveEntry(Archive *AHX,
 
 	newToc->catalogId = catalogId;
 	newToc->dumpId = dumpId;
-	newToc->section = section;
-
-	newToc->tag = pg_strdup(tag);
-	newToc->namespace = namespace ? pg_strdup(namespace) : NULL;
-	newToc->tablespace = tablespace ? pg_strdup(tablespace) : NULL;
-	newToc->owner = pg_strdup(owner);
-	newToc->desc = pg_strdup(desc);
-	newToc->defn = pg_strdup(defn);
-	newToc->dropStmt = pg_strdup(dropStmt);
-	newToc->copyStmt = copyStmt ? pg_strdup(copyStmt) : NULL;
-
-	if (nDeps > 0)
+	newToc->section = opts->section;
+
+	newToc->tag = pg_strdup(opts->tag);
+	newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL;
+	newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL;
+	newToc->owner = opts->owner ? pg_strdup(opts->owner) : NULL;
+	newToc->desc = pg_strdup(opts->description);
+	newToc->defn = opts->createStmt ? pg_strdup(opts->createStmt) : NULL;
+	newToc->dropStmt = opts->dropStmt ? pg_strdup(opts->dropStmt) : NULL;
+	newToc->copyStmt = opts->copyStmt ? pg_strdup(opts->copyStmt) : NULL;
+
+	if (opts->nDeps > 0)
 	{
-		newToc->dependencies = (DumpId *) pg_malloc(nDeps * sizeof(DumpId));
-		memcpy(newToc->dependencies, deps, nDeps * sizeof(DumpId));
-		newToc->nDeps = nDeps;
+		newToc->dependencies = (DumpId *) pg_malloc(opts->nDeps * sizeof(DumpId));
+		memcpy(newToc->dependencies, opts->deps, opts->nDeps * sizeof(DumpId));
+		newToc->nDeps = opts->nDeps;
 	}
 	else
 	{
@@ -1117,9 +1108,9 @@ ArchiveEntry(Archive *AHX,
 		newToc->nDeps = 0;
 	}
 
-	newToc->dataDumper = dumpFn;
-	newToc->dataDumperArg = dumpArg;
-	newToc->hadDumper = dumpFn ? true : false;
+	newToc->dataDumper = opts->dumpFn;
+	newToc->dataDumperArg = opts->dumpArg;
+	newToc->hadDumper = opts->dumpFn ? true : false;
 
 	newToc->formatData = NULL;
 	newToc->dataLength = 0;
@@ -3629,7 +3620,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData)
 	}
 	else
 	{
-		if (strlen(te->defn) > 0)
+		if (te->defn && strlen(te->defn) > 0)
 			ahprintf(AH, "%s\n\n", te->defn);
 	}
 
@@ -3640,7 +3631,8 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData)
 	 * with DROP commands must appear in one list or the other.
 	 */
 	if (!ropt->noOwner && !ropt->use_setsessauth &&
-		strlen(te->owner) > 0 && strlen(te->dropStmt) > 0)
+		te->owner && strlen(te->owner) > 0 &&
+		te->dropStmt && strlen(te->dropStmt) > 0)
 	{
 		if (strcmp(te->desc, "AGGREGATE") == 0 ||
 			strcmp(te->desc, "BLOB") == 0 ||
@@ -3723,6 +3715,9 @@ replace_line_endings(const char *str)
 	char	   *result;
 	char	   *s;
 
+	if (!str)
+		str = "";
+
 	result = pg_strdup(str);
 
 	for (s = result; *s != '\0'; s++)
diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h
index 306d2ceba9..adee1be7e4 100644
--- a/src/bin/pg_dump/pg_backup_archiver.h
+++ b/src/bin/pg_dump/pg_backup_archiver.h
@@ -405,17 +405,28 @@ extern void on_exit_close_archive(Archive *AHX);
 
 extern void warn_or_exit_horribly(ArchiveHandle *AH, const char *modulename, const char *fmt,...) pg_attribute_printf(3, 4);
 
+typedef struct
+{
+	const char 		*tag;
+	const char 		*namespace;
+	const char 		*tablespace;
+	const char 		*owner;
+	const char 		*description;
+	teSection 		section;
+	const char 		*createStmt;
+	const char 		*dropStmt;
+	const char 		*copyStmt;
+	const DumpId 	*deps;
+	int 			nDeps;
+	DataDumperPtr 	dumpFn;
+	void 			*dumpArg;
+} ArchiveOpts;
+
+#define ARCHIVE_OPTS(...) &(ArchiveOpts){__VA_ARGS__}
+
 /* Called to add a TOC entry */
-extern TocEntry *ArchiveEntry(Archive *AHX,
-			 CatalogId catalogId, DumpId dumpId,
-			 const char *tag,
-			 const char *namespace, const char *tablespace,
-			 const char *owner,
-			 const char *desc, teSection section,
-			 const char *defn,
-			 const char *dropStmt, const char *copyStmt,
-			 const DumpId *deps, int nDeps,
-			 DataDumperPtr dumpFn, void *dumpArg);
+extern TocEntry *ArchiveEntry(Archive *AHX, CatalogId catalogId,
+							  DumpId dumpId, ArchiveOpts *opts);
 
 extern void WriteTOC(ArchiveHandle *AH);
 extern void ReadTOC(ArchiveHandle *AH);
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 2b1a94733b..20ce7fc57b 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -2135,12 +2135,18 @@ dumpTableData(Archive *fout, TableDataInfo *tdinfo)
 		TocEntry   *te;
 
 		te = ArchiveEntry(fout, tdinfo->dobj.catId, tdinfo->dobj.dumpId,
-						  tbinfo->dobj.name, tbinfo->dobj.namespace->dobj.name,
-						  NULL, tbinfo->rolname,
-						  "TABLE DATA", SECTION_DATA,
-						  "", "", copyStmt,
-						  &(tbinfo->dobj.dumpId), 1,
-						  dumpFn, tdinfo);
+						  ARCHIVE_OPTS(
+							.tag = tbinfo->dobj.name,
+							.namespace = tbinfo->dobj.namespace->dobj.name,
+							.owner = tbinfo->rolname,
+							.description = "TABLE DATA",
+							.section = SECTION_DATA,
+							.copyStmt = copyStmt,
+							.deps = &(tbinfo->dobj.dumpId),
+							.nDeps = 1,
+							.dumpFn = dumpFn,
+							.dumpArg = tdinfo,
+						  ));
 
 		/*
 		 * Set the TocEntry's dataLength in case we are doing a parallel dump
@@ -2184,19 +2190,16 @@ refreshMatViewData(Archive *fout, TableDataInfo *tdinfo)
 		ArchiveEntry(fout,
 					 tdinfo->dobj.catId,	/* catalog ID */
 					 tdinfo->dobj.dumpId,	/* dump ID */
-					 tbinfo->dobj.name, /* Name */
-					 tbinfo->dobj.namespace->dobj.name, /* Namespace */
-					 NULL,		/* Tablespace */
-					 tbinfo->rolname,	/* Owner */
-					 "MATERIALIZED VIEW DATA",	/* Desc */
-					 SECTION_POST_DATA, /* Section */
-					 q->data,	/* Create */
-					 "",		/* Del */
-					 NULL,		/* Copy */
-					 tdinfo->dobj.dependencies, /* Deps */
-					 tdinfo->dobj.nDeps,	/* # Deps */
-					 NULL,		/* Dumper */
-					 NULL);		/* Dumper Arg */
+					 ARCHIVE_OPTS(
+						.tag = tbinfo->dobj.name,
+						.namespace = tbinfo->dobj.namespace->dobj.name,
+						.owner = tbinfo->rolname,
+						.description = "MATERIALIZED VIEW DATA",
+						.section = SECTION_POST_DATA,
+						.createStmt = q->data,
+						.deps = tdinfo->dobj.dependencies,
+						.nDeps = tdinfo->dobj.nDeps,
+					 ));
 
 	destroyPQExpBuffer(q);
 }
@@ -2722,19 +2725,14 @@ dumpDatabase(Archive *fout)
 	ArchiveEntry(fout,
 				 dbCatId,		/* catalog ID */
 				 dbDumpId,		/* dump ID */
-				 datname,		/* Name */
-				 NULL,			/* Namespace */
-				 NULL,			/* Tablespace */
-				 dba,			/* Owner */
-				 "DATABASE",	/* Desc */
-				 SECTION_PRE_DATA,	/* Section */
-				 creaQry->data, /* Create */
-				 delQry->data,	/* Del */
-				 NULL,			/* Copy */
-				 NULL,			/* Deps */
-				 0,				/* # Deps */
-				 NULL,			/* Dumper */
-				 NULL);			/* Dumper Arg */
+				 ARCHIVE_OPTS(
+					.tag = datname,
+					.owner = dba,
+					.description = "DATABASE",
+					.section = SECTION_PRE_DATA,
+					.createStmt = creaQry->data,
+					.dropStmt = delQry->data,
+				 ));
 
 	/* Compute correct tag for archive entry */
 	appendPQExpBuffer(labelq, "DATABASE %s", qdatname);
@@ -2762,11 +2760,15 @@ dumpDatabase(Archive *fout)
 			appendPQExpBufferStr(dbQry, ";\n");
 
 			ArchiveEntry(fout, nilCatalogId, createDumpId(),
-						 labelq->data, NULL, NULL, dba,
-						 "COMMENT", SECTION_NONE,
-						 dbQry->data, "", NULL,
-						 &(dbDumpId), 1,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = labelq->data,
+							.owner = dba,
+							.description = "COMMENT",
+							.section = SECTION_NONE,
+							.createStmt = dbQry->data,
+							.deps = &(dbDumpId),
+							.nDeps = 1,
+						 ));
 		}
 	}
 	else
@@ -2789,11 +2791,15 @@ dumpDatabase(Archive *fout)
 		emitShSecLabels(conn, shres, seclabelQry, "DATABASE", datname);
 		if (seclabelQry->len > 0)
 			ArchiveEntry(fout, nilCatalogId, createDumpId(),
-						 labelq->data, NULL, NULL, dba,
-						 "SECURITY LABEL", SECTION_NONE,
-						 seclabelQry->data, "", NULL,
-						 &(dbDumpId), 1,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = labelq->data,
+							.owner = dba,
+							.description = "SECURITY LABEL",
+							.section = SECTION_NONE,
+							.createStmt = seclabelQry->data,
+							.deps = &(dbDumpId),
+							.nDeps = 1,
+						 ));
 		destroyPQExpBuffer(seclabelQry);
 		PQclear(shres);
 	}
@@ -2859,11 +2865,15 @@ dumpDatabase(Archive *fout)
 
 	if (creaQry->len > 0)
 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
-					 datname, NULL, NULL, dba,
-					 "DATABASE PROPERTIES", SECTION_PRE_DATA,
-					 creaQry->data, delQry->data, NULL,
-					 &(dbDumpId), 1,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = datname,
+						.owner = dba,
+						.description = "DATABASE PROPERTIES",
+						.section = SECTION_PRE_DATA,
+						.createStmt = creaQry->data,
+						.dropStmt = delQry->data,
+						.deps = &(dbDumpId),
+					 ));
 
 	/*
 	 * pg_largeobject comes from the old system intact, so set its
@@ -2904,11 +2914,12 @@ dumpDatabase(Archive *fout)
 						  atooid(PQgetvalue(lo_res, 0, i_relminmxid)),
 						  LargeObjectRelationId);
 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
-					 "pg_largeobject", NULL, NULL, "",
-					 "pg_largeobject", SECTION_PRE_DATA,
-					 loOutQry->data, "", NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = "pg_largeobject",
+						.description = "pg_largeobject",
+						.section = SECTION_PRE_DATA,
+						.createStmt = loOutQry->data,
+					 ));
 
 		PQclear(lo_res);
 
@@ -3014,11 +3025,12 @@ dumpEncoding(Archive *AH)
 	appendPQExpBufferStr(qry, ";\n");
 
 	ArchiveEntry(AH, nilCatalogId, createDumpId(),
-				 "ENCODING", NULL, NULL, "",
-				 "ENCODING", SECTION_PRE_DATA,
-				 qry->data, "", NULL,
-				 NULL, 0,
-				 NULL, NULL);
+				 ARCHIVE_OPTS(
+					.tag = "ENCODING",
+					.description = "ENCODING",
+					.section = SECTION_PRE_DATA,
+					.createStmt = qry->data,
+				 ));
 
 	destroyPQExpBuffer(qry);
 }
@@ -3041,11 +3053,12 @@ dumpStdStrings(Archive *AH)
 					  stdstrings);
 
 	ArchiveEntry(AH, nilCatalogId, createDumpId(),
-				 "STDSTRINGS", NULL, NULL, "",
-				 "STDSTRINGS", SECTION_PRE_DATA,
-				 qry->data, "", NULL,
-				 NULL, 0,
-				 NULL, NULL);
+				 ARCHIVE_OPTS(
+					.tag = "STDSTRINGS",
+					.description = "STDSTRINGS",
+					.section = SECTION_PRE_DATA,
+					.createStmt = qry->data,
+				 ));
 
 	destroyPQExpBuffer(qry);
 }
@@ -3097,11 +3110,12 @@ dumpSearchPath(Archive *AH)
 		write_msg(NULL, "saving search_path = %s\n", path->data);
 
 	ArchiveEntry(AH, nilCatalogId, createDumpId(),
-				 "SEARCHPATH", NULL, NULL, "",
-				 "SEARCHPATH", SECTION_PRE_DATA,
-				 qry->data, "", NULL,
-				 NULL, 0,
-				 NULL, NULL);
+				 ARCHIVE_OPTS(
+					.tag = "SEARCHPATH",
+					.description = "SEARCHPATH",
+					.section = SECTION_PRE_DATA,
+					.createStmt = qry->data,
+				 ));
 
 	/* Also save it in AH->searchpath, in case we're doing plain text dump */
 	AH->searchpath = pg_strdup(qry->data);
@@ -3273,13 +3287,14 @@ dumpBlob(Archive *fout, BlobInfo *binfo)
 
 	if (binfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, binfo->dobj.catId, binfo->dobj.dumpId,
-					 binfo->dobj.name,
-					 NULL, NULL,
-					 binfo->rolname,
-					 "BLOB", SECTION_PRE_DATA,
-					 cquery->data, dquery->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = binfo->dobj.name,
+						.owner = binfo->rolname,
+						.description = "BLOB",
+						.section = SECTION_PRE_DATA,
+						.createStmt = cquery->data,
+						.dropStmt = dquery->data,
+					 ));
 
 	/* Dump comment if any */
 	if (binfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -3577,14 +3592,16 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
 		 */
 		if (polinfo->dobj.dump & DUMP_COMPONENT_POLICY)
 			ArchiveEntry(fout, polinfo->dobj.catId, polinfo->dobj.dumpId,
-						 polinfo->dobj.name,
-						 polinfo->dobj.namespace->dobj.name,
-						 NULL,
-						 tbinfo->rolname,
-						 "ROW SECURITY", SECTION_POST_DATA,
-						 query->data, "", NULL,
-						 &(tbinfo->dobj.dumpId), 1,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = polinfo->dobj.name,
+							.namespace = polinfo->dobj.namespace->dobj.name,
+							.owner = tbinfo->rolname,
+							.description = "ROW SECURITY",
+							.section = SECTION_POST_DATA,
+							.createStmt = query->data,
+							.deps = &(tbinfo->dobj.dumpId),
+							.nDeps = 1,
+						 ));
 
 		destroyPQExpBuffer(query);
 		return;
@@ -3633,14 +3650,15 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
 
 	if (polinfo->dobj.dump & DUMP_COMPONENT_POLICY)
 		ArchiveEntry(fout, polinfo->dobj.catId, polinfo->dobj.dumpId,
-					 tag,
-					 polinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tbinfo->rolname,
-					 "POLICY", SECTION_POST_DATA,
-					 query->data, delqry->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag,
+						.namespace = polinfo->dobj.namespace->dobj.name,
+						.owner = tbinfo->rolname,
+						.description = "POLICY",
+						.section = SECTION_POST_DATA,
+						.createStmt = query->data,
+						.dropStmt = delqry->data,
+					 ));
 
 	free(tag);
 	destroyPQExpBuffer(query);
@@ -3807,14 +3825,14 @@ dumpPublication(Archive *fout, PublicationInfo *pubinfo)
 	appendPQExpBufferStr(query, "');\n");
 
 	ArchiveEntry(fout, pubinfo->dobj.catId, pubinfo->dobj.dumpId,
-				 pubinfo->dobj.name,
-				 NULL,
-				 NULL,
-				 pubinfo->rolname,
-				 "PUBLICATION", SECTION_POST_DATA,
-				 query->data, delq->data, NULL,
-				 NULL, 0,
-				 NULL, NULL);
+				 ARCHIVE_OPTS(
+					.tag = pubinfo->dobj.name,
+					.owner = pubinfo->rolname,
+					.description = "PUBLICATION",
+					.section = SECTION_POST_DATA,
+					.createStmt = query->data,
+					.dropStmt = delq->data,
+				 ));
 
 	if (pubinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
 		dumpComment(fout, "PUBLICATION", qpubname,
@@ -3950,14 +3968,13 @@ dumpPublicationTable(Archive *fout, PublicationRelInfo *pubrinfo)
 	 * done by table drop.
 	 */
 	ArchiveEntry(fout, pubrinfo->dobj.catId, pubrinfo->dobj.dumpId,
-				 tag,
-				 tbinfo->dobj.namespace->dobj.name,
-				 NULL,
-				 "",
-				 "PUBLICATION TABLE", SECTION_POST_DATA,
-				 query->data, "", NULL,
-				 NULL, 0,
-				 NULL, NULL);
+				 ARCHIVE_OPTS(
+					.tag = tag,
+					.namespace = tbinfo->dobj.namespace->dobj.name,
+					.description = "PUBLICATION TABLE",
+					.section = SECTION_POST_DATA,
+					.createStmt = query->data,
+				 ));
 
 	free(tag);
 	destroyPQExpBuffer(query);
@@ -4143,14 +4160,14 @@ dumpSubscription(Archive *fout, SubscriptionInfo *subinfo)
 	appendPQExpBufferStr(query, ");\n");
 
 	ArchiveEntry(fout, subinfo->dobj.catId, subinfo->dobj.dumpId,
-				 subinfo->dobj.name,
-				 NULL,
-				 NULL,
-				 subinfo->rolname,
-				 "SUBSCRIPTION", SECTION_POST_DATA,
-				 query->data, delq->data, NULL,
-				 NULL, 0,
-				 NULL, NULL);
+				 ARCHIVE_OPTS(
+					.tag = subinfo->dobj.name,
+					.owner = subinfo->rolname,
+					.description = "SUBSCRIPTION",
+					.section = SECTION_POST_DATA,
+					.createStmt = query->data,
+					.dropStmt = delq->data,
+				 ));
 
 	if (subinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
 		dumpComment(fout, "SUBSCRIPTION", qsubname,
@@ -9377,11 +9394,16 @@ dumpComment(Archive *fout, const char *type, const char *name,
 		 * post-data.
 		 */
 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
-					 tag->data, namespace, NULL, owner,
-					 "COMMENT", SECTION_NONE,
-					 query->data, "", NULL,
-					 &(dumpId), 1,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag->data,
+						.namespace = namespace,
+						.owner = owner,
+						.description = "COMMENT",
+						.section = SECTION_NONE,
+						.createStmt = query->data,
+						.deps = &(dumpId),
+						.nDeps = 1,
+					 ));
 
 		destroyPQExpBuffer(query);
 		destroyPQExpBuffer(tag);
@@ -9443,13 +9465,16 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo,
 			appendPQExpBufferStr(query, ";\n");
 
 			ArchiveEntry(fout, nilCatalogId, createDumpId(),
-						 tag->data,
-						 tbinfo->dobj.namespace->dobj.name,
-						 NULL, tbinfo->rolname,
-						 "COMMENT", SECTION_NONE,
-						 query->data, "", NULL,
-						 &(tbinfo->dobj.dumpId), 1,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = tag->data,
+							.namespace = tbinfo->dobj.namespace->dobj.name,
+							.owner = tbinfo->rolname,
+							.description = "COMMENT",
+							.section = SECTION_NONE,
+							.createStmt = query->data,
+							.deps = &(tbinfo->dobj.dumpId),
+							.nDeps = 1,
+						 ));
 		}
 		else if (objsubid > 0 && objsubid <= tbinfo->numatts)
 		{
@@ -9467,13 +9492,16 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo,
 			appendPQExpBufferStr(query, ";\n");
 
 			ArchiveEntry(fout, nilCatalogId, createDumpId(),
-						 tag->data,
-						 tbinfo->dobj.namespace->dobj.name,
-						 NULL, tbinfo->rolname,
-						 "COMMENT", SECTION_NONE,
-						 query->data, "", NULL,
-						 &(tbinfo->dobj.dumpId), 1,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = tag->data,
+							.namespace = tbinfo->dobj.namespace->dobj.name,
+							.owner = tbinfo->rolname,
+							.description = "COMMENT",
+							.section = SECTION_NONE,
+							.createStmt = query->data,
+							.deps = &(tbinfo->dobj.dumpId),
+							.nDeps = 1,
+						 ));
 		}
 
 		comments++;
@@ -9750,11 +9778,12 @@ dumpDumpableObject(Archive *fout, DumpableObject *dobj)
 				TocEntry   *te;
 
 				te = ArchiveEntry(fout, dobj->catId, dobj->dumpId,
-								  dobj->name, NULL, NULL, "",
-								  "BLOBS", SECTION_DATA,
-								  "", "", NULL,
-								  NULL, 0,
-								  dumpBlobs, NULL);
+								  ARCHIVE_OPTS(
+									.tag = dobj->name,
+									.description = "BLOBS",
+									.section = SECTION_DATA,
+									.dumpFn = dumpBlobs,
+								  ));
 
 				/*
 				 * Set the TocEntry's dataLength in case we are doing a
@@ -9822,13 +9851,14 @@ dumpNamespace(Archive *fout, NamespaceInfo *nspinfo)
 
 	if (nspinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId,
-					 nspinfo->dobj.name,
-					 NULL, NULL,
-					 nspinfo->rolname,
-					 "SCHEMA", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = nspinfo->dobj.name,
+						.owner = nspinfo->rolname,
+						.description = "SCHEMA",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Schema Comments and Security Labels */
 	if (nspinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -9958,13 +9988,13 @@ dumpExtension(Archive *fout, ExtensionInfo *extinfo)
 
 	if (extinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, extinfo->dobj.catId, extinfo->dobj.dumpId,
-					 extinfo->dobj.name,
-					 NULL, NULL,
-					 "",
-					 "EXTENSION", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = extinfo->dobj.name,
+						.description = "EXTENSION",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Extension Comments and Security Labels */
 	if (extinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -10108,14 +10138,15 @@ dumpEnumType(Archive *fout, TypeInfo *tyinfo)
 
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
-					 tyinfo->dobj.name,
-					 tyinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tyinfo->rolname,
-					 "TYPE", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tyinfo->dobj.name,
+						.namespace = tyinfo->dobj.namespace->dobj.name,
+						.owner = tyinfo->rolname,
+						.description = "TYPE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Type Comments and Security Labels */
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -10235,14 +10266,15 @@ dumpRangeType(Archive *fout, TypeInfo *tyinfo)
 
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
-					 tyinfo->dobj.name,
-					 tyinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tyinfo->rolname,
-					 "TYPE", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tyinfo->dobj.name,
+						.namespace = tyinfo->dobj.namespace->dobj.name,
+						.owner = tyinfo->rolname,
+						.description = "TYPE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Type Comments and Security Labels */
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -10308,14 +10340,15 @@ dumpUndefinedType(Archive *fout, TypeInfo *tyinfo)
 
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
-					 tyinfo->dobj.name,
-					 tyinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tyinfo->rolname,
-					 "TYPE", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tyinfo->dobj.name,
+						.namespace = tyinfo->dobj.namespace->dobj.name,
+						.owner = tyinfo->rolname,
+						.description = "TYPE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Type Comments and Security Labels */
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -10590,14 +10623,15 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
 
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
-					 tyinfo->dobj.name,
-					 tyinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tyinfo->rolname,
-					 "TYPE", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tyinfo->dobj.name,
+						.namespace = tyinfo->dobj.namespace->dobj.name,
+						.owner = tyinfo->rolname,
+						.description = "TYPE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Type Comments and Security Labels */
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -10747,14 +10781,15 @@ dumpDomain(Archive *fout, TypeInfo *tyinfo)
 
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
-					 tyinfo->dobj.name,
-					 tyinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tyinfo->rolname,
-					 "DOMAIN", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tyinfo->dobj.name,
+						.namespace = tyinfo->dobj.namespace->dobj.name,
+						.owner = tyinfo->rolname,
+						.description = "DOMAIN",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Domain Comments and Security Labels */
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -10969,14 +11004,15 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
 
 	if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
-					 tyinfo->dobj.name,
-					 tyinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tyinfo->rolname,
-					 "TYPE", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tyinfo->dobj.name,
+						.namespace = tyinfo->dobj.namespace->dobj.name,
+						.owner = tyinfo->rolname,
+						.description = "TYPE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 
 	/* Dump Type Comments and Security Labels */
@@ -11105,13 +11141,16 @@ dumpCompositeTypeColComments(Archive *fout, TypeInfo *tyinfo)
 			appendPQExpBufferStr(query, ";\n");
 
 			ArchiveEntry(fout, nilCatalogId, createDumpId(),
-						 target->data,
-						 tyinfo->dobj.namespace->dobj.name,
-						 NULL, tyinfo->rolname,
-						 "COMMENT", SECTION_NONE,
-						 query->data, "", NULL,
-						 &(tyinfo->dobj.dumpId), 1,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = target->data,
+							.namespace = tyinfo->dobj.namespace->dobj.name,
+							.owner = tyinfo->rolname,
+							.description = "COMMENT",
+							.section = SECTION_NONE,
+							.createStmt = query->data,
+							.deps = &(tyinfo->dobj.dumpId),
+							.nDeps = 1,
+						 ));
 		}
 
 		comments++;
@@ -11160,14 +11199,14 @@ dumpShellType(Archive *fout, ShellTypeInfo *stinfo)
 
 	if (stinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, stinfo->dobj.catId, stinfo->dobj.dumpId,
-					 stinfo->dobj.name,
-					 stinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 stinfo->baseType->rolname,
-					 "SHELL TYPE", SECTION_PRE_DATA,
-					 q->data, "", NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = stinfo->dobj.name,
+						.namespace = stinfo->dobj.namespace->dobj.name,
+						.owner = stinfo->baseType->rolname,
+						.description = "SHELL TYPE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+					 ));
 
 	destroyPQExpBuffer(q);
 }
@@ -11272,12 +11311,14 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
 
 	if (plang->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, plang->dobj.catId, plang->dobj.dumpId,
-					 plang->dobj.name,
-					 NULL, NULL, plang->lanowner,
-					 "PROCEDURAL LANGUAGE", SECTION_PRE_DATA,
-					 defqry->data, delqry->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = plang->dobj.name,
+						.owner = plang->lanowner,
+						.description = "PROCEDURAL LANGUAGE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = defqry->data,
+						.dropStmt = delqry->data,
+					 ));
 
 	/* Dump Proc Lang Comments and Security Labels */
 	if (plang->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -11942,14 +11983,15 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
 
 	if (finfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, finfo->dobj.catId, finfo->dobj.dumpId,
-					 funcsig_tag,
-					 finfo->dobj.namespace->dobj.name,
-					 NULL,
-					 finfo->rolname,
-					 keyword, SECTION_PRE_DATA,
-					 q->data, delqry->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = funcsig_tag,
+						.namespace = finfo->dobj.namespace->dobj.name,
+						.owner = finfo->rolname,
+						.description = keyword,
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delqry->data,
+					 ));
 
 	/* Dump Function Comments and Security Labels */
 	if (finfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -12077,12 +12119,13 @@ dumpCast(Archive *fout, CastInfo *cast)
 
 	if (cast->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, cast->dobj.catId, cast->dobj.dumpId,
-					 labelq->data,
-					 NULL, NULL, "",
-					 "CAST", SECTION_PRE_DATA,
-					 defqry->data, delqry->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = labelq->data,
+						.description = "CAST",
+						.section = SECTION_PRE_DATA,
+						.createStmt = defqry->data,
+						.dropStmt = delqry->data,
+					 ));
 
 	/* Dump Cast Comments */
 	if (cast->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -12205,12 +12248,15 @@ dumpTransform(Archive *fout, TransformInfo *transform)
 
 	if (transform->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, transform->dobj.catId, transform->dobj.dumpId,
-					 labelq->data,
-					 NULL, NULL, "",
-					 "TRANSFORM", SECTION_PRE_DATA,
-					 defqry->data, delqry->data, NULL,
-					 transform->dobj.dependencies, transform->dobj.nDeps,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = labelq->data,
+						.description = "TRANSFORM",
+						.section = SECTION_PRE_DATA,
+						.createStmt = defqry->data,
+						.dropStmt = delqry->data,
+						.deps = transform->dobj.dependencies,
+						.nDeps = transform->dobj.nDeps,
+					 ));
 
 	/* Dump Transform Comments */
 	if (transform->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -12418,14 +12464,15 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
 
 	if (oprinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, oprinfo->dobj.catId, oprinfo->dobj.dumpId,
-					 oprinfo->dobj.name,
-					 oprinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 oprinfo->rolname,
-					 "OPERATOR", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = oprinfo->dobj.name,
+						.namespace = oprinfo->dobj.namespace->dobj.name,
+						.owner = oprinfo->rolname,
+						.description = "OPERATOR",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Operator Comments */
 	if (oprinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -12588,14 +12635,13 @@ dumpAccessMethod(Archive *fout, AccessMethodInfo *aminfo)
 
 	if (aminfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, aminfo->dobj.catId, aminfo->dobj.dumpId,
-					 aminfo->dobj.name,
-					 NULL,
-					 NULL,
-					 "",
-					 "ACCESS METHOD", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = aminfo->dobj.name,
+						.description = "ACCESS METHOD",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Access Method Comments */
 	if (aminfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -12954,14 +13000,15 @@ dumpOpclass(Archive *fout, OpclassInfo *opcinfo)
 
 	if (opcinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, opcinfo->dobj.catId, opcinfo->dobj.dumpId,
-					 opcinfo->dobj.name,
-					 opcinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 opcinfo->rolname,
-					 "OPERATOR CLASS", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = opcinfo->dobj.name,
+						.namespace = opcinfo->dobj.namespace->dobj.name,
+						.owner = opcinfo->rolname,
+						.description = "OPERATOR CLASS",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Operator Class Comments */
 	if (opcinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -13221,14 +13268,15 @@ dumpOpfamily(Archive *fout, OpfamilyInfo *opfinfo)
 
 	if (opfinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, opfinfo->dobj.catId, opfinfo->dobj.dumpId,
-					 opfinfo->dobj.name,
-					 opfinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 opfinfo->rolname,
-					 "OPERATOR FAMILY", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = opfinfo->dobj.name,
+						.namespace = opfinfo->dobj.namespace->dobj.name,
+						.owner = opfinfo->rolname,
+						.description = "OPERATOR FAMILY",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Operator Family Comments */
 	if (opfinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -13364,14 +13412,15 @@ dumpCollation(Archive *fout, CollInfo *collinfo)
 
 	if (collinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, collinfo->dobj.catId, collinfo->dobj.dumpId,
-					 collinfo->dobj.name,
-					 collinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 collinfo->rolname,
-					 "COLLATION", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = collinfo->dobj.name,
+						.namespace = collinfo->dobj.namespace->dobj.name,
+						.owner = collinfo->rolname,
+						.description = "COLLATION",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Collation Comments */
 	if (collinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -13459,14 +13508,15 @@ dumpConversion(Archive *fout, ConvInfo *convinfo)
 
 	if (convinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, convinfo->dobj.catId, convinfo->dobj.dumpId,
-					 convinfo->dobj.name,
-					 convinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 convinfo->rolname,
-					 "CONVERSION", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = convinfo->dobj.name,
+						.namespace = convinfo->dobj.namespace->dobj.name,
+						.owner = convinfo->rolname,
+						.description = "CONVERSION",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Conversion Comments */
 	if (convinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -13948,14 +13998,15 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
 	if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, agginfo->aggfn.dobj.catId,
 					 agginfo->aggfn.dobj.dumpId,
-					 aggsig_tag,
-					 agginfo->aggfn.dobj.namespace->dobj.name,
-					 NULL,
-					 agginfo->aggfn.rolname,
-					 "AGGREGATE", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = aggsig_tag,
+						.namespace = agginfo->aggfn.dobj.namespace->dobj.name,
+						.owner = agginfo->aggfn.rolname,
+						.description = "AGGREGATE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Aggregate Comments */
 	if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -14046,14 +14097,14 @@ dumpTSParser(Archive *fout, TSParserInfo *prsinfo)
 
 	if (prsinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, prsinfo->dobj.catId, prsinfo->dobj.dumpId,
-					 prsinfo->dobj.name,
-					 prsinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 "",
-					 "TEXT SEARCH PARSER", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = prsinfo->dobj.name,
+						.namespace = prsinfo->dobj.namespace->dobj.name,
+						.description = "TEXT SEARCH PARSER",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Parser Comments */
 	if (prsinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -14126,14 +14177,15 @@ dumpTSDictionary(Archive *fout, TSDictInfo *dictinfo)
 
 	if (dictinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, dictinfo->dobj.catId, dictinfo->dobj.dumpId,
-					 dictinfo->dobj.name,
-					 dictinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 dictinfo->rolname,
-					 "TEXT SEARCH DICTIONARY", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = dictinfo->dobj.name,
+						.namespace = dictinfo->dobj.namespace->dobj.name,
+						.owner = dictinfo->rolname,
+						.description = "TEXT SEARCH DICTIONARY",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Dictionary Comments */
 	if (dictinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -14187,14 +14239,14 @@ dumpTSTemplate(Archive *fout, TSTemplateInfo *tmplinfo)
 
 	if (tmplinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tmplinfo->dobj.catId, tmplinfo->dobj.dumpId,
-					 tmplinfo->dobj.name,
-					 tmplinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 "",
-					 "TEXT SEARCH TEMPLATE", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tmplinfo->dobj.name,
+						.namespace = tmplinfo->dobj.namespace->dobj.name,
+						.description = "TEXT SEARCH TEMPLATE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Template Comments */
 	if (tmplinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -14307,14 +14359,15 @@ dumpTSConfig(Archive *fout, TSConfigInfo *cfginfo)
 
 	if (cfginfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, cfginfo->dobj.catId, cfginfo->dobj.dumpId,
-					 cfginfo->dobj.name,
-					 cfginfo->dobj.namespace->dobj.name,
-					 NULL,
-					 cfginfo->rolname,
-					 "TEXT SEARCH CONFIGURATION", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = cfginfo->dobj.name,
+						.namespace = cfginfo->dobj.namespace->dobj.name,
+						.owner = cfginfo->rolname,
+						.description = "TEXT SEARCH CONFIGURATION",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Configuration Comments */
 	if (cfginfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -14373,14 +14426,14 @@ dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo)
 
 	if (fdwinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, fdwinfo->dobj.catId, fdwinfo->dobj.dumpId,
-					 fdwinfo->dobj.name,
-					 NULL,
-					 NULL,
-					 fdwinfo->rolname,
-					 "FOREIGN DATA WRAPPER", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = fdwinfo->dobj.name,
+						.owner = fdwinfo->rolname,
+						.description = "FOREIGN DATA WRAPPER",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Foreign Data Wrapper Comments */
 	if (fdwinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -14464,14 +14517,14 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
 
 	if (srvinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, srvinfo->dobj.catId, srvinfo->dobj.dumpId,
-					 srvinfo->dobj.name,
-					 NULL,
-					 NULL,
-					 srvinfo->rolname,
-					 "SERVER", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = srvinfo->dobj.name,
+						.owner = srvinfo->rolname,
+						.description = "SERVER",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Foreign Server Comments */
 	if (srvinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -14582,14 +14635,15 @@ dumpUserMappings(Archive *fout,
 						  usename, servername);
 
 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
-					 tag->data,
-					 namespace,
-					 NULL,
-					 owner,
-					 "USER MAPPING", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 &dumpId, 1,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag->data,
+						.namespace = namespace,
+						.owner = owner,
+						.description = "USER MAPPING",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 	}
 
 	PQclear(res);
@@ -14661,14 +14715,15 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
 
 	if (daclinfo->dobj.dump & DUMP_COMPONENT_ACL)
 		ArchiveEntry(fout, daclinfo->dobj.catId, daclinfo->dobj.dumpId,
-					 tag->data,
-					 daclinfo->dobj.namespace ? daclinfo->dobj.namespace->dobj.name : NULL,
-					 NULL,
-					 daclinfo->defaclrole,
-					 "DEFAULT ACL", SECTION_POST_DATA,
-					 q->data, "", NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag->data,
+						.namespace = daclinfo->dobj.namespace ?
+									 daclinfo->dobj.namespace->dobj.name : NULL,
+						.owner = daclinfo->defaclrole,
+						.description = "DEFAULT ACL",
+						.section = SECTION_POST_DATA,
+						.createStmt = q->data,
+					 ));
 
 	destroyPQExpBuffer(tag);
 	destroyPQExpBuffer(q);
@@ -14760,13 +14815,16 @@ dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
 			appendPQExpBuffer(tag, "%s %s", type, name);
 
 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
-					 tag->data, nspname,
-					 NULL,
-					 owner ? owner : "",
-					 "ACL", SECTION_NONE,
-					 sql->data, "", NULL,
-					 &(objDumpId), 1,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag->data,
+						.namespace = nspname,
+						.owner = owner,
+						.description = "ACL",
+						.section = SECTION_NONE,
+						.createStmt = sql->data,
+						.deps = &(objDumpId),
+						.nDeps = 1,
+					 ));
 		destroyPQExpBuffer(tag);
 	}
 
@@ -14848,11 +14906,16 @@ dumpSecLabel(Archive *fout, const char *type, const char *name,
 
 		appendPQExpBuffer(tag, "%s %s", type, name);
 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
-					 tag->data, namespace, NULL, owner,
-					 "SECURITY LABEL", SECTION_NONE,
-					 query->data, "", NULL,
-					 &(dumpId), 1,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag->data,
+						.namespace = namespace,
+						.owner = owner,
+						.description = "SECURITY LABEL",
+						.section = SECTION_NONE,
+						.createStmt = query->data,
+						.deps = &(dumpId),
+						.nDeps = 1,
+					 ));
 		destroyPQExpBuffer(tag);
 	}
 
@@ -14928,13 +14991,16 @@ dumpTableSecLabel(Archive *fout, TableInfo *tbinfo, const char *reltypename)
 		appendPQExpBuffer(target, "%s %s", reltypename,
 						  fmtId(tbinfo->dobj.name));
 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
-					 target->data,
-					 tbinfo->dobj.namespace->dobj.name,
-					 NULL, tbinfo->rolname,
-					 "SECURITY LABEL", SECTION_NONE,
-					 query->data, "", NULL,
-					 &(tbinfo->dobj.dumpId), 1,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = target->data,
+						.namespace = tbinfo->dobj.namespace->dobj.name,
+						.owner = tbinfo->rolname,
+						.description = "SECURITY LABEL",
+						.section = SECTION_NONE,
+						.createStmt = query->data,
+						.deps = &(tbinfo->dobj.dumpId),
+						.nDeps = 1,
+					 ));
 	}
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(target);
@@ -16012,16 +16078,18 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
 
 	if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
-					 tbinfo->dobj.name,
-					 tbinfo->dobj.namespace->dobj.name,
-					 (tbinfo->relkind == RELKIND_VIEW) ? NULL : tbinfo->reltablespace,
-					 tbinfo->rolname,
-					 reltypename,
-					 tbinfo->postponed_def ?
-					 SECTION_POST_DATA : SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tbinfo->dobj.name,
+						.namespace = tbinfo->dobj.namespace->dobj.name,
+						.tablespace = (tbinfo->relkind == RELKIND_VIEW) ?
+									  NULL : tbinfo->reltablespace,
+						.owner = tbinfo->rolname,
+						.description = reltypename,
+						.section = tbinfo->postponed_def ?
+								   SECTION_POST_DATA : SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 
 	/* Dump Table Comments */
@@ -16092,14 +16160,15 @@ dumpAttrDef(Archive *fout, AttrDefInfo *adinfo)
 
 	if (adinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, adinfo->dobj.catId, adinfo->dobj.dumpId,
-					 tag,
-					 tbinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tbinfo->rolname,
-					 "DEFAULT", SECTION_PRE_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag,
+						.namespace = tbinfo->dobj.namespace->dobj.name,
+						.owner = tbinfo->rolname,
+						.description = "DEFAULT",
+						.section = SECTION_PRE_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	free(tag);
 	destroyPQExpBuffer(q);
@@ -16241,14 +16310,16 @@ dumpIndex(Archive *fout, IndxInfo *indxinfo)
 
 		if (indxinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 			ArchiveEntry(fout, indxinfo->dobj.catId, indxinfo->dobj.dumpId,
-						 indxinfo->dobj.name,
-						 tbinfo->dobj.namespace->dobj.name,
-						 indxinfo->tablespace,
-						 tbinfo->rolname,
-						 "INDEX", SECTION_POST_DATA,
-						 q->data, delq->data, NULL,
-						 NULL, 0,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = indxinfo->dobj.name,
+							.namespace = tbinfo->dobj.namespace->dobj.name,
+							.tablespace = indxinfo->tablespace,
+							.owner = tbinfo->rolname,
+							.description = "INDEX",
+							.section = SECTION_POST_DATA,
+							.createStmt = q->data,
+							.dropStmt = delq->data,
+						 ));
 
 		if (indstatcolsarray)
 			free(indstatcolsarray);
@@ -16290,14 +16361,13 @@ dumpIndexAttach(Archive *fout, IndexAttachInfo *attachinfo)
 						  fmtQualifiedDumpable(attachinfo->partitionIdx));
 
 		ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
-					 attachinfo->dobj.name,
-					 attachinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 "",
-					 "INDEX ATTACH", SECTION_POST_DATA,
-					 q->data, "", NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = attachinfo->dobj.name,
+						.namespace = attachinfo->dobj.namespace->dobj.name,
+						.description = "INDEX ATTACH",
+						.section = SECTION_POST_DATA,
+						.createStmt = q->data,
+					 ));
 
 		destroyPQExpBuffer(q);
 	}
@@ -16345,14 +16415,15 @@ dumpStatisticsExt(Archive *fout, StatsExtInfo *statsextinfo)
 	if (statsextinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, statsextinfo->dobj.catId,
 					 statsextinfo->dobj.dumpId,
-					 statsextinfo->dobj.name,
-					 statsextinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 statsextinfo->rolname,
-					 "STATISTICS", SECTION_POST_DATA,
-					 q->data, delq->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = statsextinfo->dobj.name,
+						.namespace = statsextinfo->dobj.namespace->dobj.name,
+						.owner = statsextinfo->rolname,
+						.description = "STATISTICS",
+						.section = SECTION_POST_DATA,
+						.createStmt = q->data,
+						.dropStmt = delq->data,
+					 ));
 
 	/* Dump Statistics Comments */
 	if (statsextinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
@@ -16506,14 +16577,16 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
 
 		if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 			ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
-						 tag,
-						 tbinfo->dobj.namespace->dobj.name,
-						 indxinfo->tablespace,
-						 tbinfo->rolname,
-						 "CONSTRAINT", SECTION_POST_DATA,
-						 q->data, delq->data, NULL,
-						 NULL, 0,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = tag,
+							.namespace = tbinfo->dobj.namespace->dobj.name,
+							.tablespace = indxinfo->tablespace,
+							.owner = tbinfo->rolname,
+							.description = "CONSTRAINT",
+							.section = SECTION_POST_DATA,
+							.createStmt = q->data,
+							.dropStmt = delq->data,
+						 ));
 	}
 	else if (coninfo->contype == 'f')
 	{
@@ -16546,14 +16619,15 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
 
 		if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 			ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
-						 tag,
-						 tbinfo->dobj.namespace->dobj.name,
-						 NULL,
-						 tbinfo->rolname,
-						 "FK CONSTRAINT", SECTION_POST_DATA,
-						 q->data, delq->data, NULL,
-						 NULL, 0,
-						 NULL, NULL);
+						 ARCHIVE_OPTS(
+							.tag = tag,
+							.namespace = tbinfo->dobj.namespace->dobj.name,
+							.owner = tbinfo->rolname,
+							.description = "FK CONSTRAINT",
+							.section = SECTION_POST_DATA,
+							.createStmt = q->data,
+							.dropStmt = delq->data,
+						 ));
 	}
 	else if (coninfo->contype == 'c' && tbinfo)
 	{
@@ -16578,14 +16652,15 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
 
 			if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 				ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
-							 tag,
-							 tbinfo->dobj.namespace->dobj.name,
-							 NULL,
-							 tbinfo->rolname,
-							 "CHECK CONSTRAINT", SECTION_POST_DATA,
-							 q->data, delq->data, NULL,
-							 NULL, 0,
-							 NULL, NULL);
+							 ARCHIVE_OPTS(
+								.tag = tag,
+								.namespace = tbinfo->dobj.namespace->dobj.name,
+								.owner = tbinfo->rolname,
+								.description = "CHECK CONSTRAINT",
+								.section = SECTION_POST_DATA,
+								.createStmt = q->data,
+								.dropStmt = delq->data,
+							 ));
 		}
 	}
 	else if (coninfo->contype == 'c' && tbinfo == NULL)
@@ -16611,14 +16686,15 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
 
 			if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 				ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
-							 tag,
-							 tyinfo->dobj.namespace->dobj.name,
-							 NULL,
-							 tyinfo->rolname,
-							 "CHECK CONSTRAINT", SECTION_POST_DATA,
-							 q->data, delq->data, NULL,
-							 NULL, 0,
-							 NULL, NULL);
+							 ARCHIVE_OPTS(
+								.tag = tag,
+								.namespace = tyinfo->dobj.namespace->dobj.name,
+								.owner = tyinfo->rolname,
+								.description = "CHECK CONSTRAINT",
+								.section = SECTION_POST_DATA,
+								.createStmt = q->data,
+								.dropStmt = delq->data,
+							 ));
 		}
 	}
 	else
@@ -16885,14 +16961,15 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
 
 	if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
-					 tbinfo->dobj.name,
-					 tbinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tbinfo->rolname,
-					 "SEQUENCE", SECTION_PRE_DATA,
-					 query->data, delqry->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tbinfo->dobj.name,
+						.namespace = tbinfo->dobj.namespace->dobj.name,
+						.owner = tbinfo->rolname,
+						.description = "SEQUENCE",
+						.section = SECTION_PRE_DATA,
+						.createStmt = query->data,
+						.dropStmt = delqry->data,
+					 ));
 
 	/*
 	 * If the sequence is owned by a table column, emit the ALTER for it as a
@@ -16926,14 +17003,16 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
 
 			if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 				ArchiveEntry(fout, nilCatalogId, createDumpId(),
-							 tbinfo->dobj.name,
-							 tbinfo->dobj.namespace->dobj.name,
-							 NULL,
-							 tbinfo->rolname,
-							 "SEQUENCE OWNED BY", SECTION_PRE_DATA,
-							 query->data, "", NULL,
-							 &(tbinfo->dobj.dumpId), 1,
-							 NULL, NULL);
+							 ARCHIVE_OPTS(
+								.tag = tbinfo->dobj.name,
+								.namespace = tbinfo->dobj.namespace->dobj.name,
+								.owner = tbinfo->rolname,
+								.description = "SEQUENCE OWNED BY",
+								.section = SECTION_PRE_DATA,
+								.createStmt = query->data,
+								.deps = &(tbinfo->dobj.dumpId),
+								.nDeps = 1,
+							 ));
 		}
 	}
 
@@ -16994,14 +17073,16 @@ dumpSequenceData(Archive *fout, TableDataInfo *tdinfo)
 
 	if (tdinfo->dobj.dump & DUMP_COMPONENT_DATA)
 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
-					 tbinfo->dobj.name,
-					 tbinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tbinfo->rolname,
-					 "SEQUENCE SET", SECTION_DATA,
-					 query->data, "", NULL,
-					 &(tbinfo->dobj.dumpId), 1,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tbinfo->dobj.name,
+						.namespace = tbinfo->dobj.namespace->dobj.name,
+						.owner = tbinfo->rolname,
+						.description = "SEQUENCE SET",
+						.section = SECTION_DATA,
+						.createStmt = query->data,
+						.deps = &(tbinfo->dobj.dumpId),
+						.nDeps = 1,
+					 ));
 
 	PQclear(res);
 
@@ -17193,14 +17274,15 @@ dumpTrigger(Archive *fout, TriggerInfo *tginfo)
 
 	if (tginfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, tginfo->dobj.catId, tginfo->dobj.dumpId,
-					 tag,
-					 tbinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tbinfo->rolname,
-					 "TRIGGER", SECTION_POST_DATA,
-					 query->data, delqry->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag,
+						.namespace = tbinfo->dobj.namespace->dobj.name,
+						.owner = tbinfo->rolname,
+						.description = "TRIGGER",
+						.section = SECTION_POST_DATA,
+						.createStmt = query->data,
+						.dropStmt = delqry->data,
+					 ));
 
 	if (tginfo->dobj.dump & DUMP_COMPONENT_COMMENT)
 		dumpComment(fout, trigprefix->data, qtabname,
@@ -17282,12 +17364,14 @@ dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
 
 	if (evtinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, evtinfo->dobj.catId, evtinfo->dobj.dumpId,
-					 evtinfo->dobj.name, NULL, NULL,
-					 evtinfo->evtowner,
-					 "EVENT TRIGGER", SECTION_POST_DATA,
-					 query->data, delqry->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = evtinfo->dobj.name,
+						.owner = evtinfo->evtowner,
+						.description = "EVENT TRIGGER",
+						.section = SECTION_POST_DATA,
+						.createStmt = query->data,
+						.dropStmt = delqry->data,
+					 ));
 
 	if (evtinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
 		dumpComment(fout, "EVENT TRIGGER", qevtname,
@@ -17440,14 +17524,15 @@ dumpRule(Archive *fout, RuleInfo *rinfo)
 
 	if (rinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
 		ArchiveEntry(fout, rinfo->dobj.catId, rinfo->dobj.dumpId,
-					 tag,
-					 tbinfo->dobj.namespace->dobj.name,
-					 NULL,
-					 tbinfo->rolname,
-					 "RULE", SECTION_POST_DATA,
-					 cmd->data, delcmd->data, NULL,
-					 NULL, 0,
-					 NULL, NULL);
+					 ARCHIVE_OPTS(
+						.tag = tag,
+						.namespace = tbinfo->dobj.namespace->dobj.name,
+						.owner = tbinfo->rolname,
+						.description = "RULE",
+						.section = SECTION_POST_DATA,
+						.createStmt = cmd->data,
+						.dropStmt = delcmd->data,
+					 ));
 
 	/* Dump rule comments */
 	if (rinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
-- 
2.16.4

