mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-26 21:31:01 +01:00
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:
parent
3667e514d9
commit
888863534c
@ -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
|
||||
|
||||
@ -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 *);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
12
src/map.c
12
src/map.c
@ -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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user