Code

Added tests for sdb_fe_parse_expr() and fixed the implementation.
[sysdb.git] / src / frontend / parser.c
index 6504a66ea7a408b00522ab3ae94639f52e484df0..785b7e40b59caecc3f34d5e8660f7d04f918e397 100644 (file)
@@ -88,7 +88,7 @@ sdb_fe_parse(const char *query, int len)
 } /* sdb_fe_parse */
 
 sdb_store_matcher_t *
-sdb_fe_parse_matcher(const char *expr, int len)
+sdb_fe_parse_matcher(const char *cond, int len)
 {
        sdb_fe_yyscan_t scanner;
        sdb_fe_yyextra_t yyextra;
@@ -98,10 +98,10 @@ sdb_fe_parse_matcher(const char *expr, int len)
 
        int yyres;
 
-       if (scanner_init(expr, len, &scanner, &yyextra))
+       if (scanner_init(cond, len, &scanner, &yyextra))
                return NULL;
 
-       yyextra.mode = SDB_PARSE_EXPR;
+       yyextra.mode = SDB_PARSE_COND;
 
        yyres = sdb_fe_yyparse(scanner);
        sdb_fe_scanner_destroy(scanner);
@@ -112,11 +112,15 @@ sdb_fe_parse_matcher(const char *expr, int len)
        }
 
        node = SDB_CONN_NODE(sdb_llist_get(yyextra.parsetree, 0));
-       if (! node)
+       if (! node) {
+               sdb_llist_destroy(yyextra.parsetree);
                return NULL;
+       }
 
-       if (node->cmd == CONNECTION_EXPR)
+       if (node->cmd == CONNECTION_MATCHER) {
                m = CONN_MATCHER(node)->matcher;
+               CONN_MATCHER(node)->matcher = NULL;
+       }
        else
                m = NULL;
 
@@ -125,5 +129,47 @@ sdb_fe_parse_matcher(const char *expr, int len)
        return m;
 } /* sdb_fe_parse_matcher */
 
+sdb_store_expr_t *
+sdb_fe_parse_expr(const char *expr, int len)
+{
+       sdb_fe_yyscan_t scanner;
+       sdb_fe_yyextra_t yyextra;
+
+       sdb_conn_node_t *node;
+       sdb_store_expr_t *e;
+
+       int yyres;
+
+       if (scanner_init(expr, len, &scanner, &yyextra))
+               return NULL;
+
+       yyextra.mode = SDB_PARSE_EXPR;
+
+       yyres = sdb_fe_yyparse(scanner);
+       sdb_fe_scanner_destroy(scanner);
+
+       if (yyres) {
+               sdb_llist_destroy(yyextra.parsetree);
+               return NULL;
+       }
+
+       node = SDB_CONN_NODE(sdb_llist_get(yyextra.parsetree, 0));
+       if (! node) {
+               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;
+
+       sdb_llist_destroy(yyextra.parsetree);
+       sdb_object_deref(SDB_OBJ(node));
+       return e;
+} /* sdb_fe_parse_expr */
+
 /* vim: set tw=78 sw=4 ts=4 noexpandtab : */