[master] 18f5b8b Add '==' operator to query language
Martin Blix Grydeland
martin at varnish-cache.org
Tue Oct 1 14:48:18 CEST 2013
commit 18f5b8b6cea1e8d82dce84df1650676727cd3bb1
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date: Thu Sep 19 15:01:06 2013 +0200
Add '==' operator to query language
diff --git a/bin/varnishtest/tests/l00001.vtc b/bin/varnishtest/tests/l00001.vtc
index 4709acb..427435a 100644
--- a/bin/varnishtest/tests/l00001.vtc
+++ b/bin/varnishtest/tests/l00001.vtc
@@ -17,14 +17,22 @@ client c1 {
} -run
# Test 'eq' operator
-logexpect l1 -d 1 -g request -q "Begin eq 'req 1000'" {
- expect * * Begin
+logexpect l1 -d 1 -g vxid -q "Begin eq 'req 1000'" {
+ expect * * Begin req
expect * = ReqEnd
+ expect * = End
} -run
# Test 'ne' operator
-logexpect l1 -d 1 -g request -q "ReqProtocol ne 'HTTP/1.0'" {
- expect * * Begin
+logexpect l1 -d 1 -g vxid -q "ReqProtocol ne 'HTTP/1.0'" {
+ expect * * Begin req
expect * = ReqEnd
+ expect * = End
} -run
+# Test '==' operator
+logexpect l1 -d 1 -g vxid -q "RespStatus == 200" {
+ expect * * Begin req
+ expect * = ReqEnd
+ expect * = End
+} -run
diff --git a/lib/libvarnishapi/vsl_query.c b/lib/libvarnishapi/vsl_query.c
index de6d43b..937d21f 100644
--- a/lib/libvarnishapi/vsl_query.c
+++ b/lib/libvarnishapi/vsl_query.c
@@ -33,6 +33,7 @@
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
+#include <ctype.h>
#include "vas.h"
#include "miniobj.h"
@@ -58,6 +59,8 @@ vslq_test_rec(const struct vex *vex, const struct VSLC_ptr *rec)
const struct vex_val *val;
int reclen;
const char *recdata;
+ long long recint;
+ char *endptr;
AN(vex);
AN(rec);
@@ -67,17 +70,49 @@ vslq_test_rec(const struct vex *vex, const struct VSLC_ptr *rec)
reclen = VSL_LEN(rec->ptr);
recdata = VSL_CDATA(rec->ptr);
+ /* Prepare */
switch (vex->tok) {
+ case T_EQ: /* == */
+ case T_NEQ: /* != */
+ case '<':
+ case '>':
+ case T_LEQ: /* <= */
+ case T_GEQ: /* >= */
+ /* Numerical comparison */
+ switch (val->type) {
+ case VEX_INT:
+ recint = strtoll(recdata, &endptr, 0);
+ if (*endptr == '\0' || isspace(*endptr))
+ break;
+ /* Can't parse - no match */
+ return (0);
+ default:
+ INCOMPL();
+ }
+ break;
+ }
+
+ /* Compare */
+ switch (vex->tok) {
+ case T_EQ: /* == */
+ switch (val->type) {
+ case VEX_INT:
+ if (val->val_int == recint)
+ return (1);
+ return (0);
+ default:
+ INCOMPL();
+ }
case T_SEQ: /* eq */
- assert(vex->val->type == VEX_STRING);
- if (reclen == val->val_stringlen &&
- !strncmp(vex->val->val_string, recdata, reclen))
+ assert(val->type == VEX_STRING);
+ if (reclen == val->val_stringlen + 1 &&
+ !strncmp(val->val_string, recdata, reclen))
return (1);
return (0);
case T_SNEQ: /* ne */
- assert(vex->val->type == VEX_STRING);
- if (reclen != val->val_stringlen ||
- strncmp(vex->val->val_string, recdata, reclen))
+ assert(val->type == VEX_STRING);
+ if (reclen != val->val_stringlen + 1 ||
+ strncmp(val->val_string, recdata, reclen))
return (1);
return (0);
default:
@@ -96,7 +131,6 @@ vslq_test(const struct vex *vex, struct VSL_transaction * const ptrans[])
CHECK_OBJ_NOTNULL(vex, VEX_MAGIC);
CHECK_OBJ_NOTNULL(vex->tag, VEX_TAG_MAGIC);
CHECK_OBJ_NOTNULL(vex->val, VEX_VAL_MAGIC);
- AN(vex->val->val_string);
for (t = ptrans[0]; t != NULL; t = *++ptrans) {
AZ(VSL_ResetCursor(t->c));
More information about the varnish-commit
mailing list