1111 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
1212 * Portions Copyright (c) 1994, Regents of the University of California
1313 *
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 $
1515 *
1616 *-------------------------------------------------------------------------
1717 */
@@ -90,11 +90,14 @@ typedef struct relopt_real
9090 double max ;
9191} relopt_real ;
9292
93+ typedef void (* validate_string_relopt ) (char * value , bool validate );
94+
9395typedef struct relopt_string
9496{
9597 relopt_gen gen ;
9698 int default_len ;
9799 bool default_isnull ;
100+ validate_string_relopt validate_cb ;
98101 char default_val [1 ]; /* variable length */
99102} relopt_string ;
100103
@@ -113,7 +116,7 @@ typedef struct relopt_string
113116 * need this information.
114117 */
115118#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)
117120
118121#define HANDLE_INT_RELOPTION (optname , var , option , wasset ) \
119122 do { \
@@ -141,7 +144,7 @@ typedef struct relopt_string
141144 } \
142145 } while (0)
143146
144- #define HANDLE_REAL_RELOPTION (optname , var , option , wasset ) \
147+ #define HANDLE_REAL_RELOPTION (optname , var , option , wasset ) \
145148 do { \
146149 if (HAVE_RELOPTION(optname, option)) \
147150 { \
@@ -166,30 +169,48 @@ typedef struct relopt_string
166169 * string options have been processed.
167170 */
168171#define HANDLE_STRING_RELOPTION (optname , var , option , base , offset , wasset ) \
169- do { \
172+ do { \
170173 if (HAVE_RELOPTION(optname, option)) \
171174 { \
172175 relopt_string *optstring = (relopt_string *) option.gen;\
173- char *string_val = NULL; \
174- \
176+ char *string_val; \
175177 if (option.isset) \
176178 string_val = option.values.string_val; \
177179 else if (!optstring->default_isnull) \
178180 string_val = optstring->default_val; \
181+ else \
182+ string_val = NULL; \
179183 (wasset) != NULL ? *(wasset) = option.isset : (dummyret) NULL; \
180- \
181- if (!string_val) \
184+ if (string_val == NULL) \
182185 var = 0; \
183186 else \
184187 { \
185- strcpy((char *)(base) + (offset), string_val); \
188+ strcpy((( char *)(base)) + (offset), string_val); \
186189 var = (offset); \
187190 (offset) += strlen(string_val) + 1; \
188191 } \
189192 continue; \
190193 } \
191194 } while (0)
192195
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+
193214extern int add_reloption_kind (void );
194215extern void add_bool_reloption (int kind , char * name , char * desc ,
195216 bool default_val );
@@ -198,7 +219,7 @@ extern void add_int_reloption(int kind, char *name, char *desc,
198219extern void add_real_reloption (int kind , char * name , char * desc ,
199220 double default_val , double min_val , double max_val );
200221extern void add_string_reloption (int kind , char * name , char * desc ,
201- char * default_val );
222+ char * default_val , validate_string_relopt validator );
202223
203224extern Datum transformRelOptions (Datum oldOptions , List * defList ,
204225 bool ignoreOids , bool isReset );
0 commit comments