X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffrontend%2Fparser.c;h=0e0534e4af3c9c0be6bb93c5ed1dfda319cf75b1;hb=7e793f3944a35ead8d767d297e9b80651d648dc4;hp=037550fbddd731bf4bd84c51c8d126d50466ff16;hpb=ae32792b881853979265e41b49866be9ea2d6b2c;p=sysdb.git diff --git a/src/frontend/parser.c b/src/frontend/parser.c index 037550f..0e0534e 100644 --- a/src/frontend/parser.c +++ b/src/frontend/parser.c @@ -31,32 +31,77 @@ #include "frontend/parser.h" #include "frontend/grammar.h" +#include "core/store.h" + #include "utils/llist.h" #include +/* + * private helper functions + */ + +static int +scanner_init(const char *input, int len, + sdb_fe_yyscan_t *scanner, sdb_fe_yyextra_t *extra) +{ + if (! input) + return -1; + + memset(extra, 0, sizeof(*extra)); + extra->parsetree = sdb_llist_create(); + extra->mode = SDB_PARSE_DEFAULT; + + if (! extra->parsetree) + return -1; + + *scanner = sdb_fe_scanner_init(input, len, extra); + if (! scanner) { + sdb_llist_destroy(extra->parsetree); + return -1; + } + return 0; +} /* scanner_init */ + /* * public API */ sdb_llist_t * -sdb_fe_parse(const char *query) +sdb_fe_parse(const char *query, int len) { sdb_fe_yyscan_t scanner; sdb_fe_yyextra_t yyextra; int yyres; - if (! query) + if (scanner_init(query, len, &scanner, &yyextra)) return NULL; - memset(&yyextra, 0, sizeof(yyextra)); - yyextra.parsetree = sdb_llist_create(); + yyres = sdb_fe_yyparse(scanner); + sdb_fe_scanner_destroy(scanner); - scanner = sdb_fe_scanner_init(query, &yyextra); - if (! scanner) { + if (yyres) { sdb_llist_destroy(yyextra.parsetree); return NULL; } + return yyextra.parsetree; +} /* sdb_fe_parse */ + +sdb_store_matcher_t * +sdb_fe_parse_matcher(const char *cond, int len) +{ + sdb_fe_yyscan_t scanner; + sdb_fe_yyextra_t yyextra; + + sdb_conn_node_t *node; + sdb_store_matcher_t *m; + + int yyres; + + if (scanner_init(cond, len, &scanner, &yyextra)) + return NULL; + + yyextra.mode = SDB_PARSE_COND; yyres = sdb_fe_yyparse(scanner); sdb_fe_scanner_destroy(scanner); @@ -65,8 +110,21 @@ sdb_fe_parse(const char *query) sdb_llist_destroy(yyextra.parsetree); return NULL; } - return yyextra.parsetree; -} /* sdb_fe_parse */ + + node = SDB_CONN_NODE(sdb_llist_get(yyextra.parsetree, 0)); + if (! node) + return NULL; + + if (node->cmd == CONNECTION_EXPR) + m = CONN_MATCHER(node)->matcher; + else + m = NULL; + + CONN_MATCHER(node)->matcher = NULL; + sdb_llist_destroy(yyextra.parsetree); + sdb_object_deref(SDB_OBJ(node)); + return m; +} /* sdb_fe_parse_matcher */ /* vim: set tw=78 sw=4 ts=4 noexpandtab : */