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; |