diff --git a/src/frontend/parser.c b/src/frontend/parser.c
index f16b71fd952a0bcc4c94c95c5d6eedb8d0dad21c..c82a514a00e7ddb4831805dafbbed8c9c618888e 100644 (file)
--- a/src/frontend/parser.c
+++ b/src/frontend/parser.c
#include "core/store.h"
#include "utils/llist.h"
#include "core/store.h"
#include "utils/llist.h"
+#include "utils/strbuf.h"
+#include <assert.h>
#include <string.h>
/*
#include <string.h>
/*
static int
scanner_init(const char *input, int len,
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;
return -1;
+ }
memset(extra, 0, sizeof(*extra));
extra->parsetree = sdb_llist_create();
extra->mode = SDB_PARSE_DEFAULT;
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;
return -1;
+ }
*scanner = sdb_fe_scanner_init(input, len, extra);
if (! scanner) {
*scanner = sdb_fe_scanner_init(input, len, extra);
if (! scanner) {
*/
sdb_llist_t *
*/
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_fe_yyscan_t scanner;
sdb_fe_yyextra_t yyextra;
+ sdb_llist_iter_t *iter;
int yyres;
int yyres;
- if (scanner_init(query, len, &scanner, &yyextra))
+ if (scanner_init(query, len, &scanner, &yyextra, errbuf))
return NULL;
yyres = sdb_fe_yyparse(scanner);
return NULL;
yyres = sdb_fe_yyparse(scanner);
sdb_llist_destroy(yyextra.parsetree);
return NULL;
}
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 *
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;
{
sdb_fe_yyscan_t scanner;
sdb_fe_yyextra_t yyextra;
int yyres;
int yyres;
- if (scanner_init(cond, len, &scanner, &yyextra))
+ if (scanner_init(cond, len, &scanner, &yyextra, errbuf))
return NULL;
yyextra.mode = SDB_PARSE_COND;
return NULL;
yyextra.mode = SDB_PARSE_COND;
}
node = SDB_CONN_NODE(sdb_llist_get(yyextra.parsetree, 0));
}
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;
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));
sdb_llist_destroy(yyextra.parsetree);
sdb_object_deref(SDB_OBJ(node));
} /* sdb_fe_parse_matcher */
sdb_store_expr_t *
} /* 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;
{
sdb_fe_yyscan_t scanner;
sdb_fe_yyextra_t yyextra;
int yyres;
int yyres;
- if (scanner_init(expr, len, &scanner, &yyextra))
+ if (scanner_init(expr, len, &scanner, &yyextra, errbuf))
return NULL;
yyextra.mode = SDB_PARSE_EXPR;
return NULL;
yyextra.mode = SDB_PARSE_EXPR;
}
node = SDB_CONN_NODE(sdb_llist_get(yyextra.parsetree, 0));
}
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;
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));
sdb_llist_destroy(yyextra.parsetree);
sdb_object_deref(SDB_OBJ(node));