libidav/davqlparser.c

changeset 127
7072a2b4ae35
parent 125
5e2576b08680
child 129
7532963bd15b
equal deleted inserted replaced
126:b156cae29e65 127:7072a2b4ae35
39 // ------------------------------------------------------------------------ 39 // ------------------------------------------------------------------------
40 40
41 static const char* _map_querytype(davqltype_t type) { 41 static const char* _map_querytype(davqltype_t type) {
42 switch(type) { 42 switch(type) {
43 case DAVQL_ERROR: return "ERROR"; 43 case DAVQL_ERROR: return "ERROR";
44 case DAVQL_GET: return "GET"; 44 case DAVQL_SELECT: return "SELECT";
45 case DAVQL_SET: return "SET"; 45 case DAVQL_SET: return "SET";
46 default: return "unknown"; 46 default: return "unknown";
47 } 47 }
48 } 48 }
49 49
432 432
433 // special symbols are single tokens - the % sign MUST NOT be a special symbol 433 // special symbols are single tokens - the % sign MUST NOT be a special symbol
434 static const char *special_token_symbols = ",()+-*/&|^~=!<>"; 434 static const char *special_token_symbols = ",()+-*/&|^~=!<>";
435 435
436 static _Bool iskeyword(DavQLToken *token) { 436 static _Bool iskeyword(DavQLToken *token) {
437 sstr_t keywords[] = {ST("get"), ST("set"), ST("from"), ST("at"), ST("as"), 437 sstr_t keywords[] ={ST("select"), ST("set"), ST("from"), ST("at"), ST("as"),
438 ST("where"), ST("with"), ST("order"), ST("by"), ST("asc"), ST("desc") 438 ST("where"), ST("with"), ST("order"), ST("by"), ST("asc"), ST("desc")
439 }; 439 };
440 for (int i = 0 ; i < sizeof(keywords)/sizeof(sstr_t) ; i++) { 440 for (int i = 0 ; i < sizeof(keywords)/sizeof(sstr_t) ; i++) {
441 if (!sstrcasecmp(token->value, keywords[i])) { 441 if (!sstrcasecmp(token->value, keywords[i])) {
442 return 1; 442 return 1;
1411 1411
1412 return total_consumed; 1412 return total_consumed;
1413 } 1413 }
1414 1414
1415 /** 1415 /**
1416 * Parser of a get statement. 1416 * Parser of a select statement.
1417 * @param stmt the statement object that shall contain the syntax tree 1417 * @param stmt the statement object that shall contain the syntax tree
1418 * @param tokens the token list 1418 * @param tokens the token list
1419 */ 1419 */
1420 static void dav_parse_get_statement(DavQLStatement *stmt, UcxList *tokens) { 1420 static void dav_parse_select_statement(DavQLStatement *stmt, UcxList *tokens) {
1421 stmt->type = DAVQL_GET; 1421 stmt->type = DAVQL_SELECT;
1422 1422
1423 // Consume field list 1423 // Consume field list
1424 tokens = ucx_list_get(tokens, dav_parse_fieldlist(stmt, tokens)); 1424 tokens = ucx_list_get(tokens, dav_parse_fieldlist(stmt, tokens));
1425 if (stmt->errorcode) { 1425 if (stmt->errorcode) {
1426 return; 1426 return;
1544 UcxList* tokens = dav_parse_tokenize(stmt->srctext); 1544 UcxList* tokens = dav_parse_tokenize(stmt->srctext);
1545 1545
1546 if (tokens) { 1546 if (tokens) {
1547 // use first token to determine query type 1547 // use first token to determine query type
1548 1548
1549 if (tokenvalue_is(tokens, "get")) { 1549 if (tokenvalue_is(tokens, "select")) {
1550 dav_parse_get_statement(stmt, tokens->next); 1550 dav_parse_select_statement(stmt, tokens->next);
1551 } else if (tokenvalue_is(tokens, "set")) { 1551 } else if (tokenvalue_is(tokens, "set")) {
1552 dav_parse_set_statement(stmt, tokens->next); 1552 dav_parse_set_statement(stmt, tokens->next);
1553 } else { 1553 } else {
1554 stmt->type = DAVQL_ERROR; 1554 stmt->type = DAVQL_ERROR;
1555 stmt->errorcode = DAVQL_ERROR_INVALID; 1555 stmt->errorcode = DAVQL_ERROR_INVALID;

mercurial