diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | configure.ac | 17 | ||||
-rw-r--r-- | src/Makefile.am | 28 | ||||
-rw-r--r-- | src/vmod_dbrw.c | 39 | ||||
-rw-r--r-- | src/vmod_dbrw.vcc | 26 |
5 files changed, 75 insertions, 39 deletions
@@ -5,9 +5,9 @@ See the end of file for copying conditions. Please send vmod-dbrw bug reports to <gray@gnu.org> -Version 1.0.91-vcl4, (git) +Version 1.9.90, (git) -Rewritten for Varnish v4.x +Builds for both Varnish v3.x and v4.x Version 1.0, 2013-07-20 diff --git a/configure.ac b/configure.ac index e1c55eb..ce9087c 100644 --- a/configure.ac +++ b/configure.ac @@ -14,7 +14,7 @@ # You should have received a copy of the GNU General Public License # along with vmod-dbrw. If not, see <http://www.gnu.org/licenses/>. AC_PREREQ(2.69) -AC_INIT([vmod-dbrw], 1.0.91-vcl4, [gray@gnu.org]) +AC_INIT([vmod-dbrw], 1.9.90, [gray@gnu.org]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR(src/vmod_dbrw.vcc) @@ -64,10 +64,17 @@ case "$VARNISHSRC" in esac VARNISHSRC=`cd $VARNISHSRC && pwd` -AC_CHECK_FILE([$VARNISHSRC/include/vapi/vsm.h], - [], - [AC_MSG_FAILURE(["$VARNISHSRC" is not a Varnish source directory])]) - +VARNISHVERSION= +AC_CHECK_FILE([$VARNISHSRC/include/varnishapi.h], + [VARNISHVERSION=3], + [AC_CHECK_FILE([$VARNISHSRC/include/vapi/vsm.h], + [VARNISHVERSION=4], + [AC_MSG_FAILURE(["$VARNISHSRC" is not a Varnish source directory])]) ]) + +AC_DEFINE_UNQUOTED([VARNISHVERSION],$VARNISHVERSION,[Varnish major version number]) +AM_CONDITIONAL([VARNISH3],[test $VARNISHVERSION -eq 3]) +AM_CONDITIONAL([VARNISH4],[test $VARNISHVERSION -eq 4]) + # Check that varnishtest is built in the varnish source directory AC_CHECK_FILE([$VARNISHSRC/bin/varnishtest/varnishtest], [], diff --git a/src/Makefile.am b/src/Makefile.am index dde9116..f7a5a45 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -26,9 +26,11 @@ libvmod_dbrw_la_SOURCES = \ dbrw.h\ sql.c\ vmod_dbrw.c\ - vcc_if.c vcc_if.h\ wordsplit.h\ wordsplit.c +nodist_libvmod_dbrw_la_SOURCES = vcc_if.c vcc_if.h + +vmod_dbrw.lo: vcc_if.h if USE_MYSQL libvmod_dbrw_la_SOURCES += mysql.c @@ -38,16 +40,28 @@ if USE_PGSQL libvmod_dbrw_la_SOURCES += pgsql.c endif -BUILT_SOURCES = vcc_if.c vcc_if.h +CLEANFILES = vcc_if.c vcc_if.h *.rst + +if VARNISH4 + vmodtool = $(VARNISHSRC)/lib/libvcc/vmodtool.py + vmodtoolargs = --strict + vccfile = $(top_srcdir)/src/vmod_dbrw.vcc +else + vmodtool = $(VARNISHSRC)/lib/libvmod_std/vmod.py + vmodtoolargs = + vccfile = vmod_dbrw.vcc3 + +vmod_dbrw.vcc3: $(top_srcdir)/src/vmod_dbrw.vcc + CLEANFILES += vmod_dbrw.vcc3 +endif -vmodtool = $(VARNISHSRC)/lib/libvcc/vmodtool.py -vmodtoolargs = --strict +.vcc.vcc3: + sed -n '/^\$$/{s///;s/\(Module *[^ ][^ ]*\).*/\1/;p}' $< > $@ -vcc_if.c vcc_if.h: $(vmodtool) $(top_srcdir)/src/vmod_dbrw.vcc - @PYTHON@ $(vmodtool) $(vmodtoolargs) $(top_srcdir)/src/vmod_dbrw.vcc +vcc_if.c vcc_if.h: $(vmodtool) $(vccfile) + @PYTHON@ $(vmodtool) $(vmodtoolargs) $(vccfile) EXTRA_DIST = \ vmod_dbrw.vcc -CLEANFILES = $(builddir)/vcc_if.c $(builddir)/vcc_if.h diff --git a/src/vmod_dbrw.c b/src/vmod_dbrw.c index 284376f..9db6a0b 100644 --- a/src/vmod_dbrw.c +++ b/src/vmod_dbrw.c @@ -20,7 +20,18 @@ #include "vrt.h" #include "vcc_if.h" #include "pthread.h" -#include "bin/varnishd/cache/cache.h" +#if VARNISHVERSION == 3 +# include "bin/varnishd/cache.h" +# define VCL_VOID void +# define VCL_STRING const char * +# define WS_Copy(w,s,l) WS_Dup(w,l) +# define DBRW_CTX struct sess * +# define WSPTR(s) ((s)->wrk->ws) +#else +# include "bin/varnishd/cache/cache.h" +# define DBRW_CTX const struct vrt_ctx * +# define WSPTR(s) ((s)->ws) +#endif static pthread_once_t thread_once = PTHREAD_ONCE_INIT; static pthread_key_t thread_key; @@ -204,7 +215,7 @@ parse_flags(const char *arg, int *qdisp, int *flags, char status[]) QUERY - Query to obtain the redirection target */ VCL_VOID -vmod_config(const struct vrt_ctx *ctx, struct vmod_priv *priv, +vmod_config(DBRW_CTX ctx, struct vmod_priv *priv, VCL_STRING bkname, VCL_STRING param, VCL_STRING query) { char *s; @@ -261,18 +272,18 @@ vmod_config(const struct vrt_ctx *ctx, struct vmod_priv *priv, } static char * -expand_backref(const struct vrt_ctx *ctx, const char *str, const char *val, +expand_backref(DBRW_CTX ctx, const char *str, const char *val, size_t matchcount, regmatch_t *matches, char *qry) { unsigned u; char *b, *p; - u = WS_Reserve(ctx->ws, 0); - p = b = ctx->ws->f; + u = WS_Reserve(WSPTR(ctx), 0); + p = b = WSPTR(ctx)->f; while (*val) { if (u == 0) { - WS_Release(ctx->ws, 0); + WS_Release(WSPTR(ctx), 0); return NULL; } if (*val == '\\' || *val == '$') { @@ -285,7 +296,7 @@ expand_backref(const struct vrt_ctx *ctx, const char *str, const char *val, matches[n].rm_so; if (len > u) { - WS_Release(ctx->ws, 0); + WS_Release(WSPTR(ctx), 0); return NULL; } @@ -311,7 +322,7 @@ expand_backref(const struct vrt_ctx *ctx, const char *str, const char *val, if (qry) { size_t len = strlen(qry); if (len + 1 >= u) { - WS_Release(ctx->ws, 0); + WS_Release(WSPTR(ctx), 0); return NULL; } if (strchr(b, '?')) @@ -324,12 +335,12 @@ expand_backref(const struct vrt_ctx *ctx, const char *str, const char *val, } if (u == 0) { - WS_Release(ctx->ws, 0); + WS_Release(WSPTR(ctx), 0); return NULL; } *p = 0; - WS_ReleaseP(ctx->ws, p); + WS_ReleaseP(WSPTR(ctx), p); return b; } @@ -337,7 +348,7 @@ expand_backref(const struct vrt_ctx *ctx, const char *str, const char *val, #define ISEMPTY(s) ((s) == NULL || (s)[0] == 0) static char * -findmatch(const struct vrt_ctx *ctx, struct dbrw_connection *conn, char **param) +findmatch(DBRW_CTX ctx, struct dbrw_connection *conn, char **param) { unsigned i; unsigned nt, nf; @@ -354,7 +365,7 @@ findmatch(const struct vrt_ctx *ctx, struct dbrw_connection *conn, char **param) debug(conn->conf, 2, ("query returned %u tuples, %u columns", nt, nf)); if (nf < 3) - return WS_Copy(ctx->ws, sql_get_column(conn, 0, 0), -1); + return WS_Copy(WSPTR(ctx), sql_get_column(conn, 0, 0), -1); /* Three or four fields: result @@ -376,7 +387,7 @@ findmatch(const struct vrt_ctx *ctx, struct dbrw_connection *conn, char **param) char *qry = NULL; if (ISEMPTY(pat)) { - res = WS_Copy(ctx->ws, sql_get_column(conn, i, 0), -1); + res = WS_Copy(WSPTR(ctx), sql_get_column(conn, i, 0), -1); break; } @@ -498,7 +509,7 @@ get_connection(struct dbrw_config *conf) } VCL_STRING -vmod_rewrite(const struct vrt_ctx *ctx, struct vmod_priv *priv, VCL_STRING arg) +vmod_rewrite(DBRW_CTX ctx, struct vmod_priv *priv, VCL_STRING arg) { struct dbrw_config *conf = priv->priv; struct dbrw_connection *cp; diff --git a/src/vmod_dbrw.vcc b/src/vmod_dbrw.vcc index a2ec9d2..10fef6f 100644 --- a/src/vmod_dbrw.vcc +++ b/src/vmod_dbrw.vcc @@ -31,27 +31,31 @@ $Init dbrw_init $Function VOID config(PRIV_VCL, STRING, STRING, STRING) Description - Configures the module and provides it with the data - necessary to connect and use the database. It is normally called - from the **vcl_init** subroutine. + Configures the module and provides it with the data + necessary to connect and use the database. It is normally called + from the **vcl_init** subroutine. Example - dbrw.config("mysql", - "database=rewrite;user=varnish;password=guessme", - {"SELECT dest - FROM redirects - WHERE host='$host' - AND url='$url'"}); + :: + + dbrw.config("mysql", + "database=rewrite;user=varnish;password=guessme", + {"SELECT dest + FROM redirects + WHERE host='$host' + AND url='$url'"}); $Function STRING rewrite(PRIV_VCL, STRING) Description Rewrites its argument using the database configured in the previous - call to `**config** and returns the obtained value. + call to **config** and returns the obtained value. Example - set req.http.X-Redirect-To = + :: + + set req.http.X-Redirect-To = dbrw.rewrite("host=" + req.http.Host + ";" + "url=" + req.url); |