MINOR: map/pattern: The sample parser is stored in the pattern

We cannot separe the pattern and the value. Now, the patern known the
value and the pattern is able to parsehis associated sample staroage.
This commit is contained in:
Thierry FOURNIER 2014-01-15 15:17:23 +01:00 committed by Willy Tarreau
parent 3667e514d9
commit 888863534c
4 changed files with 9 additions and 10 deletions

View File

@ -57,8 +57,6 @@ struct map_descriptor {
struct list list; /* used for listing */
struct map_reference *ref; /* the reference used for unindexed entries */
struct sample_conv *conv; /* original converter descriptor */
int (*parse)(const char *text, /* The function that can parse the output value */
struct sample_storage *smp);
struct pattern_expr *pat; /* the pattern matching associated to the map */
int do_free; /* set if <pat> is the orignal pat and must be freed */
char *default_value; /* a copy of default value. This copy is

View File

@ -155,6 +155,7 @@ struct pattern_list {
*/
struct pattern_expr {
int (*parse)(const char *text, struct pattern *pattern, char **err);
int (*parse_smp)(const char *text, struct sample_storage *smp);
int (*index)(struct pattern_expr *, struct pattern *, char **);
void (*delete)(struct pattern_expr *, struct pattern *);
struct sample_storage **(*find_smp)(struct pattern_expr *, struct pattern *);

View File

@ -1613,7 +1613,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
stats_map_lookup_next(si)) {
smp = pattern_find_smp(args[3], appctx->ctx.map.desc->pat, NULL);
if (smp)
appctx->ctx.map.desc->parse(value, *smp);
appctx->ctx.map.desc->pat->parse_smp(value, *smp);
}
/* The set is done, send message. */
@ -1974,7 +1974,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
* is canceled for this 'descriptor', but continue, for
* the other descriptors.
*/
if (!appctx->ctx.map.desc->parse(ent->value, smp)) {
if (!appctx->ctx.map.desc->pat->parse_smp(ent->value, smp)) {
free(smp);
continue;
}

View File

@ -314,7 +314,7 @@ static int map_parse_and_index(struct map_descriptor *desc,
return 0;
/* first read and convert value */
if (!desc->parse(ent->value, smp)) {
if (!desc->pat->parse_smp(ent->value, smp)) {
memprintf(err, "parse value failed at line %d of file <%s>",
ent->line, desc->ref->reference);
return 0;
@ -384,10 +384,10 @@ static int sample_load_map(struct arg *arg, struct sample_conv *conv, char **err
/* check the output parse method */
switch (desc->conv->out_type) {
case SMP_T_STR: desc->parse = map_parse_str; break;
case SMP_T_UINT: desc->parse = map_parse_int; break;
case SMP_T_IPV4: desc->parse = map_parse_ip; break;
case SMP_T_IPV6: desc->parse = map_parse_ip6; break;
case SMP_T_STR: desc->pat->parse_smp = map_parse_str; break;
case SMP_T_UINT: desc->pat->parse_smp = map_parse_int; break;
case SMP_T_IPV4: desc->pat->parse_smp = map_parse_ip; break;
case SMP_T_IPV6: desc->pat->parse_smp = map_parse_ip6; break;
default:
memprintf(err, "map: internal haproxy error: no default parse case for the input type <%d>.",
conv->out_type);
@ -442,7 +442,7 @@ static int sample_load_map(struct arg *arg, struct sample_conv *conv, char **err
memprintf(err, "out of memory");
return 0;
}
if (!desc->parse(desc->default_value, desc->def)) {
if (!desc->pat->parse_smp(desc->default_value, desc->def)) {
memprintf(err, "Cannot parse default value");
return 0;
}