@ -123,6 +123,9 @@ static SimpleOidList tabledata_exclude_oids = {NULL, NULL};
static SimpleStringList foreign_servers_include_patterns = { NULL , NULL } ;
static SimpleOidList foreign_servers_include_oids = { NULL , NULL } ;
static SimpleStringList extension_include_patterns = { NULL , NULL } ;
static SimpleOidList extension_include_oids = { NULL , NULL } ;
static const CatalogId nilCatalogId = { 0 , 0 } ;
/* override for standard extra_float_digits setting */
@ -151,6 +154,10 @@ static void expand_schema_name_patterns(Archive *fout,
SimpleStringList * patterns ,
SimpleOidList * oids ,
bool strict_names ) ;
static void expand_extension_name_patterns ( Archive * fout ,
SimpleStringList * patterns ,
SimpleOidList * oids ,
bool strict_names ) ;
static void expand_foreign_server_name_patterns ( Archive * fout ,
SimpleStringList * patterns ,
SimpleOidList * oids ) ;
@ -335,6 +342,7 @@ main(int argc, char **argv)
{ " clean " , no_argument , NULL , ' c ' } ,
{ " create " , no_argument , NULL , ' C ' } ,
{ " dbname " , required_argument , NULL , ' d ' } ,
{ " extension " , required_argument , NULL , ' e ' } ,
{ " file " , required_argument , NULL , ' f ' } ,
{ " format " , required_argument , NULL , ' F ' } ,
{ " host " , required_argument , NULL , ' h ' } ,
@ -426,7 +434,7 @@ main(int argc, char **argv)
InitDumpOptions ( & dopt ) ;
while ( ( c = getopt_long ( argc , argv , " abBcCd:E:f:F:h:j:n:N:Op:RsS:t:T:U:vwWxZ: " ,
while ( ( c = getopt_long ( argc , argv , " abBcCd:e: E:f:F:h:j:n:N:Op:RsS:t:T:U:vwWxZ: " ,
long_options , & optindex ) ) ! = - 1 )
{
switch ( c )
@ -455,6 +463,11 @@ main(int argc, char **argv)
dopt . cparams . dbname = pg_strdup ( optarg ) ;
break ;
case ' e ' : /* include extension(s) */
simple_string_list_append ( & extension_include_patterns , optarg ) ;
dopt . include_everything = false ;
break ;
case ' E ' : /* Dump encoding */
dumpencoding = pg_strdup ( optarg ) ;
break ;
@ -834,6 +847,16 @@ main(int argc, char **argv)
/* non-matching exclusion patterns aren't an error */
/* Expand extension selection patterns into OID lists */
if ( extension_include_patterns . head ! = NULL )
{
expand_extension_name_patterns ( fout , & extension_include_patterns ,
& extension_include_oids ,
strict_names ) ;
if ( extension_include_oids . head = = NULL )
fatal ( " no matching extensions were found " ) ;
}
/*
* Dumping blobs is the default for dumps where an inclusion switch is not
* used ( an " include everything " dump ) . - B can be used to exclude blobs
@ -1025,6 +1048,7 @@ help(const char *progname)
printf ( _ ( " -B, --no-blobs exclude large objects in dump \n " ) ) ;
printf ( _ ( " -c, --clean clean (drop) database objects before recreating \n " ) ) ;
printf ( _ ( " -C, --create include commands to create database in dump \n " ) ) ;
printf ( _ ( " -e, --extension=PATTERN dump the specified extension(s) only \n " ) ) ;
printf ( _ ( " -E, --encoding=ENCODING dump the data in encoding ENCODING \n " ) ) ;
printf ( _ ( " -n, --schema=PATTERN dump the specified schema(s) only \n " ) ) ;
printf ( _ ( " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s) \n " ) ) ;
@ -1367,6 +1391,53 @@ expand_schema_name_patterns(Archive *fout,
destroyPQExpBuffer ( query ) ;
}
/*
* Find the OIDs of all extensions matching the given list of patterns ,
* and append them to the given OID list .
*/
static void
expand_extension_name_patterns ( Archive * fout ,
SimpleStringList * patterns ,
SimpleOidList * oids ,
bool strict_names )
{
PQExpBuffer query ;
PGresult * res ;
SimpleStringListCell * cell ;
int i ;
if ( patterns - > head = = NULL )
return ; /* nothing to do */
query = createPQExpBuffer ( ) ;
/*
* The loop below runs multiple SELECTs might sometimes result in
* duplicate entries in the OID list , but we don ' t care .
*/
for ( cell = patterns - > head ; cell ; cell = cell - > next )
{
appendPQExpBufferStr ( query ,
" SELECT oid FROM pg_catalog.pg_extension e \n " ) ;
processSQLNamePattern ( GetConnection ( fout ) , query , cell - > val , false ,
false , NULL , " e.extname " , NULL , NULL ) ;
res = ExecuteSqlQuery ( fout , query - > data , PGRES_TUPLES_OK ) ;
if ( strict_names & & PQntuples ( res ) = = 0 )
fatal ( " no matching extensions were found for pattern \" %s \" " , cell - > val ) ;
for ( i = 0 ; i < PQntuples ( res ) ; i + + )
{
simple_oid_list_append ( oids , atooid ( PQgetvalue ( res , i , 0 ) ) ) ;
}
PQclear ( res ) ;
resetPQExpBuffer ( query ) ;
}
destroyPQExpBuffer ( query ) ;
}
/*
* Find the OIDs of all foreign servers matching the given list of patterns ,
* and append them to the given OID list .
@ -1793,8 +1864,9 @@ selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout)
* Built - in extensions should be skipped except for checking ACLs , since we
* assume those will already be installed in the target database . We identify
* such extensions by their having OIDs in the range reserved for initdb .
* We dump all user - added extensions by default , or none of them if
* include_everything is false ( i . e . , a - - schema or - - table switch was given ) .
* We dump all user - added extensions by default . No extensions are dumped
* if include_everything is false ( i . e . , a - - schema or - - table switch was
* given ) , except if - - extension specifies a list of extensions to dump .
*/
static void
selectDumpableExtension ( ExtensionInfo * extinfo , DumpOptions * dopt )
@ -1807,9 +1879,18 @@ selectDumpableExtension(ExtensionInfo *extinfo, DumpOptions *dopt)
if ( extinfo - > dobj . catId . oid < = ( Oid ) g_last_builtin_oid )
extinfo - > dobj . dump = extinfo - > dobj . dump_contains = DUMP_COMPONENT_ACL ;
else
extinfo - > dobj . dump = extinfo - > dobj . dump_contains =
dopt - > include_everything ? DUMP_COMPONENT_ALL :
DUMP_COMPONENT_NONE ;
{
/* check if there is a list of extensions to dump */
if ( extension_include_oids . head ! = NULL )
extinfo - > dobj . dump = extinfo - > dobj . dump_contains =
simple_oid_list_member ( & extension_include_oids ,
extinfo - > dobj . catId . oid ) ?
DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE ;
else
extinfo - > dobj . dump = extinfo - > dobj . dump_contains =
dopt - > include_everything ?
DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE ;
}
}
/*