@ -10,7 +10,7 @@
* Written by Peter Eisentraut < peter_e @ gmx . net > .
*
* IDENTIFICATION
* $ PostgreSQL : pgsql / src / backend / utils / misc / guc . c , v 1.505 .2 .5 2010 / 02 / 25 13 : 26 : 26 mha Exp $
* $ PostgreSQL : pgsql / src / backend / utils / misc / guc . c , v 1.505 .2 .6 2010 / 03 / 25 14 : 44 : 51 alvherre Exp $
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
@ -7042,6 +7042,7 @@ ProcessGUCArray(ArrayType *array,
free ( name ) ;
if ( value )
free ( value ) ;
pfree ( s ) ;
}
}
@ -7176,6 +7177,7 @@ GUCArrayDelete(ArrayType *array, const char *name)
& & val [ strlen ( name ) ] = = ' = ' )
continue ;
/* else add it to the output array */
if ( newarray )
{
@ -7198,6 +7200,85 @@ GUCArrayDelete(ArrayType *array, const char *name)
return newarray ;
}
/*
* Given a GUC array , delete all settings from it that our permission
* level allows : if superuser , delete them all ; if regular user , only
* those that are PGC_USERSET
*/
ArrayType *
GUCArrayReset ( ArrayType * array )
{
ArrayType * newarray ;
int i ;
int index ;
/* if array is currently null, nothing to do */
if ( ! array )
return NULL ;
/* if we're superuser, we can delete everything */
if ( superuser ( ) )
return NULL ;
newarray = NULL ;
index = 1 ;
for ( i = 1 ; i < = ARR_DIMS ( array ) [ 0 ] ; i + + )
{
Datum d ;
char * val ;
char * eqsgn ;
bool isnull ;
struct config_generic * gconf ;
d = array_ref ( array , 1 , & i ,
- 1 /* varlenarray */ ,
- 1 /* TEXT's typlen */ ,
false /* TEXT's typbyval */ ,
' i ' /* TEXT's typalign */ ,
& isnull ) ;
if ( isnull )
continue ;
val = TextDatumGetCString ( d ) ;
eqsgn = strchr ( val , ' = ' ) ;
* eqsgn = ' \0 ' ;
gconf = find_option ( val , false , WARNING ) ;
if ( ! gconf )
continue ;
/* note: superuser-ness was already checked above */
/* skip entry if OK to delete */
if ( gconf - > context = = PGC_USERSET )
continue ;
/* XXX do we need to worry about database owner? */
/* else add it to the output array */
if ( newarray )
{
newarray = array_set ( newarray , 1 , & index ,
d ,
false ,
- 1 /* varlenarray */ ,
- 1 /* TEXT's typlen */ ,
false /* TEXT's typbyval */ ,
' i ' /* TEXT's typalign */ ) ;
}
else
newarray = construct_array ( & d , 1 ,
TEXTOID ,
- 1 , false , ' i ' ) ;
index + + ;
pfree ( val ) ;
}
return newarray ;
}
/*
* assign_hook and show_hook subroutines