mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 06:11:32 +02:00
MINOR: pattern: implement pat_ref_load() to load a pattern at a given generation
pat_ref_load() basically combines pat_ref_append() and pat_ref_commit(). It's very similar to pat_ref_add() except that it also allows to set the generation ID and the line number. pat_ref_add() was modified to directly rely on it to avoid code duplication. Note that a previous declaration of pat_ref_load() was removed as it was just a leftover of an earlier incarnation of something possibly similar, so no existing functionality was changed here.
This commit is contained in:
parent
0439e5eeb4
commit
1a6857b9c1
@ -182,6 +182,7 @@ struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned
|
|||||||
struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
|
struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
|
||||||
struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key);
|
struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key);
|
||||||
struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, const char *sample, int line);
|
struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, const char *sample, int line);
|
||||||
|
struct pat_ref_elt *pat_ref_load(struct pat_ref *ref, unsigned int gen, const char *pattern, const char *sample, int line, char **err);
|
||||||
int pat_ref_push(struct pat_ref_elt *elt, struct pattern_expr *expr, int patflags, char **err);
|
int pat_ref_push(struct pat_ref_elt *elt, struct pattern_expr *expr, int patflags, char **err);
|
||||||
int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
|
int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
|
||||||
int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
|
int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
|
||||||
@ -190,7 +191,6 @@ int pat_ref_delete(struct pat_ref *ref, const char *key);
|
|||||||
void pat_ref_delete_by_ptr(struct pat_ref *ref, struct pat_ref_elt *elt);
|
void pat_ref_delete_by_ptr(struct pat_ref *ref, struct pat_ref_elt *elt);
|
||||||
int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt);
|
int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt);
|
||||||
int pat_ref_prune(struct pat_ref *ref);
|
int pat_ref_prune(struct pat_ref *ref);
|
||||||
int pat_ref_load(struct pat_ref *ref, struct pattern_expr *expr, int patflags, int soe, char **err);
|
|
||||||
int pat_ref_commit(struct pat_ref *ref, struct pat_ref_elt *elt, char **err);
|
int pat_ref_commit(struct pat_ref *ref, struct pat_ref_elt *elt, char **err);
|
||||||
void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace);
|
void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace);
|
||||||
|
|
||||||
|
@ -1945,6 +1945,32 @@ int pat_ref_commit(struct pat_ref *ref, struct pat_ref_elt *elt, char **err)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Loads <pattern>:<sample> into <ref> for generation <gen>. <sample> may be
|
||||||
|
* NULL if none exists (e.g. ACL). If not needed, the generation number should
|
||||||
|
* be set to ref->curr_gen. The error pointer must initially point to NULL. The
|
||||||
|
* new entry will be propagated to all use places, involving allocation, parsing
|
||||||
|
* and indexing. On error (parsing, allocation), the operation will be rolled
|
||||||
|
* back, an error may be reported, and NULL will be reported. On success, the
|
||||||
|
* freshly allocated element will be returned. The PATREF lock on <ref> must be
|
||||||
|
* held during the operation.
|
||||||
|
*/
|
||||||
|
struct pat_ref_elt *pat_ref_load(struct pat_ref *ref, unsigned int gen,
|
||||||
|
const char *pattern, const char *sample,
|
||||||
|
int line, char **err)
|
||||||
|
{
|
||||||
|
struct pat_ref_elt *elt;
|
||||||
|
|
||||||
|
elt = pat_ref_append(ref, pattern, sample, line);
|
||||||
|
if (elt) {
|
||||||
|
elt->gen_id = gen;
|
||||||
|
if (!pat_ref_commit(ref, elt, err))
|
||||||
|
elt = NULL;
|
||||||
|
} else
|
||||||
|
memprintf(err, "out of memory error");
|
||||||
|
|
||||||
|
return elt;
|
||||||
|
}
|
||||||
|
|
||||||
/* This function adds entry to <ref>. It can fail on memory error. The new
|
/* This function adds entry to <ref>. It can fail on memory error. The new
|
||||||
* entry is added at all the pattern_expr registered in this reference. The
|
* entry is added at all the pattern_expr registered in this reference. The
|
||||||
* function stops on the first error encountered. It returns 0 and <err> is
|
* function stops on the first error encountered. It returns 0 and <err> is
|
||||||
@ -1955,14 +1981,7 @@ int pat_ref_add(struct pat_ref *ref,
|
|||||||
const char *pattern, const char *sample,
|
const char *pattern, const char *sample,
|
||||||
char **err)
|
char **err)
|
||||||
{
|
{
|
||||||
struct pat_ref_elt *elt;
|
return !!pat_ref_load(ref, ref->curr_gen, pattern, sample, -1, err);
|
||||||
|
|
||||||
elt = pat_ref_append(ref, pattern, sample, -1);
|
|
||||||
if (!elt) {
|
|
||||||
memprintf(err, "out of memory error");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return pat_ref_commit(ref, elt, err);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function prunes <ref>, replaces all references by the references
|
/* This function prunes <ref>, replaces all references by the references
|
||||||
|
Loading…
x
Reference in New Issue
Block a user