11
11
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
12
12
* Portions Copyright (c) 1994, Regents of the University of California
13
13
*
14
- * $PostgreSQL: pgsql/src/include/access/reloptions.h,v 1.8 2009/01/06 14:47:37 alvherre Exp $
14
+ * $PostgreSQL: pgsql/src/include/access/reloptions.h,v 1.9 2009/01/08 19:34:41 alvherre Exp $
15
15
*
16
16
*-------------------------------------------------------------------------
17
17
*/
@@ -90,11 +90,14 @@ typedef struct relopt_real
90
90
double max ;
91
91
} relopt_real ;
92
92
93
+ typedef void (* validate_string_relopt ) (char * value , bool validate );
94
+
93
95
typedef struct relopt_string
94
96
{
95
97
relopt_gen gen ;
96
98
int default_len ;
97
99
bool default_isnull ;
100
+ validate_string_relopt validate_cb ;
98
101
char default_val [1 ]; /* variable length */
99
102
} relopt_string ;
100
103
@@ -113,7 +116,7 @@ typedef struct relopt_string
113
116
* need this information.
114
117
*/
115
118
#define HAVE_RELOPTION (optname , option ) \
116
- (pg_strncasecmp(option.gen->name, optname, option.gen->namelen) == 0)
119
+ (pg_strncasecmp(option.gen->name, optname, option.gen->namelen + 1 ) == 0)
117
120
118
121
#define HANDLE_INT_RELOPTION (optname , var , option , wasset ) \
119
122
do { \
@@ -141,7 +144,7 @@ typedef struct relopt_string
141
144
} \
142
145
} while (0)
143
146
144
- #define HANDLE_REAL_RELOPTION (optname , var , option , wasset ) \
147
+ #define HANDLE_REAL_RELOPTION (optname , var , option , wasset ) \
145
148
do { \
146
149
if (HAVE_RELOPTION(optname, option)) \
147
150
{ \
@@ -166,30 +169,48 @@ typedef struct relopt_string
166
169
* string options have been processed.
167
170
*/
168
171
#define HANDLE_STRING_RELOPTION (optname , var , option , base , offset , wasset ) \
169
- do { \
172
+ do { \
170
173
if (HAVE_RELOPTION(optname, option)) \
171
174
{ \
172
175
relopt_string *optstring = (relopt_string *) option.gen;\
173
- char *string_val = NULL; \
174
- \
176
+ char *string_val; \
175
177
if (option.isset) \
176
178
string_val = option.values.string_val; \
177
179
else if (!optstring->default_isnull) \
178
180
string_val = optstring->default_val; \
181
+ else \
182
+ string_val = NULL; \
179
183
(wasset) != NULL ? *(wasset) = option.isset : (dummyret) NULL; \
180
- \
181
- if (!string_val) \
184
+ if (string_val == NULL) \
182
185
var = 0; \
183
186
else \
184
187
{ \
185
- strcpy((char *)(base) + (offset), string_val); \
188
+ strcpy((( char *)(base)) + (offset), string_val); \
186
189
var = (offset); \
187
190
(offset) += strlen(string_val) + 1; \
188
191
} \
189
192
continue; \
190
193
} \
191
194
} while (0)
192
195
196
+ /*
197
+ * For use during amoptions: get the strlen of a string option
198
+ * (either default or the user defined value)
199
+ */
200
+ #define GET_STRING_RELOPTION_LEN (option ) \
201
+ ((option).isset ? strlen((option).values.string_val) : \
202
+ ((relopt_string *) (option).gen)->default_len)
203
+
204
+ /*
205
+ * For use by code reading options already parsed: get a pointer to the string
206
+ * value itself. "optstruct" is the StdRdOption struct or equivalent, "member"
207
+ * is the struct member corresponding to the string option
208
+ */
209
+ #define GET_STRING_RELOPTION (optstruct , member ) \
210
+ ((optstruct)->member == 0 ? NULL : \
211
+ (char *)(optstruct) + (optstruct)->member)
212
+
213
+
193
214
extern int add_reloption_kind (void );
194
215
extern void add_bool_reloption (int kind , char * name , char * desc ,
195
216
bool default_val );
@@ -198,7 +219,7 @@ extern void add_int_reloption(int kind, char *name, char *desc,
198
219
extern void add_real_reloption (int kind , char * name , char * desc ,
199
220
double default_val , double min_val , double max_val );
200
221
extern void add_string_reloption (int kind , char * name , char * desc ,
201
- char * default_val );
222
+ char * default_val , validate_string_relopt validator );
202
223
203
224
extern Datum transformRelOptions (Datum oldOptions , List * defList ,
204
225
bool ignoreOids , bool isReset );
0 commit comments