mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
Allow definition of lock mode for custom reloptions
Relation options can define a lock mode other than AccessExclusiveMode
since 47167b7
, but modules defining custom relation options did not
really have a way to enforce that. Correct that by extending the
current API set so as modules can define a custom lock mode.
Author: Michael Paquier
Reviewed-by: Kuntal Ghosh
Discussion: https://postgr.es/m/20190920013831.GD1844@paquier.xyz
This commit is contained in:
parent
736b84eede
commit
69f9410807
@ -60,7 +60,8 @@ _PG_init(void)
|
||||
/* Option for length of signature */
|
||||
add_int_reloption(bl_relopt_kind, "length",
|
||||
"Length of signature in bits",
|
||||
DEFAULT_BLOOM_LENGTH, 1, MAX_BLOOM_LENGTH);
|
||||
DEFAULT_BLOOM_LENGTH, 1, MAX_BLOOM_LENGTH,
|
||||
AccessExclusiveLock);
|
||||
bl_relopt_tab[0].optname = "length";
|
||||
bl_relopt_tab[0].opttype = RELOPT_TYPE_INT;
|
||||
bl_relopt_tab[0].offset = offsetof(BloomOptions, bloomLength);
|
||||
@ -71,7 +72,8 @@ _PG_init(void)
|
||||
snprintf(buf, sizeof(buf), "col%d", i + 1);
|
||||
add_int_reloption(bl_relopt_kind, buf,
|
||||
"Number of bits generated for each index column",
|
||||
DEFAULT_BLOOM_BITS, 1, MAX_BLOOM_BITS);
|
||||
DEFAULT_BLOOM_BITS, 1, MAX_BLOOM_BITS,
|
||||
AccessExclusiveLock);
|
||||
bl_relopt_tab[i + 1].optname = MemoryContextStrdup(TopMemoryContext,
|
||||
buf);
|
||||
bl_relopt_tab[i + 1].opttype = RELOPT_TYPE_INT;
|
||||
|
@ -621,7 +621,8 @@ add_reloption(relopt_gen *newoption)
|
||||
* (for types other than string)
|
||||
*/
|
||||
static relopt_gen *
|
||||
allocate_reloption(bits32 kinds, int type, const char *name, const char *desc)
|
||||
allocate_reloption(bits32 kinds, int type, const char *name, const char *desc,
|
||||
LOCKMODE lockmode)
|
||||
{
|
||||
MemoryContext oldcxt;
|
||||
size_t size;
|
||||
@ -658,13 +659,7 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc)
|
||||
newoption->kinds = kinds;
|
||||
newoption->namelen = strlen(name);
|
||||
newoption->type = type;
|
||||
|
||||
/*
|
||||
* Set the default lock mode for this option. There is no actual way
|
||||
* for a module to enforce it when declaring a custom relation option,
|
||||
* so just use the highest level, which is safe for all cases.
|
||||
*/
|
||||
newoption->lockmode = AccessExclusiveLock;
|
||||
newoption->lockmode = lockmode;
|
||||
|
||||
MemoryContextSwitchTo(oldcxt);
|
||||
|
||||
@ -676,12 +671,13 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc)
|
||||
* Add a new boolean reloption
|
||||
*/
|
||||
void
|
||||
add_bool_reloption(bits32 kinds, const char *name, const char *desc, bool default_val)
|
||||
add_bool_reloption(bits32 kinds, const char *name, const char *desc,
|
||||
bool default_val, LOCKMODE lockmode)
|
||||
{
|
||||
relopt_bool *newoption;
|
||||
|
||||
newoption = (relopt_bool *) allocate_reloption(kinds, RELOPT_TYPE_BOOL,
|
||||
name, desc);
|
||||
name, desc, lockmode);
|
||||
newoption->default_val = default_val;
|
||||
|
||||
add_reloption((relopt_gen *) newoption);
|
||||
@ -693,12 +689,12 @@ add_bool_reloption(bits32 kinds, const char *name, const char *desc, bool defaul
|
||||
*/
|
||||
void
|
||||
add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_val,
|
||||
int min_val, int max_val)
|
||||
int min_val, int max_val, LOCKMODE lockmode)
|
||||
{
|
||||
relopt_int *newoption;
|
||||
|
||||
newoption = (relopt_int *) allocate_reloption(kinds, RELOPT_TYPE_INT,
|
||||
name, desc);
|
||||
name, desc, lockmode);
|
||||
newoption->default_val = default_val;
|
||||
newoption->min = min_val;
|
||||
newoption->max = max_val;
|
||||
@ -712,12 +708,12 @@ add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_
|
||||
*/
|
||||
void
|
||||
add_real_reloption(bits32 kinds, const char *name, const char *desc, double default_val,
|
||||
double min_val, double max_val)
|
||||
double min_val, double max_val, LOCKMODE lockmode)
|
||||
{
|
||||
relopt_real *newoption;
|
||||
|
||||
newoption = (relopt_real *) allocate_reloption(kinds, RELOPT_TYPE_REAL,
|
||||
name, desc);
|
||||
name, desc, lockmode);
|
||||
newoption->default_val = default_val;
|
||||
newoption->min = min_val;
|
||||
newoption->max = max_val;
|
||||
@ -736,7 +732,7 @@ add_real_reloption(bits32 kinds, const char *name, const char *desc, double defa
|
||||
*/
|
||||
void
|
||||
add_string_reloption(bits32 kinds, const char *name, const char *desc, const char *default_val,
|
||||
validate_string_relopt validator)
|
||||
validate_string_relopt validator, LOCKMODE lockmode)
|
||||
{
|
||||
relopt_string *newoption;
|
||||
|
||||
@ -745,7 +741,7 @@ add_string_reloption(bits32 kinds, const char *name, const char *desc, const cha
|
||||
(validator) (default_val);
|
||||
|
||||
newoption = (relopt_string *) allocate_reloption(kinds, RELOPT_TYPE_STRING,
|
||||
name, desc);
|
||||
name, desc, lockmode);
|
||||
newoption->validate_cb = validator;
|
||||
if (default_val)
|
||||
{
|
||||
|
@ -247,13 +247,16 @@ typedef struct
|
||||
|
||||
extern relopt_kind add_reloption_kind(void);
|
||||
extern void add_bool_reloption(bits32 kinds, const char *name, const char *desc,
|
||||
bool default_val);
|
||||
bool default_val, LOCKMODE lockmode);
|
||||
extern void add_int_reloption(bits32 kinds, const char *name, const char *desc,
|
||||
int default_val, int min_val, int max_val);
|
||||
int default_val, int min_val, int max_val,
|
||||
LOCKMODE lockmode);
|
||||
extern void add_real_reloption(bits32 kinds, const char *name, const char *desc,
|
||||
double default_val, double min_val, double max_val);
|
||||
double default_val, double min_val, double max_val,
|
||||
LOCKMODE lockmode);
|
||||
extern void add_string_reloption(bits32 kinds, const char *name, const char *desc,
|
||||
const char *default_val, validate_string_relopt validator);
|
||||
const char *default_val, validate_string_relopt validator,
|
||||
LOCKMODE lockmode);
|
||||
|
||||
extern Datum transformRelOptions(Datum oldOptions, List *defList,
|
||||
const char *namspace, char *validnsps[],
|
||||
|
Loading…
Reference in New Issue
Block a user