X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffrontend%2Fparser.c;h=c82a514a00e7ddb4831805dafbbed8c9c618888e;hb=5250cae0891d89b863400d6aa79a3640bce975a6;hp=f16b71fd952a0bcc4c94c95c5d6eedb8d0dad21c;hpb=9f7401c4f4fba09013324fb58553d26f3101dcdf;p=sysdb.git diff --git a/src/frontend/parser.c b/src/frontend/parser.c index f16b71f..c82a514 100644 --- a/src/frontend/parser.c +++ b/src/frontend/parser.c @@ -34,7 +34,9 @@ #include "core/store.h" #include "utils/llist.h" +#include "utils/strbuf.h" +#include #include /* @@ -43,17 +45,23 @@ static int scanner_init(const char *input, int len, - sdb_fe_yyscan_t *scanner, sdb_fe_yyextra_t *extra) + sdb_fe_yyscan_t *scanner, sdb_fe_yyextra_t *extra, + sdb_strbuf_t *errbuf) { - if (! input) + if (! input) { + sdb_strbuf_sprintf(errbuf, "Missing scanner input"); return -1; + } memset(extra, 0, sizeof(*extra)); extra->parsetree = sdb_llist_create(); extra->mode = SDB_PARSE_DEFAULT; + extra->errbuf = errbuf; - if (! extra->parsetree) + if (! extra->parsetree) { + sdb_strbuf_sprintf(errbuf, "Failed to allocate parse-tree"); return -1; + } *scanner = sdb_fe_scanner_init(input, len, extra); if (! scanner) { @@ -68,13 +76,14 @@ scanner_init(const char *input, int len, */ sdb_llist_t * -sdb_fe_parse(const char *query, int len) +sdb_fe_parse(const char *query, int len, sdb_strbuf_t *errbuf) { sdb_fe_yyscan_t scanner; sdb_fe_yyextra_t yyextra; + sdb_llist_iter_t *iter; int yyres; - if (scanner_init(query, len, &scanner, &yyextra)) + if (scanner_init(query, len, &scanner, &yyextra, errbuf)) return NULL; yyres = sdb_fe_yyparse(scanner); @@ -84,11 +93,23 @@ sdb_fe_parse(const char *query, int len) sdb_llist_destroy(yyextra.parsetree); return NULL; } + + iter = sdb_llist_get_iter(yyextra.parsetree); + while (sdb_llist_iter_has_next(iter)) { + sdb_conn_node_t *node; + node = SDB_CONN_NODE(sdb_llist_iter_get_next(iter)); + if (sdb_fe_analyze(node, errbuf)) { + sdb_llist_iter_destroy(iter); + sdb_llist_destroy(yyextra.parsetree); + return NULL; + } + } + sdb_llist_iter_destroy(iter); return yyextra.parsetree; } /* sdb_fe_parse */ sdb_store_matcher_t * -sdb_fe_parse_matcher(const char *cond, int len) +sdb_fe_parse_matcher(const char *cond, int len, sdb_strbuf_t *errbuf) { sdb_fe_yyscan_t scanner; sdb_fe_yyextra_t yyextra; @@ -98,7 +119,7 @@ sdb_fe_parse_matcher(const char *cond, int len) int yyres; - if (scanner_init(cond, len, &scanner, &yyextra)) + if (scanner_init(cond, len, &scanner, &yyextra, errbuf)) return NULL; yyextra.mode = SDB_PARSE_COND; @@ -112,15 +133,15 @@ sdb_fe_parse_matcher(const char *cond, int len) } node = SDB_CONN_NODE(sdb_llist_get(yyextra.parsetree, 0)); - if (! node) + if (! node) { + sdb_strbuf_sprintf(errbuf, "Empty matcher expression '%s'", cond); + sdb_llist_destroy(yyextra.parsetree); return NULL; - - if (node->cmd == CONNECTION_MATCHER) { - m = CONN_MATCHER(node)->matcher; - CONN_MATCHER(node)->matcher = NULL; } - else - m = NULL; + + assert(node->cmd == SDB_CONNECTION_MATCHER); + m = CONN_MATCHER(node)->matcher; + CONN_MATCHER(node)->matcher = NULL; sdb_llist_destroy(yyextra.parsetree); sdb_object_deref(SDB_OBJ(node)); @@ -128,7 +149,7 @@ sdb_fe_parse_matcher(const char *cond, int len) } /* sdb_fe_parse_matcher */ sdb_store_expr_t * -sdb_fe_parse_expr(const char *expr, int len) +sdb_fe_parse_expr(const char *expr, int len, sdb_strbuf_t *errbuf) { sdb_fe_yyscan_t scanner; sdb_fe_yyextra_t yyextra; @@ -138,7 +159,7 @@ sdb_fe_parse_expr(const char *expr, int len) int yyres; - if (scanner_init(expr, len, &scanner, &yyextra)) + if (scanner_init(expr, len, &scanner, &yyextra, errbuf)) return NULL; yyextra.mode = SDB_PARSE_EXPR; @@ -152,15 +173,15 @@ sdb_fe_parse_expr(const char *expr, int len) } node = SDB_CONN_NODE(sdb_llist_get(yyextra.parsetree, 0)); - if (! node) + if (! node) { + sdb_strbuf_sprintf(errbuf, "Empty expression '%s'", expr); + sdb_llist_destroy(yyextra.parsetree); return NULL; - - if (node->cmd == CONNECTION_EXPR) { - e = CONN_EXPR(node)->expr; - CONN_EXPR(node)->expr = NULL; } - else - e = NULL; + + assert(node->cmd == SDB_CONNECTION_EXPR); + e = CONN_EXPR(node)->expr; + CONN_EXPR(node)->expr = NULL; sdb_llist_destroy(yyextra.parsetree); sdb_object_deref(SDB_OBJ(node));