From 7f7f7c671ecc316174acb3529e192167fae636a2 Mon Sep 17 00:00:00 2001 From: Carlos Abalde Date: Thu, 18 Sep 2014 12:40:56 +0200 Subject: [PATCH] Added global_{get,set}_{int,string,real,duration}() functions --- README | 9 +++++- src/tests/test02.vtc | 50 ++++++++++++++++++++++++++++ src/vmod_var.c | 77 ++++++++++++++++++++++++++++++++++++++++++-- src/vmod_var.vcc | 9 ++++++ 4 files changed, 142 insertions(+), 3 deletions(-) diff --git a/README b/README index 1f1103d..e8769eb 100644 --- a/README +++ b/README @@ -11,21 +11,28 @@ Prototype, most should be self-explaining: Function VOID set(STRING, STRING) Function STRING get(STRING) - Function VOID global_set(STRING, STRING) Function STRING global_get(STRING) Function VOID set_int(STRING, INT) Function INT get_int(STRING) +Function VOID global_set_int(STRING, INT) +Function INT global_get_int(STRING) Function VOID set_string(STRING, STRING) Function STRING get_string(STRING) +Function VOID global_set_string(STRING, STRING) +Function STRING global_get_string(STRING) Function VOID set_real(STRING, REAL) Function REAL get_real(STRING) +Function VOID global_set_real(STRING, REAL) +Function REAL global_get_real(STRING) Function VOID set_duration(STRING, DURATION) Function DURATION get_duration(STRING) +Function VOID global_set_duration(STRING, DURATION) +Function DURATION global_get_duration(STRING) Function VOID clear() diff --git a/src/tests/test02.vtc b/src/tests/test02.vtc index ff3e6ae..faf2dbd 100644 --- a/src/tests/test02.vtc +++ b/src/tests/test02.vtc @@ -12,11 +12,44 @@ varnish v1 -vcl+backend { var.global_set("foo", "fooval"); var.global_set("bar", "barval"); var.global_set("bar", "altered_barval"); + + var.global_set_int("foo-int", 10); + var.global_set_int("bar-int", 20); + var.global_set_int("bar-int", 30); + + var.global_set_string("foo-string", "fooval"); + var.global_set_string("bar-string", "barval"); + var.global_set_string("bar-string", "altered_barval"); + + var.global_set_real("foo-real", 10); + var.global_set_real("bar-real", 20); + var.global_set_real("bar-real", 30); + + var.global_set_duration("foo-duration", 10m); + var.global_set_duration("bar-duration", 20m); + var.global_set_duration("bar-duration", 30m); } sub vcl_deliver { set resp.http.x-foo = var.global_get("foo"); set resp.http.x-bar = var.global_get("bar"); + + set resp.http.x-foo-int = var.global_get_int("foo-int"); + set resp.http.x-bar-int = var.global_get_int("bar-int"); + + set resp.http.x-foo-string = var.global_get_string("foo-string"); + set resp.http.x-bar-string = var.global_get_string("bar-string"); + + set resp.http.x-foo-real = var.global_get_real("foo-real"); + set resp.http.x-bar-real = var.global_get_real("bar-real"); + + set resp.http.x-foo-duration = var.global_get_duration("foo-duration"); + set resp.http.x-bar-duration = var.global_get_duration("bar-duration"); + + set resp.http.x-bad-int = var.global_get_int("foo-string"); + set resp.http.x-bad-string = var.global_get_string("foo-real"); + set resp.http.x-bad-real = var.global_get_real("foo-duration"); + set resp.http.x-bad-duration = var.global_get_duration("foo-int"); } } -start @@ -25,4 +58,21 @@ client c1 { rxresp expect resp.http.x-foo == "fooval" expect resp.http.x-bar == "altered_barval" + + expect resp.http.x-foo-int == "10" + expect resp.http.x-bar-int == "30" + + expect resp.http.x-foo-string == "fooval" + expect resp.http.x-bar-string == "altered_barval" + + expect resp.http.x-foo-real == "10.000" + expect resp.http.x-bar-real == "30.000" + + expect resp.http.x-foo-duration == "600.000" + expect resp.http.x-bar-duration == "1800.000" + + expect resp.http.x-bad-int == "0" + expect resp.http.x-bad-string == "" + expect resp.http.x-bad-real == "0.000" + expect resp.http.x-bad-duration == "0.000" } -run diff --git a/src/vmod_var.c b/src/vmod_var.c index 89e18fb..bee136c 100644 --- a/src/vmod_var.c +++ b/src/vmod_var.c @@ -240,6 +240,18 @@ void vmod_clear(struct sess *sp) void vmod_global_set(struct sess *sp, const char *name, const char *value) +{ + vmod_global_set_string(sp, name, value); +} + +const char * +vmod_global_get(struct sess *sp, const char *name) +{ + return vmod_global_get_string(sp, name); +} + +void +vmod_global_set_string(struct sess *sp, const char *name, const char *value) { struct var *v; @@ -274,7 +286,7 @@ vmod_global_set(struct sess *sp, const char *name, const char *value) } const char * -vmod_global_get(struct sess *sp, const char *name) +vmod_global_get_string(struct sess *sp, const char *name) { struct var *v; const char *r = NULL; @@ -286,10 +298,71 @@ vmod_global_get(struct sess *sp, const char *name) if (strcmp(v->name, name) == 0) break; } - if (v && v->value.STRING != NULL) { + if (v && v->type == STRING && v->value.STRING != NULL) { r = WS_Dup(sp->ws, v->value.STRING); AN(r); } AZ(pthread_mutex_unlock(&var_list_mtx)); return (r); } + +#define VMOD_GLOBAL_SET_X(vcl_type_u, vcl_type_l, ctype) \ +void \ +vmod_global_set_##vcl_type_l(struct sess *sp, const char *name, ctype value) \ +{ \ + struct var *v; \ +\ + if (name == NULL) \ + return; \ +\ + AZ(pthread_mutex_lock(&var_list_mtx)); \ + VTAILQ_FOREACH(v, &global_vars, list) { \ + CHECK_OBJ_NOTNULL(v, VAR_MAGIC); \ + AN(v->name); \ + if (strcmp(v->name, name) == 0) \ + break; \ + } \ + if (v) { \ + VTAILQ_REMOVE(&global_vars, v, list); \ + free(v->name); \ + v->name = NULL; \ + } else \ + ALLOC_OBJ(v, VAR_MAGIC); \ + AN(v); \ + v->name = strdup(name); \ + AN(v->name); \ + VTAILQ_INSERT_HEAD(&global_vars, v, list); \ + v->type = vcl_type_u; \ + v->value.vcl_type_u = value; \ +\ + AZ(pthread_mutex_unlock(&var_list_mtx)); \ +} + +VMOD_GLOBAL_SET_X(INT, int, int) +VMOD_GLOBAL_SET_X(REAL, real, double) +VMOD_GLOBAL_SET_X(DURATION, duration, double) + +#define VMOD_GLOBAL_GET_X(vcl_type_u, vcl_type_l, ctype) \ +ctype \ +vmod_global_get_##vcl_type_l(struct sess *sp, const char *name) \ +{ \ + struct var *v; \ + ctype r = 0; \ +\ + AZ(pthread_mutex_lock(&var_list_mtx)); \ + VTAILQ_FOREACH(v, &global_vars, list) { \ + CHECK_OBJ_NOTNULL(v, VAR_MAGIC); \ + AN(v->name); \ + if (strcmp(v->name, name) == 0) \ + break; \ + } \ + if (v && v->type == vcl_type_u) { \ + r = v->value.vcl_type_u; \ + } \ + AZ(pthread_mutex_unlock(&var_list_mtx)); \ + return (r); \ +} + +VMOD_GLOBAL_GET_X(INT, int, int) +VMOD_GLOBAL_GET_X(REAL, real, double) +VMOD_GLOBAL_GET_X(DURATION, duration, double) diff --git a/src/vmod_var.vcc b/src/vmod_var.vcc index 1b0e0db..4910ea6 100644 --- a/src/vmod_var.vcc +++ b/src/vmod_var.vcc @@ -16,3 +16,12 @@ Function REAL get_real(STRING) Function VOID set_duration(STRING, DURATION) Function DURATION get_duration(STRING) Function VOID clear() + +Function VOID global_set_int(STRING, INT) +Function INT global_get_int(STRING) +Function VOID global_set_string(STRING, STRING) +Function STRING global_get_string(STRING) +Function VOID global_set_real(STRING, REAL) +Function REAL global_get_real(STRING) +Function VOID global_set_duration(STRING, DURATION) +Function DURATION global_get_duration(STRING)