tinyows 1.2.2
fe_function.c
Go to the documentation of this file.
1/*
2 Copyright (c) <2007-2012> <Barbara Philippot - Olivier Courtin>
3
4 Permission is hereby granted, free of charge, to any person obtaining a copy
5 of this software and associated documentation files (the "Software"), to deal
6 in the Software without restriction, including without limitation the rights
7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 copies of the Software, and to permit persons to whom the Software is
9 furnished to do so, subject to the following conditions:
10
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 IN THE SOFTWARE.
21*/
22
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <assert.h>
28
29#include "../ows/ows.h"
30
31
32/*
33 * Generic function for filter encoding functions with one argument
34 */
35static buffer *fe_functions(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
36{
37 assert(o);
38 assert(typename);
39 assert(n);
40 assert(sql);
41
42 n = n->children;
43
44 /* jump to the next element if there are spaces */
45 while (n->type != XML_ELEMENT_NODE) n = n->next;
46
47 sql = fe_expression(o, typename, fe, sql, n);
48 buffer_add_str(sql, ")");
49
50 return sql;
51}
52
53
54/*
55 * Generic function for aggregate filter encoding functions
56 */
57static buffer *fe_aggregate_functions(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
58{
59 assert(o);
60 assert(typename);
61 assert(fe);
62 assert(n);
63 assert(sql);
64
65 n = n->children;
66
67 /* jump to the next element if there are spaces */
68 while (n->type != XML_ELEMENT_NODE) n = n->next;
69
70 sql = fe_expression(o, typename, fe, sql, n);
71
72 buffer_add_str(sql, ") from ");
73 buffer_copy(sql, typename);
74 buffer_add_str(sql, ")");
75
76 return sql;
77}
78
79
80/*
81 * Calculate the absolute value of the argument
82 */
83static buffer *fe_fct_abs(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
84{
85 assert(o);
86 assert(typename);
87 assert(fe);
88 assert(n);
89 assert(sql);
90
91 buffer_add_str(sql, "abs(");
92 sql = fe_functions(o, typename, fe, sql, n);
93
94 return sql;
95}
96
97
98/*
99 * Calculate the arc cosine of the argument
100 */
101static buffer *fe_fct_acos(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
102{
103 assert(o);
104 assert(typename);
105 assert(fe);
106 assert(n);
107 assert(sql);
108
109 buffer_add_str(sql, "acos(");
110 sql = fe_functions(o, typename, fe, sql, n);
111
112 return sql;
113}
114
115
116/*
117 * Calculate the arc sine of the argument
118 */
119static buffer *fe_fct_asin(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
120{
121 assert(o);
122 assert(typename);
123 assert(fe);
124 assert(n);
125 assert(sql);
126
127 buffer_add_str(sql, "asin(");
128 sql = fe_functions(o, typename, fe, sql, n);
129
130 return sql;
131}
132
133
134/*
135 * Calculate the arc tangent of the argument
136 */
137static buffer *fe_fct_atan(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
138{
139 assert(o);
140 assert(typename);
141 assert(fe);
142 assert(n);
143 assert(sql);
144
145 buffer_add_str(sql, "atan(");
146 sql = fe_functions(o, typename, fe, sql, n);
147
148 return sql;
149}
150
151
152/*
153 * Return the average value for any number of fields
154 */
155static buffer *fe_fct_avg(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
156{
157 assert(o);
158 assert(typename);
159 assert(fe);
160 assert(n);
161 assert(sql);
162
163 buffer_add_str(sql, "(SELECT avg(");
164 sql = fe_aggregate_functions(o, typename, fe, sql, n);
165
166 return sql;
167}
168
169
170/*
171 * Return the cube root of the argument
172 */
173static buffer *fe_fct_cbrt(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
174{
175 assert(o);
176 assert(typename);
177 assert(fe);
178 assert(n);
179 assert(sql);
180
181 buffer_add_str(sql, "cbrt(");
182 sql = fe_functions(o, typename, fe, sql, n);
183
184 return sql;
185}
186
187
188/*
189 * Return the smallest integer not less than argument
190 */
191static buffer *fe_fct_ceil(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
192{
193 assert(o);
194 assert(typename);
195 assert(fe);
196 assert(n);
197
198 buffer_add_str(sql, "ceil(");
199 sql = fe_functions(o, typename, fe, sql, n);
200
201 return sql;
202}
203
204
205/*
206 * Calculate the cosine of the argument
207 */
208static buffer *fe_fct_cos(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
209{
210 assert(o);
211 assert(typename);
212 assert(fe);
213 assert(n);
214 assert(sql);
215
216 buffer_add_str(sql, "cos(");
217 sql = fe_functions(o, typename, fe, sql, n);
218
219 return sql;
220}
221
222
223/*
224 * Calculate the cotangent of the argument
225 */
226static buffer *fe_fct_cot(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
227{
228 assert(o);
229 assert(typename);
230 assert(fe);
231 assert(n);
232 assert(sql);
233
234 buffer_add_str(sql, "cot(");
235 sql = fe_functions(o, typename, fe, sql, n);
236
237 return sql;
238}
239
240
241/*
242 * Return the number of rows
243 */
244static buffer *fe_fct_count(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
245{
246 assert(o);
247 assert(typename);
248 assert(fe);
249 assert(n);
250 assert(sql);
251
252 buffer_add_str(sql, "(SELECT count(");
253 sql = fe_aggregate_functions(o, typename, fe, sql, n);
254
255 return sql;
256}
257
258
259/*
260 * Transform the argument from radians to degrees
261 */
262static buffer *fe_fct_degrees(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
263{
264 assert(o);
265 assert(typename);
266 assert(fe);
267 assert(n);
268 assert(sql);
269
270 buffer_add_str(sql, "degrees(");
271 sql = fe_functions(o, typename, fe, sql, n);
272
273 return sql;
274}
275
276
277/*
278 * Calculate the exponantial of the argument
279 */
280static buffer *fe_fct_exp(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
281{
282 assert(o);
283 assert(typename);
284 assert(fe);
285 assert(n);
286 assert(sql);
287
288 buffer_add_str(sql, "exp(");
289 sql = fe_functions(o, typename, fe, sql, n);
290
291 return sql;
292}
293
294
295/*
296 * Return the largest integer not greater than argument
297 */
298static buffer *fe_fct_floor(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
299{
300 assert(o);
301 assert(typename);
302 assert(fe);
303 assert(n);
304 assert(sql);
305
306 buffer_add_str(sql, "floor(");
307 sql = fe_functions(o, typename, fe, sql, n);
308
309 return sql;
310}
311
312
313/*
314 * Return the length of the argument
315 */
316static buffer *fe_fct_length(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
317{
318 assert(o);
319 assert(typename);
320 assert(fe);
321 assert(n);
322 assert(sql);
323
324 buffer_add_str(sql, "length(");
325 sql = fe_functions(o, typename, fe, sql, n);
326
327 return sql;
328}
329
330
331/*
332 * Calculate the natural logarithm of the argument
333 */
334static buffer *fe_fct_ln(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
335{
336 assert(o);
337 assert(typename);
338 assert(fe);
339 assert(n);
340 assert(sql);
341
342 buffer_add_str(sql, "ln(");
343 sql = fe_functions(o, typename, fe, sql, n);
344
345 return sql;
346}
347
348
349/*
350 * Calculate the base 10 logarithm of the argument
351 */
352static buffer *fe_fct_log(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
353{
354 assert(o);
355 assert(typename);
356 assert(fe);
357 assert(n);
358 assert(sql);
359
360 buffer_add_str(sql, "log(");
361 sql = fe_functions(o, typename, fe, sql, n);
362
363 return sql;
364}
365
366
367/*
368 * Return the minimum of a set of rows
369 */
370static buffer *fe_fct_min(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
371{
372 assert(o);
373 assert(typename);
374 assert(fe);
375 assert(n);
376 assert(sql);
377
378 buffer_add_str(sql, "(SELECT Min(");
379 sql = fe_aggregate_functions(o, typename, fe, sql, n);
380
381 return sql;
382}
383
384
385/*
386 * Return the maximum of a set of rows
387 */
388static buffer *fe_fct_max(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
389{
390 assert(o);
391 assert(typename);
392 assert(fe);
393 assert(n);
394 assert(sql);
395
396 buffer_add_str(sql, "(SELECT Max(");
397 sql = fe_aggregate_functions(o, typename, fe, sql, n);
398
399 return sql;
400}
401
402
403/*
404 * Transform the argument from degrees to radians
405 */
406static buffer *fe_fct_radians(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
407{
408 assert(o);
409 assert(typename);
410 assert(fe);
411 assert(n);
412 assert(sql);
413
414 buffer_add_str(sql, "radians(");
415 sql = fe_functions(o, typename, fe, sql, n);
416
417 return sql;
418}
419
420/*
421 * Return the round to nearest integer of the argument
422 */
423static buffer *fe_fct_round(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
424{
425 assert(o);
426 assert(typename);
427 assert(fe);
428 assert(n);
429 assert(sql);
430
431 buffer_add_str(sql, "round(");
432 sql = fe_functions(o, typename, fe, sql, n);
433
434 return sql;
435}
436
437
438/*
439 * Calculate the sine of the argument
440 */
441static buffer *fe_fct_sin(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
442{
443 assert(o);
444 assert(typename);
445 assert(fe);
446 assert(n);
447 assert(sql);
448
449 buffer_add_str(sql, "sin(");
450 sql = fe_functions(o, typename, fe, sql, n);
451
452 return sql;
453}
454
455
456/*
457 * Calculate the square root of the argument
458 */
459static buffer *fe_fct_sqrt(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
460{
461 assert(o);
462 assert(typename);
463 assert(fe);
464 assert(n);
465 assert(sql);
466
467 buffer_add_str(sql, "sqrt(");
468 sql = fe_functions(o, typename, fe, sql, n);
469
470 return sql;
471}
472
473
474/*
475 * Calculate the tangent of the argument
476 */
477static buffer *fe_fct_tan(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
478{
479 assert(o);
480 assert(typename);
481 assert(fe);
482 assert(n);
483 assert(sql);
484
485 buffer_add_str(sql, "tan(");
486 sql = fe_functions(o, typename, fe, sql, n);
487
488 return sql;
489}
490
491
492/*
493 * Truncate the argument toward zero
494 */
495static buffer *fe_fct_trunc(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
496{
497 assert(o);
498 assert(typename);
499 assert(fe);
500 assert(n);
501 assert(sql);
502
503 buffer_add_str(sql, "trunc(");
504 sql = fe_functions(o, typename, fe, sql, n);
505
506 return sql;
507}
508
509
510/*
511 * Call the right function
512 */
513buffer *fe_function(ows * o, buffer * typename, filter_encoding * fe, buffer * sql, xmlNodePtr n)
514{
515 xmlChar *fct_name;
516
517 assert(o);
518 assert(typename);
519 assert(fe);
520 assert(n);
521 assert(sql);
522
523 fct_name = xmlGetProp(n, (xmlChar *) "name");
524
525 assert(fct_name);
526
527 if (!strcmp((char *) fct_name, "abs"))
528 sql = fe_fct_abs(o, typename, fe, sql, n);
529 else if (!strcmp((char *) fct_name, "acos"))
530 sql = fe_fct_acos(o, typename, fe, sql, n);
531 else if (!strcmp((char *) fct_name, "asin"))
532 sql = fe_fct_asin(o, typename, fe, sql, n);
533 else if (!strcmp((char *) fct_name, "atan"))
534 sql = fe_fct_atan(o, typename, fe, sql, n);
535 else if (!strcmp((char *) fct_name, "avg"))
536 sql = fe_fct_avg(o, typename, fe, sql, n);
537 else if (!strcmp((char *) fct_name, "cbrt"))
538 sql = fe_fct_cbrt(o, typename, fe, sql, n);
539 else if (!strcmp((char *) fct_name, "ceil"))
540 sql = fe_fct_ceil(o, typename, fe, sql, n);
541 else if (!strcmp((char *) fct_name, "ceiling"))
542 sql = fe_fct_ceil(o, typename, fe, sql, n);
543 else if (!strcmp((char *) fct_name, "cos"))
544 sql = fe_fct_cos(o, typename, fe, sql, n);
545 else if (!strcmp((char *) fct_name, "cot"))
546 sql = fe_fct_cot(o, typename, fe, sql, n);
547 else if (!strcmp((char *) fct_name, "count"))
548 sql = fe_fct_count(o, typename, fe, sql, n);
549 else if (!strcmp((char *) fct_name, "degrees"))
550 sql = fe_fct_degrees(o, typename, fe, sql, n);
551 else if (!strcmp((char *) fct_name, "exp"))
552 sql = fe_fct_exp(o, typename, fe, sql, n);
553 else if (!strcmp((char *) fct_name, "floor"))
554 sql = fe_fct_floor(o, typename, fe, sql, n);
555 else if (!strcmp((char *) fct_name, "length"))
556 sql = fe_fct_length(o, typename, fe, sql, n);
557 else if (!strcmp((char *) fct_name, "ln"))
558 sql = fe_fct_ln(o, typename, fe, sql, n);
559 else if (!strcmp((char *) fct_name, "log"))
560 sql = fe_fct_log(o, typename, fe, sql, n);
561 else if (!strcmp((char *) fct_name, "min"))
562 sql = fe_fct_min(o, typename, fe, sql, n);
563 else if (!strcmp((char *) fct_name, "max"))
564 sql = fe_fct_max(o, typename, fe, sql, n);
565 else if (!strcmp((char *) fct_name, "radians"))
566 sql = fe_fct_radians(o, typename, fe, sql, n);
567 else if (!strcmp((char *) fct_name, "round"))
568 sql = fe_fct_round(o, typename, fe, sql, n);
569 else if (!strcmp((char *) fct_name, "sin"))
570 sql = fe_fct_sin(o, typename, fe, sql, n);
571 else if (!strcmp((char *) fct_name, "sqrt"))
572 sql = fe_fct_sqrt(o, typename, fe, sql, n);
573 else if (!strcmp((char *) fct_name, "tan"))
574 sql = fe_fct_tan(o, typename, fe, sql, n);
575 else if (!strcmp((char *) fct_name, "trunc"))
576 sql = fe_fct_trunc(o, typename, fe, sql, n);
577 else fe->error_code = FE_ERROR_FUNCTION;
578
579 xmlFree(fct_name);
580
581 return sql;
582}
583
584
585/*
586 * vim: expandtab sw=4 ts=4
587 */
static buffer * fe_fct_avg(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
buffer * fe_function(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_round(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_floor(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_min(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_sqrt(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_aggregate_functions(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
Definition fe_function.c:57
static buffer * fe_fct_sin(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_exp(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_ceil(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_acos(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_ln(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_degrees(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_cot(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_tan(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_cos(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_atan(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_cbrt(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_abs(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
Definition fe_function.c:83
static buffer * fe_fct_length(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_trunc(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_asin(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_functions(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
Definition fe_function.c:35
static buffer * fe_fct_count(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_max(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_log(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
static buffer * fe_fct_radians(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
void buffer_copy(buffer *dest, const buffer *src)
Definition buffer.c:350
void buffer_add_str(buffer *buf, const char *str)
Definition buffer.c:254
buffer * fe_expression(ows *o, buffer *typename, filter_encoding *fe, buffer *sql, xmlNodePtr n)
Definition fe_filter.c:119
struct Buffer buffer
struct Ows ows
@ FE_ERROR_FUNCTION
Definition ows_struct.h:338
struct Filter_encoding filter_encoding
enum fe_error_code error_code
Definition ows_struct.h:346

Generated for tinyows by doxygen 1.13.2