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 );