dav/davql.c

Thu, 22 Aug 2013 11:25:16 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 22 Aug 2013 11:25:16 +0200
changeset 28
4e46c65711ef
parent 27
e584c351b402
child 30
9a5a7a513a96
permissions
-rw-r--r--

added recursive put

17
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2013 Olaf Wintermann. All rights reserved.
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include <stdio.h>
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <stdlib.h>
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
31 #include <string.h>
17
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include "davql.h"
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include "methods.h"
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include "utils.h"
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 DavQuery dav_ql_parse(char *query, va_list ap) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 DavQuery davquery;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 davquery.command = DAV_QUERY_ERROR;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 davquery.command_data = NULL;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 sstr_t q = sstr(query);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 q = sstrtrim(q);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 // get query command
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 sstr_t cmd;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 cmd.ptr = NULL;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 int i;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 for(i=0;i<q.length;i++) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 if(q.ptr[i] == ' ') {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 cmd = sstrsubsl(q, 0, i);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 break;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 if(!cmd.ptr) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 fprintf(stderr, "DQL syntax error\n");
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 return davquery;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 cmd = sstrtrim(cmd);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 q = sstrtrim(sstrsubs(q, i));
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 if(!sstrcmp(cmd, S("get"))) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 davquery.command = DAV_QUERY_GET;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 davquery.command_data = dav_ql_parse_get(q, ap);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 return davquery;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 DavGetQuery* dav_ql_parse_get(sstr_t q, va_list ap) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 sstr_t property_query = q;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 q = util_getsubstr_until_token(q, S("from"), &property_query);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 sstr_t from_query = q;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 sstr_t cond = util_getsubstr_until_token(q, S("where"), &from_query);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 // insert variable values
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 UcxBuffer *fbuf = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 int var = 0;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 for(int i=0;i<from_query.length;i++) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 char c = from_query.ptr[i];
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 if(c == '%') {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 if(var) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 ucx_buffer_putc(fbuf, '%'); // previous '%'
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 } else {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 var = 1;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 } else if(var) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 switch(c) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 case 's': {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 char *arg = va_arg(ap, char*);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 ucx_buffer_puts(fbuf, arg);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 break;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 default: {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 ucx_buffer_putc(fbuf, '%');
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 ucx_buffer_putc(fbuf, c);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 var = 0;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 } else {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 ucx_buffer_putc(fbuf, c);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
105 // condition
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
106 DavQOp *condition = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
107 size_t oplen = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
108 if(cond.ptr) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
109 //printf("cond: {%.*s}\n", cond.length, cond.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
110 UcxList *ops = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
111 if(dav_parse_condition(&ops, cond, ap)) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
112 // TODO: error
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
113 printf("parse error\n");
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
114 return NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
115 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
116 oplen = ucx_list_size(ops);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
117 condition = calloc(sizeof(DavQOp), oplen);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
118 int l = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
119 UCX_FOREACH(elm, ops) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
120 condition[l] = *(DavQOp*)elm->data;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
121 free(elm->data);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
122 l++;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
123 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
124 ucx_list_free(ops);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
125 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
126
17
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 DavGetQuery *getquery = malloc(sizeof(DavGetQuery));
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 getquery->properties = sstrdup(property_query);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 getquery->from = sstrn(fbuf->space, fbuf->pos);
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
130 if(condition) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
131 getquery->condition = condition;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
132 getquery->condlen = oplen;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
133 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
134 getquery->condition = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
135 getquery->condlen = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
136 }
17
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
137 return getquery;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 void free_get_query(DavGetQuery *q) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141 free(q->from.ptr);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142 free(q->properties.ptr);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
143 free(q);
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146 int parse_path_query(sstr_t query, char **path, int *depth) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 if(query.length == 1) {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 if(query.ptr[0] == '/') {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 *path = sstrdup(query).ptr;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 *depth = 1;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 return 0;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152 } else {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 *path = NULL;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 return 1;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 if(query.ptr[query.length-1] == '*') {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 *depth = -1;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 *path = sstrdup(sstrsubsl(query, 0, query.length-1)).ptr;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161 } else {
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 *path = sstrdup(query).ptr;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 *depth = 1;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164 }
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 return 0;
11dffb40cd91 new dav_query function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 }
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
168
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
169 int dav_parse_condition(UcxList **ops, sstr_t cond, va_list ap) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
170 sstr_t token;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
171 DavQOp *op1 = NULL; // level 1 operator
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
172 DavQOp *op2 = NULL; // level 2 operator
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
173 DavQOp *op3 = NULL; // level 3 operator
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
174 while((token = condition_parser_next_token(&cond)).length > 0) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
175 //printf("token: {%.*s}[%d]\n", token.length, token.ptr, token.length);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
176 int64_t type = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
177 int tkop = condition_operator_type(token, &type);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
178 DavQOp *operation = malloc(sizeof(DavQOp));
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
179 if(tkop > 0) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
180 // operator token
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
181 operation->type = DAVQOP_OPERATOR;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
182 operation->val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
183 operation->intval = type;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
184 switch(tkop) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
185 case 1: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
186 // operators: + - / * not
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
187 // add operation after next non operator token
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
188 op1 = operation;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
189 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
190 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
191 case 2: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
192 // operators: < > == != <= >=
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
193 if(op2) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
194 *ops = ucx_list_append(*ops, op2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
195 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
196 op2 = operation;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
197 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
198 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
199 case 3: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
200 // operators: and or xor
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
201 if(op2) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
202 *ops = ucx_list_append(*ops, op2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
203 op2 = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
204 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
205 if(op3) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
206 *ops = ucx_list_append(*ops, op3);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
207 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
208 op3 = operation;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
209 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
210 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
211 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
212 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
213 if(token.ptr[0] == '"' || token.ptr[0] == '\'') {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
214 operation->type = DAVQOP_STRING;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
215 operation->val = token.ptr+1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
216 operation->intval = token.length-2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
217 } else if(!sstrcmp(token, S("true")) ||
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
218 !sstrcmp(token, S("false")))
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
219 {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
220 operation->type = DAVQOP_INTEGER;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
221 operation->val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
222 operation->intval = util_getboolean(token.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
223 } else if(token.length == 2 && token.ptr[0] == '%') {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
224 switch(token.ptr[1]) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
225 case 's': {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
226 char *arg = va_arg(ap, char*);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
227 operation->type = DAVQOP_STRING;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
228 operation->val = arg;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
229 operation->intval = strlen(arg);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
230 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
231 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
232 case 'd': {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
233 operation->type = DAVQOP_INTEGER;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
234 operation->val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
235 operation->intval = va_arg(ap, int);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
236 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
237 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
238 case 't': {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
239 operation->type = DAVQOP_INTEGER;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
240 operation->val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
241 operation->intval = va_arg(ap, time_t);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
242 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
243 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
244 default: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
245 operation->type = DAVQOP_STRING;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
246 operation->val = token.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
247 operation->intval = token.length;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
248 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
249 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
250 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
251 sstr_t d = sstrdup(token);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
252 char *end;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
253 int64_t val = strtoll(d.ptr, &end, 0);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
254 int intval = strlen(end) == 0 ? 1 : 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
255 free(d.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
256 if(intval) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
257 operation->type = DAVQOP_INTEGER;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
258 operation->val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
259 operation->intval = val;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
260 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
261 if(!sstrcmp(token, S("contentlength"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
262 operation->type = DAVQOP_RESPROP;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
263 } else if(!sstrcmp(token, S("lastmodified"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
264 operation->type = DAVQOP_RESPROP;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
265 } else if(!sstrcmp(token, S("creationdate"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
266 operation->type = DAVQOP_RESPROP;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
267 } else if(!sstrcmp(token, S("name"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
268 operation->type = DAVQOP_RESPROP;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
269 } else if(!sstrcmp(token, S("path"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
270 operation->type = DAVQOP_RESPROP;
28
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
271 } else if(!sstrcmp(token, S("iscollection"))) {
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
272 operation->type = DAVQOP_RESPROP;
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
273 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
274 operation->type = DAVQOP_PROPERTY;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
275 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
276 operation->val = token.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
277 operation->intval = token.length;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
278 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
279 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
280
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
281 // add operation
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
282 *ops = ucx_list_append(*ops, operation);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
283 if(op1) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
284 // add level 1 operator
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
285 *ops = ucx_list_append(*ops, op1);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
286 op1 = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
287 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
288 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
289 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
290 if(op1) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
291 *ops = ucx_list_append(*ops, op1);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
292 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
293 if(op2) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
294 *ops = ucx_list_append(*ops, op2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
295 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
296 if(op3) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
297 *ops = ucx_list_append(*ops, op3);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
298 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
299 return 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
300 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
301
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
302 sstr_t condition_parser_next_token(sstr_t *str) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
303 sstr_t s = *str;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
304 sstr_t t;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
305 t.ptr = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
306 t.length = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
307 // remove leading space
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
308 int i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
309 for(i=0;i<s.length;i++) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
310 if(s.ptr[i] > 32) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
311 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
312 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
313 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
314 s.length -= i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
315 s.ptr += i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
316
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
317 if(s.length == 0) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
318 *str = s;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
319 return t;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
320 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
321
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
322 // check for single char operators
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
323 switch(s.ptr[0]) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
324 case '<':
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
325 case '>':
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
326 case '+':
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
327 case '-':
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
328 case '*':
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
329 case '/': {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
330 t.ptr = s.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
331 t.length = 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
332 str->ptr = s.ptr + 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
333 str->length = s.length - 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
334 return t;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
335 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
336 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
337
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
338 if(s.length > 1) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
339 // check for double char operators
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
340 int16_t op = *(int16_t*)s.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
341 if(op == '==' || op == '!=' || op == '>=' || op == '=<') {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
342 t.ptr = s.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
343 t.length = 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
344 str->ptr = s.ptr + 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
345 str->length = s.length - 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
346 return t;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
347 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
348 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
349 t.ptr = s.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
350 t.length = 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
351 str->ptr = s.ptr + 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
352 str->length = s.length - 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
353 return t;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
354 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
355
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
356 // TODO: brackets
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
357
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
358 // check for string literal
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
359 if(s.ptr[0] == '\'' || s.ptr[0] == '"') {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
360 for(i=1;i<s.length;i++) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
361 if(s.ptr[0] == s.ptr[i]) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
362 i++;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
363 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
364 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
365 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
366 t.ptr = s.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
367 t.length = i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
368 str->ptr = s.ptr + i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
369 str->length = s.length - i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
370 return t;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
371 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
372
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
373 for(i=0;i<s.length;i++) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
374 char c = s.ptr[i];
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
375 if((c < 33) || (c > 41 && c < 48) || (c > 59 && c < 63)) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
376 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
377 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
378 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
379 t.ptr = s.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
380 t.length = i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
381 str->ptr = s.ptr + i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
382 str->length = s.length - i;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
383 return t;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
384 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
385
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
386 int condition_operator_type(sstr_t token, int64_t *type) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
387 // returns the operator level and sets the type
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
388
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
389 if(token.ptr[0] == '"' || token.ptr[0] == '\'' || token.ptr[0] == '(') {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
390 return 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
391 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
392
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
393 if(token.length == 1) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
394 switch(token.ptr[0]) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
395 case '+': *type = 1; return 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
396 case '-': *type = 2; return 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
397 case '*': *type = 3; return 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
398 case '/': *type = 4; return 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
399 case '<': *type = 5; return 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
400 case '>': *type = 6; return 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
401 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
402 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
403 if(!sstrcmp(token, S("not"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
404 *type = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
405 return 1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
406 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
407
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
408 if(!sstrcmp(token, S("=="))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
409 *type = 7;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
410 return 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
411 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
412 if(!sstrcmp(token, S("!="))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
413 *type = 8;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
414 return 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
415 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
416 if(!sstrcmp(token, S("<="))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
417 *type = 9;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
418 return 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
419 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
420 if(!sstrcmp(token, S(">="))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
421 *type = 10;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
422 return 2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
423 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
424
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
425 if(!sstrcmp(token, S("and"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
426 *type = 11;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
427 return 3;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
428 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
429 if(!sstrcmp(token, S("or"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
430 *type = 12;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
431 return 3;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
432 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
433 if(!sstrcmp(token, S("xor"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
434 *type = 13;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
435 return 3;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
436 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
437
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
438 return 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
439 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
440
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
441 int condition_eval(DavResource *res, DavQOp *cond, size_t len) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
442 DavQOp stack[128];
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
443 int stackpos = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
444 for(int i=0;i<len;i++) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
445 DavQOp op = cond[i];
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
446 switch(op.type) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
447 case DAVQOP_OPERATOR: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
448 if(op.intval == 0) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
449 // not operator
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
450 if(stackpos < 1) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
451 // error
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
452 printf("no data on stack\n");
28
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
453 return 0;
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
454 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
455 int pos = stackpos-1;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
456 if(stack[pos].type == DAVQOP_INTEGER) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
457 printf("not %" PRId64 "\n", stack[pos].intval);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
458 stack[pos].intval = !stack[pos].intval;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
459 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
460 // error
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
461 printf("wrong value for 'not' operator\n");
28
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
462 return 0;
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
463 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
464 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
465 DavQOp val1 = stack[stackpos-2];
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
466 DavQOp val2 = stack[stackpos-1];
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
467 DavQOp result;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
468 if(val1.type == DAVQOP_INTEGER) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
469 if(val2.type == DAVQOP_INTEGER) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
470 result = compare_intint(
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
471 op.intval,
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
472 val1.intval,
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
473 val2.intval);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
474 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
475 result = compare_intstr(op.intval, val1, val2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
476 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
477 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
478 if(val2.type == DAVQOP_INTEGER) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
479 result = compare_strint(op.intval, val1, val2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
480 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
481 result = compare_strstr(op.intval, val1, val2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
482 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
483 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
484 stack[stackpos-2] = result;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
485 stackpos--;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
486 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
487 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
488 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
489 case DAVQOP_STRING:
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
490 case DAVQOP_INTEGER:
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
491 case DAVQOP_TIME: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
492 if(op.type == DAVQOP_STRING) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
493 printf("put on stack: '%s'\n", op.val);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
494 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
495 printf("put on stack[%d]: %" PRId64 "\n", stackpos, op.intval);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
496 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
497 stack[stackpos++] = op;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
498 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
499 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
500 case DAVQOP_PROPERTY: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
501 sstr_t pname = sstrn(op.val, op.intval);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
502 pname = sstrdup(pname);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
503 char *property_value = dav_get_property(res, pname.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
504 free(pname.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
505 DavQOp value;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
506 value.type = DAVQOP_STRING;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
507 if(property_value) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
508 printf("put on stack: \"%s\"\n", property_value);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
509 value.val = property_value;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
510 value.intval = strlen(property_value);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
511 } else {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
512 printf("put on stack: null string\n");
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
513 value.val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
514 value.intval = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
515 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
516 stack[stackpos++] = value;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
517 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
518 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
519 case DAVQOP_RESPROP: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
520 sstr_t name = sstrn(op.val, op.intval);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
521 DavQOp value;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
522 value.type = DAVQOP_INTEGER;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
523 value.val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
524 if(!sstrcmp(name, S("contentlength"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
525 printf("put contentlength\n");
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
526 value.intval = res->contentlength;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
527 } else if(!sstrcmp(name, S("lastmodified"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
528 printf("put getlastmodified\n");
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
529 value.intval = res->lastmodified;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
530 } else if(!sstrcmp(name, S("creationdate"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
531 value.intval = res->creationdate;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
532 } else if(!sstrcmp(name, S("name"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
533 value.type = DAVQOP_STRING;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
534 value.val = res->name;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
535 value.intval = strlen(res->name);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
536 } else if(!sstrcmp(name, S("path"))) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
537 value.type = DAVQOP_STRING;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
538 value.val = res->path;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
539 value.intval = strlen(res->path);
28
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
540 } else if(!sstrcmp(name, S("iscollection"))) {
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
541 value.type = DAVQOP_INTEGER;
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
542 value.val = NULL;
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
543 value.intval = res->iscollection;
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
544 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
545 stack[stackpos++] = value;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
546 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
547 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
548 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
549 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
550 if(stackpos != 1) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
551 return 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
552 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
553 DavQOp result = stack[0];
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
554 printf("result: %" PRId64 "\n", result.intval);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
555 return (int)result.intval;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
556 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
557
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
558 DavQOp compare_intint(int op, int64_t v1, int64_t v2) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
559 DavQOp res;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
560 res.type = DAVQOP_INTEGER;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
561 res.val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
562 res.intval = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
563 switch(op) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
564 case 5: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
565 // <
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
566 printf("compare: %" PRId64 " < %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
567 res.intval = v1 < v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
568 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
569 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
570 case 6: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
571 // >
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
572 printf("compare: %" PRId64 " > %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
573 res.intval = v1 > v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
574 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
575 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
576 case 7: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
577 // ==
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
578 printf("compare: %" PRId64 " == %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
579 res.intval = v1 == v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
580 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
581 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
582 case 8: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
583 // !=
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
584 printf("compare: %" PRId64 " != %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
585 res.intval = v1 != v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
586 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
587 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
588 case 9: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
589 // <=
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
590 printf("compare: %" PRId64 " <= %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
591 res.intval = v1 <= v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
592 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
593 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
594 case 10: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
595 // >=
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
596 printf("compare: %" PRId64 " >= %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
597 res.intval = v1 >= v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
598 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
599 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
600 case 11: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
601 // and
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
602 printf("compare: %" PRId64 " and %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
603 res.intval = v1 && v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
604 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
605 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
606 case 12: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
607 // or
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
608 printf("compare: %" PRId64 " or %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
609 res.intval = v1 || v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
610 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
611 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
612 case 13: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
613 // xor
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
614 printf("compare: %" PRId64 " xor %" PRId64 "\n", v1, v2);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
615 res.intval = v1 ^ v2;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
616 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
617 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
618 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
619 return res;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
620 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
621
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
622 DavQOp compare_strint(int op, DavQOp v1, DavQOp v2) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
623 // TODO
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
624 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
625
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
626 DavQOp compare_intstr(int op, DavQOp v1, DavQOp v2) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
627 // TODO
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
628 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
629
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
630 DavQOp compare_strstr(int op, DavQOp v1, DavQOp v2) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
631 DavQOp res;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
632 res.type = DAVQOP_INTEGER;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
633 res.val = NULL;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
634 res.intval = 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
635 sstr_t s1 = sstrn(v1.val, v1.intval);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
636 sstr_t s2 = sstrn(v2.val, v2.intval);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
637 switch(op) {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
638 case 5: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
639 // <
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
640 printf("str compare: %.*s < %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
641 res.intval = s1.length < s2.length;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
642 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
643 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
644 case 6: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
645 // >
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
646 printf("str compare: %.*s > %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
647 res.intval = s1.length > s2.length;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
648 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
649 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
650 case 7: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
651 // ==
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
652 printf("str compare: %.*s == %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
653 res.intval = sstrcmp(s1, s2) == 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
654 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
655 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
656 case 8: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
657 // !=
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
658 printf("str compare: %.*s != %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
659 res.intval = sstrcmp(s1, s2) != 0;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
660 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
661 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
662 case 9: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
663 // <=
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
664 printf("str compare: %.*s <= %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
665 res.intval = s1.length <= s2.length;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
666 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
667 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
668 case 10: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
669 // >=
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
670 printf("str compare: %.*s >= %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
671 res.intval = s1.length >= s2.length;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
672 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
673 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
674 case 11: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
675 // and
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
676 printf("str compare: %.*s and %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
677 res.intval = s1.ptr && s2.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
678 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
679 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
680 case 12: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
681 // or
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
682 printf("str compare: %.*s or %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
683 res.intval = s1.ptr || s2.ptr;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
684 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
685 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
686 case 13: {
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
687 // xor
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
688 printf("str compare: %.*s xor %.*s\n", s1.length, s1.ptr, s2.length, s2.ptr);
28
4e46c65711ef added recursive put
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 27
diff changeset
689 res.intval = (intptr_t)s1.ptr ^ (intptr_t)s2.ptr;
27
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
690 break;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
691 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
692 }
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
693 return res;
e584c351b402 added support for where clauses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 17
diff changeset
694 }

mercurial