mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44: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,
|
static void parse_one_reloption(relopt_value *option, char *text_str,
|
||||||
int text_len, bool validate);
|
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
|
* initialize_reloptions
|
||||||
* initialization routine, must be called before parsing
|
* 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
|
* returned array. Values of type string are allocated separately and must
|
||||||
* be freed by the caller.
|
* be freed by the caller.
|
||||||
*/
|
*/
|
||||||
relopt_value *
|
static relopt_value *
|
||||||
parseRelOptions(Datum options, bool validate, relopt_kind kind,
|
parseRelOptions(Datum options, bool validate, relopt_kind kind,
|
||||||
int *numrelopts)
|
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
|
* "base" should be sizeof(struct) of the reloptions struct (StdRdOptions or
|
||||||
* equivalent).
|
* equivalent).
|
||||||
*/
|
*/
|
||||||
void *
|
static void *
|
||||||
allocateReloptStruct(Size base, relopt_value *options, int numoptions)
|
allocateReloptStruct(Size base, relopt_value *options, int numoptions)
|
||||||
{
|
{
|
||||||
Size size = base;
|
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.
|
* elems, of length numelems, is the table describing the allowed options.
|
||||||
* When validate is true, it is expected that all options appear in elems.
|
* When validate is true, it is expected that all options appear in elems.
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
fillRelOptions(void *rdopts, Size basesize,
|
fillRelOptions(void *rdopts, Size basesize,
|
||||||
relopt_value *options, int numoptions,
|
relopt_value *options, int numoptions,
|
||||||
bool validate,
|
bool validate,
|
||||||
|
@ -140,7 +140,7 @@ typedef struct relopt_string
|
|||||||
char *default_val;
|
char *default_val;
|
||||||
} relopt_string;
|
} relopt_string;
|
||||||
|
|
||||||
/* This is the table datatype for fillRelOptions */
|
/* This is the table datatype for build_reloptions() */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const char *optname; /* option's name */
|
const char *optname; /* option's name */
|
||||||
@ -148,124 +148,16 @@ typedef struct
|
|||||||
int offset; /* offset of field in result struct */
|
int offset; /* offset of field in result struct */
|
||||||
} relopt_parse_elt;
|
} relopt_parse_elt;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These macros exist for the convenience of amoptions writers (but consider
|
* Utility macro to get a value for a string reloption once the options
|
||||||
* using fillRelOptions, which is a lot simpler). Beware of multiple
|
* are parsed. This gets a pointer to the string value itself. "optstruct"
|
||||||
* evaluation of arguments!
|
* is the StdRdOptions struct or equivalent, "member" is the struct member
|
||||||
*
|
* corresponding to the string option.
|
||||||
* 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
|
|
||||||
*/
|
*/
|
||||||
#define GET_STRING_RELOPTION(optstruct, member) \
|
#define GET_STRING_RELOPTION(optstruct, member) \
|
||||||
((optstruct)->member == 0 ? NULL : \
|
((optstruct)->member == 0 ? NULL : \
|
||||||
(char *)(optstruct) + (optstruct)->member)
|
(char *)(optstruct) + (optstruct)->member)
|
||||||
|
|
||||||
|
|
||||||
extern relopt_kind add_reloption_kind(void);
|
extern relopt_kind add_reloption_kind(void);
|
||||||
extern void add_bool_reloption(bits32 kinds, const char *name, const char *desc,
|
extern void add_bool_reloption(bits32 kinds, const char *name, const char *desc,
|
||||||
bool default_val, LOCKMODE lockmode);
|
bool default_val, LOCKMODE lockmode);
|
||||||
@ -288,14 +180,6 @@ extern Datum transformRelOptions(Datum oldOptions, List *defList,
|
|||||||
extern List *untransformRelOptions(Datum options);
|
extern List *untransformRelOptions(Datum options);
|
||||||
extern bytea *extractRelOptions(HeapTuple tuple, TupleDesc tupdesc,
|
extern bytea *extractRelOptions(HeapTuple tuple, TupleDesc tupdesc,
|
||||||
amoptions_function amoptions);
|
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,
|
extern void *build_reloptions(Datum reloptions, bool validate,
|
||||||
relopt_kind kind,
|
relopt_kind kind,
|
||||||
Size relopt_struct_size,
|
Size relopt_struct_size,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user