mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
Cleanup code in reloptions.h regarding reloption handling
reloptions.h includes since ba748f7 a set of macros to handle reloption types in a way similar to how parseRelOptions() works. They have never been used in the core code, and we have more simple methods now to parse and fill in rd_options for a given relation depending on its relkind, so remove this interface to simplify things. Per discussion between Amit Langote, Álvaro Herrera and me. Discussion: https://postgr.es/m/CA+HiwqE6zbNO92az6pp5GiTw4tr-9rfCE0t84whQSP+YwSKjMQ@mail.gmail.com
This commit is contained in:
parent
1bbd608fda
commit
50d22de932
@ -496,6 +496,15 @@ static void initialize_reloptions(void);
|
||||
static void parse_one_reloption(relopt_value *option, char *text_str,
|
||||
int text_len, bool validate);
|
||||
|
||||
/*
|
||||
* Get the length of a string reloption (either default or the user-defined
|
||||
* value). This is used for allocation purposes when building a set of
|
||||
* relation options.
|
||||
*/
|
||||
#define GET_STRING_RELOPTION_LEN(option) \
|
||||
((option).isset ? strlen((option).values.string_val) : \
|
||||
((relopt_string *) (option).gen)->default_len)
|
||||
|
||||
/*
|
||||
* initialize_reloptions
|
||||
* initialization routine, must be called before parsing
|
||||
@ -1142,7 +1151,7 @@ extractRelOptions(HeapTuple tuple, TupleDesc tupdesc,
|
||||
* returned array. Values of type string are allocated separately and must
|
||||
* be freed by the caller.
|
||||
*/
|
||||
relopt_value *
|
||||
static relopt_value *
|
||||
parseRelOptions(Datum options, bool validate, relopt_kind kind,
|
||||
int *numrelopts)
|
||||
{
|
||||
@ -1367,7 +1376,7 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len,
|
||||
* "base" should be sizeof(struct) of the reloptions struct (StdRdOptions or
|
||||
* equivalent).
|
||||
*/
|
||||
void *
|
||||
static void *
|
||||
allocateReloptStruct(Size base, relopt_value *options, int numoptions)
|
||||
{
|
||||
Size size = base;
|
||||
@ -1391,7 +1400,7 @@ allocateReloptStruct(Size base, relopt_value *options, int numoptions)
|
||||
* elems, of length numelems, is the table describing the allowed options.
|
||||
* When validate is true, it is expected that all options appear in elems.
|
||||
*/
|
||||
void
|
||||
static void
|
||||
fillRelOptions(void *rdopts, Size basesize,
|
||||
relopt_value *options, int numoptions,
|
||||
bool validate,
|
||||
|
@ -140,7 +140,7 @@ typedef struct relopt_string
|
||||
char *default_val;
|
||||
} relopt_string;
|
||||
|
||||
/* This is the table datatype for fillRelOptions */
|
||||
/* This is the table datatype for build_reloptions() */
|
||||
typedef struct
|
||||
{
|
||||
const char *optname; /* option's name */
|
||||
@ -148,124 +148,16 @@ typedef struct
|
||||
int offset; /* offset of field in result struct */
|
||||
} relopt_parse_elt;
|
||||
|
||||
|
||||
/*
|
||||
* These macros exist for the convenience of amoptions writers (but consider
|
||||
* using fillRelOptions, which is a lot simpler). Beware of multiple
|
||||
* evaluation of arguments!
|
||||
*
|
||||
* The last argument in the HANDLE_*_RELOPTION macros allows the caller to
|
||||
* determine whether the option was set (true), or its value acquired from
|
||||
* defaults (false); it can be passed as (char *) NULL if the caller does not
|
||||
* need this information.
|
||||
*
|
||||
* optname is the option name (a string), var is the variable
|
||||
* on which the value should be stored (e.g. StdRdOptions->fillfactor), and
|
||||
* option is a relopt_value pointer.
|
||||
*
|
||||
* The normal way to use this is to loop on the relopt_value array returned by
|
||||
* parseRelOptions:
|
||||
* for (i = 0; options[i].gen->name; i++)
|
||||
* {
|
||||
* if (HAVE_RELOPTION("fillfactor", options[i])
|
||||
* {
|
||||
* HANDLE_INT_RELOPTION("fillfactor", rdopts->fillfactor, options[i], &isset);
|
||||
* continue;
|
||||
* }
|
||||
* if (HAVE_RELOPTION("default_row_acl", options[i])
|
||||
* {
|
||||
* ...
|
||||
* }
|
||||
* ...
|
||||
* if (validate)
|
||||
* ereport(ERROR,
|
||||
* (errmsg("unknown option")));
|
||||
* }
|
||||
*
|
||||
* Note that this is more or less the same that fillRelOptions does, so only
|
||||
* use this if you need to do something non-standard within some option's
|
||||
* code block.
|
||||
*/
|
||||
#define HAVE_RELOPTION(optname, option) \
|
||||
(strncmp(option.gen->name, optname, option.gen->namelen + 1) == 0)
|
||||
|
||||
#define HANDLE_INT_RELOPTION(optname, var, option, wasset) \
|
||||
do { \
|
||||
if (option.isset) \
|
||||
var = option.values.int_val; \
|
||||
else \
|
||||
var = ((relopt_int *) option.gen)->default_val; \
|
||||
(wasset) != NULL ? *(wasset) = option.isset : (dummyret)NULL; \
|
||||
} while (0)
|
||||
|
||||
#define HANDLE_BOOL_RELOPTION(optname, var, option, wasset) \
|
||||
do { \
|
||||
if (option.isset) \
|
||||
var = option.values.bool_val; \
|
||||
else \
|
||||
var = ((relopt_bool *) option.gen)->default_val; \
|
||||
(wasset) != NULL ? *(wasset) = option.isset : (dummyret) NULL; \
|
||||
} while (0)
|
||||
|
||||
#define HANDLE_REAL_RELOPTION(optname, var, option, wasset) \
|
||||
do { \
|
||||
if (option.isset) \
|
||||
var = option.values.real_val; \
|
||||
else \
|
||||
var = ((relopt_real *) option.gen)->default_val; \
|
||||
(wasset) != NULL ? *(wasset) = option.isset : (dummyret) NULL; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Note that this assumes that the variable is already allocated at the tail of
|
||||
* reloptions structure (StdRdOptions or equivalent).
|
||||
*
|
||||
* "base" is a pointer to the reloptions structure, and "offset" is an integer
|
||||
* variable that must be initialized to sizeof(reloptions structure). This
|
||||
* struct must have been allocated with enough space to hold any string option
|
||||
* present, including terminating \0 for every option. SET_VARSIZE() must be
|
||||
* called on the struct with this offset as the second argument, after all the
|
||||
* string options have been processed.
|
||||
*/
|
||||
#define HANDLE_STRING_RELOPTION(optname, var, option, base, offset, wasset) \
|
||||
do { \
|
||||
relopt_string *optstring = (relopt_string *) option.gen;\
|
||||
char *string_val; \
|
||||
if (option.isset) \
|
||||
string_val = option.values.string_val; \
|
||||
else if (!optstring->default_isnull) \
|
||||
string_val = optstring->default_val; \
|
||||
else \
|
||||
string_val = NULL; \
|
||||
(wasset) != NULL ? *(wasset) = option.isset : (dummyret) NULL; \
|
||||
if (string_val == NULL) \
|
||||
var = 0; \
|
||||
else \
|
||||
{ \
|
||||
strcpy(((char *)(base)) + (offset), string_val); \
|
||||
var = (offset); \
|
||||
(offset) += strlen(string_val) + 1; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* For use during amoptions: get the strlen of a string option
|
||||
* (either default or the user defined value)
|
||||
*/
|
||||
#define GET_STRING_RELOPTION_LEN(option) \
|
||||
((option).isset ? strlen((option).values.string_val) : \
|
||||
((relopt_string *) (option).gen)->default_len)
|
||||
|
||||
/*
|
||||
* For use by code reading options already parsed: get a pointer to the string
|
||||
* value itself. "optstruct" is the StdRdOptions struct or equivalent, "member"
|
||||
* is the struct member corresponding to the string option
|
||||
* Utility macro to get a value for a string reloption once the options
|
||||
* are parsed. This gets a pointer to the string value itself. "optstruct"
|
||||
* is the StdRdOptions struct or equivalent, "member" is the struct member
|
||||
* corresponding to the string option.
|
||||
*/
|
||||
#define GET_STRING_RELOPTION(optstruct, member) \
|
||||
((optstruct)->member == 0 ? NULL : \
|
||||
(char *)(optstruct) + (optstruct)->member)
|
||||
|
||||
|
||||
extern relopt_kind add_reloption_kind(void);
|
||||
extern void add_bool_reloption(bits32 kinds, const char *name, const char *desc,
|
||||
bool default_val, LOCKMODE lockmode);
|
||||
@ -288,14 +180,6 @@ extern Datum transformRelOptions(Datum oldOptions, List *defList,
|
||||
extern List *untransformRelOptions(Datum options);
|
||||
extern bytea *extractRelOptions(HeapTuple tuple, TupleDesc tupdesc,
|
||||
amoptions_function amoptions);
|
||||
extern relopt_value *parseRelOptions(Datum options, bool validate,
|
||||
relopt_kind kind, int *numrelopts);
|
||||
extern void *allocateReloptStruct(Size base, relopt_value *options,
|
||||
int numoptions);
|
||||
extern void fillRelOptions(void *rdopts, Size basesize,
|
||||
relopt_value *options, int numoptions,
|
||||
bool validate,
|
||||
const relopt_parse_elt *elems, int nelems);
|
||||
extern void *build_reloptions(Datum reloptions, bool validate,
|
||||
relopt_kind kind,
|
||||
Size relopt_struct_size,
|
||||
|
Loading…
x
Reference in New Issue
Block a user