X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffrontend%2Fgrammar.y;h=187f3599c08e2514596bd5046d653c8f03c26842;hb=d688b764f6ebf7609c79c4726d68c2e72da5ebf7;hp=6791806b0bf473593330a7c057b75644268d7d0e;hpb=499930e768ea550803018bc938783056e5921aa5;p=sysdb.git diff --git a/src/frontend/grammar.y b/src/frontend/grammar.y index 6791806..187f359 100644 --- a/src/frontend/grammar.y +++ b/src/frontend/grammar.y @@ -161,7 +161,7 @@ sdb_fe_yyerrorf(YYLTYPE *lval, sdb_fe_yyscan_t scanner, const char *fmt, ...); %type matcher compare_matcher -%type expression +%type expression object_expression %type object_type object_type_plural %type iterable @@ -171,6 +171,7 @@ sdb_fe_yyerrorf(YYLTYPE *lval, sdb_fe_yyscan_t scanner, const char *fmt, ...); %type data interval interval_elem + array array_elem_list %type datetime start_clause end_clause @@ -248,7 +249,7 @@ statements: sdb_conn_node_t *n; n = SDB_CONN_NODE(sdb_object_create_dT(/* name = */ NULL, conn_expr_t, conn_expr_destroy)); - n->cmd = CONNECTION_EXPR; + n->cmd = SDB_CONNECTION_EXPR; CONN_EXPR(n)->expr = $1; sdb_llist_append(pt, SDB_OBJ(n)); @@ -286,7 +287,7 @@ fetch_statement: CONN_FETCH($$)->host = $3; CONN_FETCH($$)->name = NULL; CONN_FETCH($$)->filter = CONN_MATCHER($4); - $$->cmd = CONNECTION_FETCH; + $$->cmd = SDB_CONNECTION_FETCH; } | FETCH object_type STRING '.' STRING filter_clause @@ -297,7 +298,7 @@ fetch_statement: CONN_FETCH($$)->host = $3; CONN_FETCH($$)->name = $5; CONN_FETCH($$)->filter = CONN_MATCHER($6); - $$->cmd = CONNECTION_FETCH; + $$->cmd = SDB_CONNECTION_FETCH; } ; @@ -313,7 +314,7 @@ list_statement: conn_list_t, conn_list_destroy)); CONN_LIST($$)->type = $2; CONN_LIST($$)->filter = CONN_MATCHER($3); - $$->cmd = CONNECTION_LIST; + $$->cmd = SDB_CONNECTION_LIST; } ; @@ -330,7 +331,7 @@ lookup_statement: CONN_LOOKUP($$)->type = $2; CONN_LOOKUP($$)->matcher = CONN_MATCHER($3); CONN_LOOKUP($$)->filter = CONN_MATCHER($4); - $$->cmd = CONNECTION_LOOKUP; + $$->cmd = SDB_CONNECTION_LOOKUP; } ; @@ -358,7 +359,7 @@ timeseries_statement: CONN_TS($$)->metric = $4; CONN_TS($$)->opts.start = $5; CONN_TS($$)->opts.end = $6; - $$->cmd = CONNECTION_TIMESERIES; + $$->cmd = SDB_CONNECTION_TIMESERIES; } ; @@ -388,7 +389,7 @@ condition: $$ = SDB_CONN_NODE(sdb_object_create_dT(/* name = */ NULL, conn_matcher_t, conn_matcher_destroy)); - $$->cmd = CONNECTION_MATCHER; + $$->cmd = SDB_CONNECTION_MATCHER; CONN_MATCHER($$)->matcher = $1; } ; @@ -515,6 +516,25 @@ expression: sdb_object_deref(SDB_OBJ($3)); $3 = NULL; } | + object_expression + { + $$ = $1; + } + | + data + { + $$ = sdb_store_expr_constvalue(&$1); + sdb_data_free_datum(&$1); + } + ; + +object_expression: + object_type '.' object_expression + { + $$ = sdb_store_expr_typed($1, $3); + sdb_object_deref(SDB_OBJ($3)); + } + | field { $$ = sdb_store_expr_fieldvalue($1); @@ -525,12 +545,6 @@ expression: $$ = sdb_store_expr_attrvalue($3); free($3); $3 = NULL; } - | - data - { - $$ = sdb_store_expr_constvalue(&$1); - sdb_data_free_datum(&$1); - } ; object_type: @@ -555,6 +569,8 @@ iterable: METRIC_T { $$ = SDB_METRIC; } | ATTRIBUTE_T { $$ = SDB_ATTRIBUTE; } + | + BACKEND_T { $$ = SDB_FIELD_BACKEND; } ; field: @@ -597,6 +613,8 @@ data: datetime { $$.type = SDB_TYPE_DATETIME; $$.data.datetime = $1; } | interval { $$ = $1; } + | + array { $$ = $1; } ; datetime: @@ -624,7 +642,7 @@ interval_elem: unit = sdb_strpunit($2); if (! unit) { sdb_fe_yyerrorf(&yylloc, scanner, - YY_("invalid time unit %s"), $2); + YY_("syntax error, invalid time unit %s"), $2); free($2); $2 = NULL; YYABORT; } @@ -641,6 +659,69 @@ interval_elem: } ; +array: + '[' array_elem_list ']' + { + $$ = $2; + } + ; + +array_elem_list: + array_elem_list ',' data + { + size_t elem_size; + + if (($3.type & SDB_TYPE_ARRAY) || (($1.type & 0xff) != $3.type)) { + sdb_fe_yyerrorf(&yylloc, scanner, YY_("syntax error, " + "cannot use element of type %s in array of type %s"), + SDB_TYPE_TO_STRING($3.type), + SDB_TYPE_TO_STRING($1.type)); + sdb_data_free_datum(&$1); + sdb_data_free_datum(&$3); + YYABORT; + } + + elem_size = sdb_data_sizeof($3.type); + $1.data.array.values = realloc($1.data.array.values, + ($1.data.array.length + 1) * elem_size); + if (! $1.data.array.values) { + sdb_fe_yyerror(&yylloc, scanner, YY_("out of memory")); + YYABORT; + } + + memcpy((char *)$1.data.array.values + + $1.data.array.length * elem_size, + &$3.data, elem_size); + ++$1.data.array.length; + + $$ = $1; + } + | + data + { + size_t elem_size; + + if ($1.type & SDB_TYPE_ARRAY) { + sdb_fe_yyerrorf(&yylloc, scanner, YY_("syntax error, " + "cannot construct array of type %s"), + SDB_TYPE_TO_STRING($1.type)); + sdb_data_free_datum(&$1); + YYABORT; + } + + $$ = $1; + $$.type = $1.type | SDB_TYPE_ARRAY; + $$.data.array.length = 1; + elem_size = sdb_data_sizeof($1.type); + $$.data.array.values = malloc(elem_size); + if (! $$.data.array.values ) { + sdb_fe_yyerror(&yylloc, scanner, YY_("out of memory")); + YYABORT; + } + memcpy($$.data.array.values, &$1.data, elem_size); + } + ; + %% void @@ -670,13 +751,15 @@ name_iter_matcher(int m_type, int type, const char *cmp, sdb_store_matcher_t *m, *tmp = NULL; assert(cb); - /* TODO: this only works as long as queries - * are limited to hosts */ + /* hosts are never iterable */ if (type == SDB_HOST) { return NULL; } - e = sdb_store_expr_fieldvalue(SDB_FIELD_NAME); + if (type == SDB_FIELD_BACKEND) + e = sdb_store_expr_fieldvalue(type); + else + e = sdb_store_expr_fieldvalue(SDB_FIELD_NAME); m = cb(e, expr); if (m_type == MATCHER_ANY) tmp = sdb_store_any_matcher(type, m);