1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #ifndef DAVQLPARSER_H
30 #define DAVQLPARSER_H
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 #include <stdint.h>
37 #include <cx/string.h>
38 #include <cx/list.h>
39
40
41
42
43 typedef enum {
DAVQL_ERROR,
DAVQL_SELECT,
DAVQL_SET}
davqltype_t;
44
45
46
47
48 typedef enum {
49 DAVQL_TOKEN_INVALID,
DAVQL_TOKEN_KEYWORD,
50 DAVQL_TOKEN_IDENTIFIER,
DAVQL_TOKEN_FMTSPEC,
51 DAVQL_TOKEN_STRING,
DAVQL_TOKEN_NUMBER,
DAVQL_TOKEN_TIMESTAMP,
52 DAVQL_TOKEN_COMMA,
DAVQL_TOKEN_OPENP,
DAVQL_TOKEN_CLOSEP,
53 DAVQL_TOKEN_OPERATOR,
DAVQL_TOKEN_END
54 }
davqltokenclass_t;
55
56
57
58
59 typedef enum {
60 DAVQL_UNDEFINED_TYPE,
61 DAVQL_NUMBER,
DAVQL_STRING,
DAVQL_TIMESTAMP,
DAVQL_IDENTIFIER,
62 DAVQL_UNARY,
DAVQL_BINARY,
DAVQL_LOGICAL,
DAVQL_FUNCCALL
63 }
davqlexprtype_t;
64
65
66
67
68 typedef enum {
69 DAVQL_NOOP,
DAVQL_CALL,
DAVQL_ARGLIST,
70 DAVQL_ADD,
DAVQL_SUB,
DAVQL_MUL,
DAVQL_DIV,
71 DAVQL_AND,
DAVQL_OR,
DAVQL_XOR,
DAVQL_NEG,
72 DAVQL_NOT,
DAVQL_LAND,
DAVQL_LOR,
DAVQL_LXOR,
73 DAVQL_EQ,
DAVQL_NEQ,
DAVQL_LT,
DAVQL_GT,
DAVQL_LE,
DAVQL_GE,
74 DAVQL_LIKE,
DAVQL_UNLIKE
75 }
davqloperator_t;
76
77 typedef struct DavQLToken DavQLToken;
78 struct DavQLToken {
79 davqltokenclass_t tokenclass;
80 cxstring value;
81 DavQLToken *prev;
82 DavQLToken *next;
83 };
84
85
86
87
88 typedef struct _davqlexpr DavQLExpression;
89
90
91
92
93 struct _davqlexpr {
94
95
96
97
98 cxstring srctext;
99
100
101
102 davqlexprtype_t type;
103
104
105
106 davqloperator_t op;
107
108
109
110
111 DavQLExpression *left;
112
113
114
115
116 DavQLExpression *right;
117 };
118
119
120
121
122 typedef struct {
123
124
125
126 DavQLExpression *column;
127
128
129
130
131 _Bool descending;
132 } DavQLOrderCriterion;
133
134
135
136
137 typedef struct {
138
139
140
141
142
143
144
145 cxstring name;
146
147
148
149
150
151
152
153 DavQLExpression *expr;
154 } DavQLField;
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244 typedef struct {
245
246
247
248 cxstring srctext;
249
250
251
252 davqltype_t type;
253
254
255
256 int errorcode;
257
258
259
260 char* errormessage;
261
262
263
264 CxList* fields;
265
266
267
268 cxstring path;
269
270
271
272
273 DavQLExpression* where;
274
275
276
277
278
279 CxList* orderby;
280
281
282
283
284
285
286 int depth;
287
288
289
290 CxList* args;
291 } DavQLStatement;
292
293
294 #define DAV_DEPTH_INFINITY -
1
295
296
297 #define DAV_DEPTH_PLACEHOLDER -
2
298
299
300 #define DAVQL_ERROR_UNEXPECTED_TOKEN 1
301
302
303 #define DAVQL_ERROR_INVALID_TOKEN 2
304
305
306 #define DAVQL_ERROR_MISSING_TOKEN 11
307
308
309 #define DAVQL_ERROR_MISSING_EXPR 12
310
311
312 #define DAVQL_ERROR_MISSING_PAR 13
313
314
315 #define DAVQL_ERROR_MISSING_ASSIGN 14
316
317
318 #define DAVQL_ERROR_INVALID_EXPR 21
319
320
321 #define DAVQL_ERROR_INVALID_UNARY_OP 22
322
323
324 #define DAVQL_ERROR_INVALID_LOGICAL_OP 23
325
326
327 #define DAVQL_ERROR_INVALID_FMTSPEC 24
328
329
330 #define DAVQL_ERROR_INVALID_STRING 25
331
332
333 #define DAVQL_ERROR_INVALID_ORDER_CRITERION 26
334
335
336 #define DAVQL_ERROR_INVALID_DEPTH 101
337
338
339 #define DAVQL_ERROR_INVALID -
1
340
341
342 #define DAVQL_ERROR_OUT_OF_MEMORY -
2
343
344
345
346
347
348
349 void dav_debug_statement(DavQLStatement *stmt);
350
351
352
353
354
355
356 DavQLStatement* dav_parse_statement(cxstring stmt);
357
358
359
360
361 #define dav_parse_cstr_statement(stmt) dav_parse_statement(cx_str(stmt))
362
363
364
365
366
367 void dav_free_statement(DavQLStatement *stmt);
368
369 #ifdef __cplusplus
370 }
371 #endif
372
373 #endif
374
375