diff --git a/base/dictionary.h b/base/dictionary.h index 253b6fbe7..7af0cf844 100644 --- a/base/dictionary.h +++ b/base/dictionary.h @@ -87,7 +87,10 @@ public: template void SetProperty(string key, const T& value) { - m_Data[key] = value; + pair::iterator, bool> ret; + ret = m_Data.insert(make_pair(key, value)); + if (!ret.second) + ret.first->second = value; } /** diff --git a/configure.ac b/configure.ac index 5577e5f1c..010e6a4da 100644 --- a/configure.ac +++ b/configure.ac @@ -24,7 +24,7 @@ AX_SET_VERSION_INFO AC_CONFIG_AUX_DIR([config]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE($PACKAGE,$VERSION) -#AM_SILENT_RULES([yes]) +AM_SILENT_RULES([yes]) AC_PROG_CXX AC_LANG_CPLUSPLUS diff --git a/dyn/Makefile.am b/dyn/Makefile.am index 3d996a8cf..5aeea9611 100644 --- a/dyn/Makefile.am +++ b/dyn/Makefile.am @@ -9,13 +9,15 @@ BUILT_SOURCES = config_parser.h AM_YFLAGS = -d libdyn_la_SOURCES = \ - configcontext.cpp \ - configcontext.h \ + configcompiler.cpp \ + configcompiler.h \ + configvm.cpp \ + configvm.h \ config_lexer.ll \ config_parser.yy \ i2-dyn.h \ - dconfigobject.cpp \ - dconfigobject.h \ + configitem.cpp \ + configitem.h \ expression.cpp \ expression.h \ expressionlist.cpp \ diff --git a/dyn/config_lexer.cc b/dyn/config_lexer.cc index b39cc60ce..3d5ac197b 100644 --- a/dyn/config_lexer.cc +++ b/dyn/config_lexer.cc @@ -529,8 +529,15 @@ static yyconst flex_int32_t yy_rule_can_match_eol[24] = using namespace icinga; -#define YY_EXTRA_TYPE ConfigContext * -#define YY_USER_ACTION yylloc->first_line = yylineno; +#define YY_EXTRA_TYPE ConfigCompiler * +#define YY_USER_ACTION \ +do { \ + yylloc->FirstLine = yylineno; \ + yylloc->FirstColumn = yycolumn; \ + yylloc->LastLine = yylineno; \ + yylloc->LastColumn = yycolumn + yyleng - 1; \ + yycolumn += yyleng; \ +} while (0); #define YY_INPUT(buf, result, max_size) \ do { \ @@ -538,7 +545,7 @@ do { \ } while (0) #define YY_NO_UNISTD_H 1 -#line 542 "config_lexer.cc" +#line 549 "config_lexer.cc" #define INITIAL 0 #define IN_C_COMMENT 1 @@ -785,9 +792,9 @@ YY_DECL register int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; -#line 41 "config_lexer.ll" +#line 48 "config_lexer.ll" -#line 791 "config_lexer.cc" +#line 798 "config_lexer.cc" yylval = yylval_param; @@ -884,127 +891,127 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 42 "config_lexer.ll" +#line 49 "config_lexer.ll" return T_ABSTRACT; YY_BREAK case 2: YY_RULE_SETUP -#line 43 "config_lexer.ll" +#line 50 "config_lexer.ll" return T_LOCAL; YY_BREAK case 3: YY_RULE_SETUP -#line 44 "config_lexer.ll" +#line 51 "config_lexer.ll" return T_OBJECT; YY_BREAK case 4: YY_RULE_SETUP -#line 45 "config_lexer.ll" +#line 52 "config_lexer.ll" return T_INCLUDE; YY_BREAK case 5: YY_RULE_SETUP -#line 46 "config_lexer.ll" +#line 53 "config_lexer.ll" return T_INHERITS; YY_BREAK case 6: YY_RULE_SETUP -#line 47 "config_lexer.ll" +#line 54 "config_lexer.ll" return T_NULL; YY_BREAK case 7: YY_RULE_SETUP -#line 48 "config_lexer.ll" +#line 55 "config_lexer.ll" { yylval->text = strdup(yytext); return T_IDENTIFIER; } YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP -#line 49 "config_lexer.ll" +#line 56 "config_lexer.ll" { yytext[yyleng-1] = '\0'; yylval->text = strdup(yytext + 1); return T_STRING; } YY_BREAK case 9: YY_RULE_SETUP -#line 50 "config_lexer.ll" +#line 57 "config_lexer.ll" { yylval->num = atoi(yytext); return T_NUMBER; } YY_BREAK case 10: YY_RULE_SETUP -#line 51 "config_lexer.ll" +#line 58 "config_lexer.ll" { yylval->op = OperatorSet; return T_EQUAL; } YY_BREAK case 11: YY_RULE_SETUP -#line 52 "config_lexer.ll" +#line 59 "config_lexer.ll" { yylval->op = OperatorPlus; return T_PLUS_EQUAL; } YY_BREAK case 12: YY_RULE_SETUP -#line 53 "config_lexer.ll" +#line 60 "config_lexer.ll" { yylval->op = OperatorMinus; return T_MINUS_EQUAL; } YY_BREAK case 13: YY_RULE_SETUP -#line 54 "config_lexer.ll" +#line 61 "config_lexer.ll" { yylval->op = OperatorMultiply; return T_MULTIPLY_EQUAL; } YY_BREAK case 14: YY_RULE_SETUP -#line 55 "config_lexer.ll" +#line 62 "config_lexer.ll" { yylval->op = OperatorDivide; return T_DIVIDE_EQUAL; } YY_BREAK case 15: YY_RULE_SETUP -#line 58 "config_lexer.ll" +#line 65 "config_lexer.ll" BEGIN(IN_C_COMMENT); YY_BREAK case 16: YY_RULE_SETUP -#line 62 "config_lexer.ll" +#line 69 "config_lexer.ll" BEGIN(INITIAL); YY_BREAK case 17: /* rule 17 can match eol */ YY_RULE_SETUP -#line 63 "config_lexer.ll" +#line 70 "config_lexer.ll" /* ignore comment */ YY_BREAK case 18: YY_RULE_SETUP -#line 64 "config_lexer.ll" +#line 71 "config_lexer.ll" /* ignore star */ YY_BREAK case 19: YY_RULE_SETUP -#line 67 "config_lexer.ll" +#line 74 "config_lexer.ll" /* ignore C++-style comments */ YY_BREAK case 20: YY_RULE_SETUP -#line 68 "config_lexer.ll" +#line 75 "config_lexer.ll" /* ignore shell-style comments */ YY_BREAK case 21: /* rule 21 can match eol */ YY_RULE_SETUP -#line 69 "config_lexer.ll" +#line 76 "config_lexer.ll" /* ignore whitespace */ YY_BREAK case 22: YY_RULE_SETUP -#line 71 "config_lexer.ll" +#line 78 "config_lexer.ll" return yytext[0]; YY_BREAK case 23: YY_RULE_SETUP -#line 72 "config_lexer.ll" +#line 79 "config_lexer.ll" ECHO; YY_BREAK -#line 1008 "config_lexer.cc" +#line 1015 "config_lexer.cc" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(IN_C_COMMENT): yyterminate(); @@ -2192,18 +2199,18 @@ void yyfree (void * ptr , yyscan_t yyscanner) #define YYTABLES_NAME "yytables" -#line 72 "config_lexer.ll" +#line 79 "config_lexer.ll" -void ConfigContext::InitializeScanner(void) +void ConfigCompiler::InitializeScanner(void) { yylex_init(&m_Scanner); yyset_extra(this,m_Scanner); } -void ConfigContext::DestroyScanner(void) +void ConfigCompiler::DestroyScanner(void) { yylex_destroy(m_Scanner); } diff --git a/dyn/config_lexer.ll b/dyn/config_lexer.ll index c0f0a0179..80918a695 100644 --- a/dyn/config_lexer.ll +++ b/dyn/config_lexer.ll @@ -23,8 +23,15 @@ using namespace icinga; -#define YY_EXTRA_TYPE ConfigContext * -#define YY_USER_ACTION yylloc->first_line = yylineno; +#define YY_EXTRA_TYPE ConfigCompiler * +#define YY_USER_ACTION \ +do { \ + yylloc->FirstLine = yylineno; \ + yylloc->FirstColumn = yycolumn; \ + yylloc->LastLine = yylineno; \ + yylloc->LastColumn = yycolumn + yyleng - 1; \ + yycolumn += yyleng; \ +} while (0); #define YY_INPUT(buf, result, max_size) \ do { \ @@ -72,13 +79,13 @@ null return T_NULL; %% -void ConfigContext::InitializeScanner(void) +void ConfigCompiler::InitializeScanner(void) { yylex_init(&m_Scanner); yyset_extra(this, m_Scanner); } -void ConfigContext::DestroyScanner(void) +void ConfigCompiler::DestroyScanner(void) { yylex_destroy(m_Scanner); } diff --git a/dyn/config_parser.cc b/dyn/config_parser.cc index 6f683db75..d18795ac8 100644 --- a/dyn/config_parser.cc +++ b/dyn/config_parser.cc @@ -65,7 +65,31 @@ /* Copy the first part of user declarations. */ + /* Line 268 of yacc.c */ +#line 71 "config_parser.cc" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +/* "%code requires" blocks. */ + +/* Line 288 of yacc.c */ #line 1 "config_parser.yy" /****************************************************************************** @@ -91,29 +115,13 @@ using namespace icinga; +#define YYLTYPE DebugInfo -/* Line 268 of yacc.c */ -#line 98 "config_parser.cc" -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 1 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif +/* Line 288 of yacc.c */ +#line 125 "config_parser.cc" /* Tokens. */ #ifndef YYTOKENTYPE @@ -161,7 +169,7 @@ typedef union YYSTYPE { /* Line 293 of yacc.c */ -#line 36 "config_parser.yy" +#line 38 "config_parser.yy" char *text; int num; @@ -171,7 +179,7 @@ typedef union YYSTYPE /* Line 293 of yacc.c */ -#line 175 "config_parser.cc" +#line 183 "config_parser.cc" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -195,12 +203,12 @@ typedef struct YYLTYPE /* Copy the second part of user declarations. */ /* Line 343 of yacc.c */ -#line 64 "config_parser.yy" +#line 66 "config_parser.yy" int yylex(YYSTYPE *lvalp, YYLTYPE *llocp, void *scanner); -void yyerror(YYLTYPE *locp, ConfigContext *context, const char *err) +void yyerror(YYLTYPE *locp, ConfigCompiler *context, const char *err) { stringstream message; @@ -212,25 +220,29 @@ void yyerror(YYLTYPE *locp, ConfigContext *context, const char *err) throw runtime_error(message.str()); } -int yyparse(ConfigContext *context); - -void ConfigContext::Compile(void) -{ - yyparse(this); -} - -#define scanner (context->GetScanner()) +int yyparse(ConfigCompiler *context); static stack m_ExpressionLists; -static set m_Objects; -static DConfigObject::Ptr m_Object; +static vector m_Objects; +static ConfigItem::Ptr m_Object; static bool m_Abstract; static bool m_Local; static Dictionary::Ptr m_Array; +void ConfigCompiler::Compile(void) +{ + m_Objects.clear(); + yyparse(this); + SetResult(m_Objects); + m_Objects.clear(); +} + +#define scanner (context->GetScanner()) + + /* Line 343 of yacc.c */ -#line 234 "config_parser.cc" +#line 246 "config_parser.cc" #ifdef short # undef short @@ -533,11 +545,11 @@ static const yytype_int8 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 98, 98, 99, 105, 105, 108, 112, 117, 112, - 148, 149, 152, 156, 162, 163, 166, 172, 173, 177, - 176, 188, 189, 190, 193, 201, 214, 223, 224, 225, - 226, 227, 233, 237, 241, 247, 248, 249, 256, 255, - 267, 273, 275, 276 + 0, 104, 104, 105, 108, 108, 111, 115, 120, 115, + 150, 151, 154, 158, 164, 165, 168, 175, 176, 180, + 179, 191, 192, 193, 196, 204, 218, 227, 228, 229, + 230, 231, 237, 242, 246, 252, 253, 254, 261, 260, + 272, 278, 280, 281 }; #endif @@ -803,7 +815,7 @@ do { \ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, ConfigContext *context) +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, ConfigCompiler *context) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, context) @@ -811,7 +823,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, context) int yytype; YYSTYPE const * const yyvaluep; YYLTYPE const * const yylocationp; - ConfigContext *context; + ConfigCompiler *context; #endif { if (!yyvaluep) @@ -839,7 +851,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, context) #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, ConfigContext *context) +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, ConfigCompiler *context) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp, context) @@ -847,7 +859,7 @@ yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp, context) int yytype; YYSTYPE const * const yyvaluep; YYLTYPE const * const yylocationp; - ConfigContext *context; + ConfigCompiler *context; #endif { if (yytype < YYNTOKENS) @@ -900,14 +912,14 @@ do { \ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, ConfigContext *context) +yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, ConfigCompiler *context) #else static void yy_reduce_print (yyvsp, yylsp, yyrule, context) YYSTYPE *yyvsp; YYLTYPE *yylsp; int yyrule; - ConfigContext *context; + ConfigCompiler *context; #endif { int yynrhs = yyr2[yyrule]; @@ -1206,7 +1218,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, ConfigContext *context) +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, ConfigCompiler *context) #else static void yydestruct (yymsg, yytype, yyvaluep, yylocationp, context) @@ -1214,7 +1226,7 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp, context) int yytype; YYSTYPE *yyvaluep; YYLTYPE *yylocationp; - ConfigContext *context; + ConfigCompiler *context; #endif { YYUSE (yyvaluep); @@ -1243,7 +1255,7 @@ int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus -int yyparse (ConfigContext *context); +int yyparse (ConfigCompiler *context); #else int yyparse (); #endif @@ -1268,11 +1280,11 @@ yyparse (YYPARSE_PARAM) #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int -yyparse (ConfigContext *context) +yyparse (ConfigCompiler *context) #else int yyparse (context) - ConfigContext *context; + ConfigCompiler *context; #endif #endif { @@ -1551,19 +1563,10 @@ yyreduce: YY_REDUCE_PRINT (yyn); switch (yyn) { - case 3: + case 7: /* Line 1806 of yacc.c */ -#line 100 "config_parser.yy" - { - context->SetResult(m_Objects); - } - break; - - case 7: - -/* Line 1806 of yacc.c */ -#line 112 "config_parser.yy" +#line 115 "config_parser.yy" { m_Abstract = false; m_Local = false; @@ -1573,9 +1576,9 @@ yyreduce: case 8: /* Line 1806 of yacc.c */ -#line 117 "config_parser.yy" +#line 120 "config_parser.yy" { - m_Object = make_shared((yyvsp[(4) - (5)].text), (yyvsp[(5) - (5)].text), yylloc.first_line); + m_Object = make_shared((yyvsp[(4) - (5)].text), (yyvsp[(5) - (5)].text), yylloc); free((yyvsp[(4) - (5)].text)); free((yyvsp[(5) - (5)].text)); } @@ -1584,28 +1587,27 @@ yyreduce: case 9: /* Line 1806 of yacc.c */ -#line 123 "config_parser.yy" +#line 126 "config_parser.yy" { Object::Ptr exprl_object = *(yyvsp[(8) - (8)].variant); delete (yyvsp[(8) - (8)].variant); ExpressionList::Ptr exprl = dynamic_pointer_cast(exprl_object); - Expression typeexpr("__type", OperatorSet, m_Object->GetType(), yylloc.first_line); + Expression typeexpr("__type", OperatorSet, m_Object->GetType(), yylloc); exprl->AddExpression(typeexpr); - Expression nameexpr("__name", OperatorSet, m_Object->GetName(), yylloc.first_line); + Expression nameexpr("__name", OperatorSet, m_Object->GetName(), yylloc); exprl->AddExpression(nameexpr); - Expression abstractexpr("__abstract", OperatorSet, m_Abstract ? 1 : 0, yylloc.first_line); + Expression abstractexpr("__abstract", OperatorSet, m_Abstract ? 1 : 0, yylloc); exprl->AddExpression(abstractexpr); - Expression localexpr("__local", OperatorSet, m_Local ? 1 : 0, yylloc.first_line); + Expression localexpr("__local", OperatorSet, m_Local ? 1 : 0, yylloc); exprl->AddExpression(localexpr); m_Object->SetExpressionList(exprl); - DConfigObject::AddObject(m_Object); - m_Objects.insert(m_Object); + m_Objects.push_back(m_Object); m_Object.reset(); } break; @@ -1613,7 +1615,7 @@ yyreduce: case 12: /* Line 1806 of yacc.c */ -#line 153 "config_parser.yy" +#line 155 "config_parser.yy" { m_Abstract = true; } @@ -1622,7 +1624,7 @@ yyreduce: case 13: /* Line 1806 of yacc.c */ -#line 157 "config_parser.yy" +#line 159 "config_parser.yy" { m_Local = true; } @@ -1631,16 +1633,17 @@ yyreduce: case 16: /* Line 1806 of yacc.c */ -#line 167 "config_parser.yy" +#line 169 "config_parser.yy" { m_Object->AddParent((yyvsp[(1) - (1)].text)); + free((yyvsp[(1) - (1)].text)); } break; case 19: /* Line 1806 of yacc.c */ -#line 177 "config_parser.yy" +#line 180 "config_parser.yy" { m_ExpressionLists.push(make_shared()); } @@ -1649,7 +1652,7 @@ yyreduce: case 20: /* Line 1806 of yacc.c */ -#line 182 "config_parser.yy" +#line 185 "config_parser.yy" { (yyval.variant) = new Variant(m_ExpressionLists.top()); m_ExpressionLists.pop(); @@ -1659,9 +1662,9 @@ yyreduce: case 24: /* Line 1806 of yacc.c */ -#line 194 "config_parser.yy" +#line 197 "config_parser.yy" { - Expression expr((yyvsp[(1) - (3)].text), (yyvsp[(2) - (3)].op), *(yyvsp[(3) - (3)].variant), yylloc.first_line); + Expression expr((yyvsp[(1) - (3)].text), (yyvsp[(2) - (3)].op), *(yyvsp[(3) - (3)].variant), yylloc); free((yyvsp[(1) - (3)].text)); delete (yyvsp[(3) - (3)].variant); @@ -1672,16 +1675,17 @@ yyreduce: case 25: /* Line 1806 of yacc.c */ -#line 202 "config_parser.yy" +#line 205 "config_parser.yy" { - Expression subexpr((yyvsp[(3) - (6)].text), (yyvsp[(5) - (6)].op), *(yyvsp[(6) - (6)].variant), yylloc.first_line); + Expression subexpr((yyvsp[(3) - (6)].text), (yyvsp[(5) - (6)].op), *(yyvsp[(6) - (6)].variant), yylloc); free((yyvsp[(3) - (6)].text)); delete (yyvsp[(6) - (6)].variant); ExpressionList::Ptr subexprl = make_shared(); subexprl->AddExpression(subexpr); - Expression expr((yyvsp[(1) - (6)].text), OperatorPlus, subexprl, yylloc.first_line); + Expression expr((yyvsp[(1) - (6)].text), OperatorPlus, subexprl, yylloc); + free((yyvsp[(1) - (6)].text)); m_ExpressionLists.top()->AddExpression(expr); } @@ -1690,11 +1694,11 @@ yyreduce: case 26: /* Line 1806 of yacc.c */ -#line 215 "config_parser.yy" +#line 219 "config_parser.yy" { - Expression expr((yyvsp[(1) - (1)].text), OperatorSet, (yyvsp[(1) - (1)].text), yylloc.first_line); + Expression expr((yyvsp[(1) - (1)].text), OperatorSet, (yyvsp[(1) - (1)].text), yylloc); free((yyvsp[(1) - (1)].text)); - + m_ExpressionLists.top()->AddExpression(expr); } break; @@ -1702,7 +1706,7 @@ yyreduce: case 31: /* Line 1806 of yacc.c */ -#line 228 "config_parser.yy" +#line 232 "config_parser.yy" { (yyval.op) = (yyvsp[(1) - (1)].op); } @@ -1711,16 +1715,17 @@ yyreduce: case 32: /* Line 1806 of yacc.c */ -#line 234 "config_parser.yy" +#line 238 "config_parser.yy" { (yyval.variant) = new Variant((yyvsp[(1) - (1)].text)); + free((yyvsp[(1) - (1)].text)); } break; case 33: /* Line 1806 of yacc.c */ -#line 238 "config_parser.yy" +#line 243 "config_parser.yy" { (yyval.variant) = new Variant((yyvsp[(1) - (1)].num)); } @@ -1729,7 +1734,7 @@ yyreduce: case 34: /* Line 1806 of yacc.c */ -#line 242 "config_parser.yy" +#line 247 "config_parser.yy" { (yyval.variant) = new Variant(); } @@ -1738,7 +1743,7 @@ yyreduce: case 37: /* Line 1806 of yacc.c */ -#line 250 "config_parser.yy" +#line 255 "config_parser.yy" { (yyval.variant) = (yyvsp[(1) - (1)].variant); } @@ -1747,7 +1752,7 @@ yyreduce: case 38: /* Line 1806 of yacc.c */ -#line 256 "config_parser.yy" +#line 261 "config_parser.yy" { m_Array = make_shared(); } @@ -1756,7 +1761,7 @@ yyreduce: case 39: /* Line 1806 of yacc.c */ -#line 261 "config_parser.yy" +#line 266 "config_parser.yy" { (yyval.variant) = new Variant(m_Array); m_Array.reset(); @@ -1766,7 +1771,7 @@ yyreduce: case 40: /* Line 1806 of yacc.c */ -#line 268 "config_parser.yy" +#line 273 "config_parser.yy" { m_Array->AddUnnamedProperty(*(yyvsp[(1) - (1)].variant)); delete (yyvsp[(1) - (1)].variant); @@ -1776,7 +1781,7 @@ yyreduce: /* Line 1806 of yacc.c */ -#line 1780 "config_parser.cc" +#line 1785 "config_parser.cc" default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -2014,6 +2019,6 @@ yyreturn: /* Line 2067 of yacc.c */ -#line 278 "config_parser.yy" +#line 283 "config_parser.yy" diff --git a/dyn/config_parser.h b/dyn/config_parser.h index 00f35c165..3eb48bf15 100644 --- a/dyn/config_parser.h +++ b/dyn/config_parser.h @@ -30,6 +30,41 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ +/* "%code requires" blocks. */ + +/* Line 2068 of yacc.c */ +#line 1 "config_parser.yy" + +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "i2-dyn.h" + +using namespace icinga; + +#define YYLTYPE DebugInfo + + + + +/* Line 2068 of yacc.c */ +#line 68 "config_parser.h" /* Tokens. */ #ifndef YYTOKENTYPE @@ -77,7 +112,7 @@ typedef union YYSTYPE { /* Line 2068 of yacc.c */ -#line 36 "config_parser.yy" +#line 38 "config_parser.yy" char *text; int num; @@ -87,7 +122,7 @@ typedef union YYSTYPE /* Line 2068 of yacc.c */ -#line 91 "config_parser.h" +#line 126 "config_parser.h" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ diff --git a/dyn/config_parser.yy b/dyn/config_parser.yy index afd18e906..2ca7aab25 100644 --- a/dyn/config_parser.yy +++ b/dyn/config_parser.yy @@ -1,4 +1,4 @@ -%{ +%code requires { /****************************************************************************** * Icinga 2 * * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * @@ -22,7 +22,9 @@ using namespace icinga; -%} +#define YYLTYPE DebugInfo + +} %pure-parser @@ -30,7 +32,7 @@ using namespace icinga; %defines %error-verbose -%parse-param { ConfigContext *context } +%parse-param { ConfigCompiler *context } %lex-param { void *scanner } %union { @@ -65,7 +67,7 @@ using namespace icinga; int yylex(YYSTYPE *lvalp, YYLTYPE *llocp, void *scanner); -void yyerror(YYLTYPE *locp, ConfigContext *context, const char *err) +void yyerror(YYLTYPE *locp, ConfigCompiler *context, const char *err) { stringstream message; @@ -77,29 +79,30 @@ void yyerror(YYLTYPE *locp, ConfigContext *context, const char *err) throw runtime_error(message.str()); } -int yyparse(ConfigContext *context); +int yyparse(ConfigCompiler *context); -void ConfigContext::Compile(void) +static stack m_ExpressionLists; +static vector m_Objects; +static ConfigItem::Ptr m_Object; +static bool m_Abstract; +static bool m_Local; +static Dictionary::Ptr m_Array; + +void ConfigCompiler::Compile(void) { + m_Objects.clear(); yyparse(this); + SetResult(m_Objects); + m_Objects.clear(); } #define scanner (context->GetScanner()) -static stack m_ExpressionLists; -static set m_Objects; -static DConfigObject::Ptr m_Object; -static bool m_Abstract; -static bool m_Local; -static Dictionary::Ptr m_Array; %} %% statements: /* empty */ | statements statement - { - context->SetResult(m_Objects); - } ; statement: object | include @@ -115,7 +118,7 @@ object: } attributes T_OBJECT T_IDENTIFIER T_STRING { - m_Object = make_shared($4, $5, yylloc.first_line); + m_Object = make_shared($4, $5, yylloc); free($4); free($5); } @@ -125,22 +128,21 @@ inherits_specifier expressionlist delete $8; ExpressionList::Ptr exprl = dynamic_pointer_cast(exprl_object); - Expression typeexpr("__type", OperatorSet, m_Object->GetType(), yylloc.first_line); + Expression typeexpr("__type", OperatorSet, m_Object->GetType(), yylloc); exprl->AddExpression(typeexpr); - Expression nameexpr("__name", OperatorSet, m_Object->GetName(), yylloc.first_line); + Expression nameexpr("__name", OperatorSet, m_Object->GetName(), yylloc); exprl->AddExpression(nameexpr); - Expression abstractexpr("__abstract", OperatorSet, m_Abstract ? 1 : 0, yylloc.first_line); + Expression abstractexpr("__abstract", OperatorSet, m_Abstract ? 1 : 0, yylloc); exprl->AddExpression(abstractexpr); - Expression localexpr("__local", OperatorSet, m_Local ? 1 : 0, yylloc.first_line); + Expression localexpr("__local", OperatorSet, m_Local ? 1 : 0, yylloc); exprl->AddExpression(localexpr); m_Object->SetExpressionList(exprl); - DConfigObject::AddObject(m_Object); - m_Objects.insert(m_Object); + m_Objects.push_back(m_Object); m_Object.reset(); } ; @@ -166,6 +168,7 @@ inherits_list: inherits_item inherits_item: T_STRING { m_Object->AddParent($1); + free($1); } ; @@ -192,7 +195,7 @@ expressions: /* empty */ expression: T_IDENTIFIER operator value { - Expression expr($1, $2, *$3, yylloc.first_line); + Expression expr($1, $2, *$3, yylloc); free($1); delete $3; @@ -200,22 +203,23 @@ expression: T_IDENTIFIER operator value } | T_IDENTIFIER '[' T_STRING ']' operator value { - Expression subexpr($3, $5, *$6, yylloc.first_line); + Expression subexpr($3, $5, *$6, yylloc); free($3); delete $6; ExpressionList::Ptr subexprl = make_shared(); subexprl->AddExpression(subexpr); - Expression expr($1, OperatorPlus, subexprl, yylloc.first_line); + Expression expr($1, OperatorPlus, subexprl, yylloc); + free($1); m_ExpressionLists.top()->AddExpression(expr); } | T_STRING { - Expression expr($1, OperatorSet, $1, yylloc.first_line); + Expression expr($1, OperatorSet, $1, yylloc); free($1); - + m_ExpressionLists.top()->AddExpression(expr); } ; @@ -233,6 +237,7 @@ operator: T_EQUAL simplevalue: T_STRING { $$ = new Variant($1); + free($1); } | T_NUMBER { diff --git a/dyn/configcompiler.cpp b/dyn/configcompiler.cpp index e3ae4b97f..e236dacb4 100644 --- a/dyn/configcompiler.cpp +++ b/dyn/configcompiler.cpp @@ -1,36 +1,74 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + #include "i2-dyn.h" using namespace icinga; -ConfigContext::ConfigContext(istream *input) +ConfigCompiler::ConfigCompiler(istream *input) { m_Input = input; InitializeScanner(); } -ConfigContext::~ConfigContext(void) +ConfigCompiler::~ConfigCompiler(void) { DestroyScanner(); } -size_t ConfigContext::ReadInput(char *buffer, size_t max_size) +size_t ConfigCompiler::ReadInput(char *buffer, size_t max_size) { m_Input->read(buffer, max_size); return m_Input->gcount(); } -void *ConfigContext::GetScanner(void) const +void *ConfigCompiler::GetScanner(void) const { return m_Scanner; } -void ConfigContext::SetResult(set result) +void ConfigCompiler::SetResult(vector result) { m_Result = result; } -set ConfigContext::GetResult(void) const +vector ConfigCompiler::GetResult(void) const { - return m_Result; + return m_Result; } +vector ConfigCompiler::CompileStream(istream *stream) +{ + ConfigCompiler ctx(stream); + ctx.Compile(); + return ctx.GetResult(); +} + +vector ConfigCompiler::CompileFile(string filename) +{ + ifstream stream; + stream.open(filename, ifstream::in); + return CompileStream(&stream); +} + +vector ConfigCompiler::CompileText(string text) +{ + stringstream stream(text); + return CompileStream(&stream); +} diff --git a/dyn/configcompiler.h b/dyn/configcompiler.h index 2b0fd921d..8b1f353cd 100644 --- a/dyn/configcompiler.h +++ b/dyn/configcompiler.h @@ -17,22 +17,26 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ -#ifndef CONFIGCONTEXT_H -#define CONFIGCONTEXT_H +#ifndef CONFIGCOMPILER_H +#define CONFIGCOMPILER_H namespace icinga { -class I2_DYN_API ConfigContext +class I2_DYN_API ConfigCompiler { public: - ConfigContext(istream *input = &cin); - virtual ~ConfigContext(void); + ConfigCompiler(istream *input = &cin); + virtual ~ConfigCompiler(void); void Compile(void); - void SetResult(set result); - set GetResult(void) const; + static vector CompileStream(istream *stream); + static vector CompileFile(string filename); + static vector CompileText(string text); + + void SetResult(vector result); + vector GetResult(void) const; size_t ReadInput(char *buffer, size_t max_bytes); void *GetScanner(void) const; @@ -40,7 +44,7 @@ public: private: istream *m_Input; void *m_Scanner; - set m_Result; + vector m_Result; void InitializeScanner(void); void DestroyScanner(void); @@ -48,4 +52,4 @@ private: } -#endif /* CONFIGCONTEXT_H */ +#endif /* CONFIGCOMPILER_H */ diff --git a/dyn/configitem.cpp b/dyn/configitem.cpp index 0f34e3558..d87610019 100644 --- a/dyn/configitem.cpp +++ b/dyn/configitem.cpp @@ -1,53 +1,72 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + #include "i2-dyn.h" using namespace icinga; -DConfigObject::DConfigObject(string type, string name, long debuginfo) +ConfigItem::ConfigItem(string type, string name, DebugInfo debuginfo) : m_Type(type), m_Name(name), m_DebugInfo(debuginfo) { } -string DConfigObject::GetType(void) const +string ConfigItem::GetType(void) const { return m_Type; } -string DConfigObject::GetName(void) const +string ConfigItem::GetName(void) const { return m_Name; } -ExpressionList::Ptr DConfigObject::GetExpressionList(void) const +ExpressionList::Ptr ConfigItem::GetExpressionList(void) const { return m_ExpressionList; } -void DConfigObject::SetExpressionList(const ExpressionList::Ptr& exprl) +void ConfigItem::SetExpressionList(const ExpressionList::Ptr& exprl) { m_ExpressionList = exprl; } -vector DConfigObject::GetParents(void) const +vector ConfigItem::GetParents(void) const { return m_Parents; } -void DConfigObject::AddParent(string parent) +void ConfigItem::AddParent(string parent) { m_Parents.push_back(parent); } -Dictionary::Ptr DConfigObject::CalculateProperties(void) const +Dictionary::Ptr ConfigItem::CalculateProperties(void) const { Dictionary::Ptr result = make_shared(); vector::const_iterator it; for (it = m_Parents.begin(); it != m_Parents.end(); it++) { - DConfigObject::Ptr parent = DConfigObject::GetObject(GetType(), *it); + ConfigItem::Ptr parent = ConfigItem::GetObject(GetType(), *it); if (!parent) { stringstream message; - message << "Parent object '" << *it << "' does not exist (in line " << m_DebugInfo << ")"; + message << "Parent object '" << *it << "' does not exist (" << m_DebugInfo << ")"; throw domain_error(message.str()); } @@ -59,56 +78,79 @@ Dictionary::Ptr DConfigObject::CalculateProperties(void) const return result; } -ObjectSet::Ptr DConfigObject::GetAllObjects(void) +ObjectSet::Ptr ConfigItem::GetAllObjects(void) { - static ObjectSet::Ptr allObjects; + static ObjectSet::Ptr allObjects; if (!allObjects) { - allObjects = make_shared >(); + allObjects = make_shared >(); allObjects->Start(); } return allObjects; } -bool DConfigObject::GetTypeAndName(const DConfigObject::Ptr& object, pair *key) +bool ConfigItem::GetTypeAndName(const ConfigItem::Ptr& object, pair *key) { *key = make_pair(object->GetType(), object->GetName()); return true; } -ObjectMap, DConfigObject::Ptr>::Ptr DConfigObject::GetObjectsByTypeAndName(void) +ConfigItem::TNMap::Ptr ConfigItem::GetObjectsByTypeAndName(void) { - static ObjectMap, DConfigObject::Ptr>::Ptr tnmap; + static ConfigItem::TNMap::Ptr tnmap; if (!tnmap) { - tnmap = make_shared, DConfigObject::Ptr> >(GetAllObjects(), &DConfigObject::GetTypeAndName); + tnmap = make_shared(GetAllObjects(), &ConfigItem::GetTypeAndName); tnmap->Start(); } return tnmap; } -void DConfigObject::AddObject(DConfigObject::Ptr object) +void ConfigItem::Commit(void) { - GetAllObjects()->AddObject(object); + DynamicObject::Ptr dobj = m_DynamicObject.lock(); + + if (!dobj) { + dobj = DynamicObject::GetObject(GetType(), GetName()); + + if (!dobj) + dobj = make_shared(); + + m_DynamicObject = dobj; + } + + dobj->SetConfig(CalculateProperties()); + dobj->Commit(); + + ConfigItem::Ptr ci = GetObject(GetType(), GetName()); + ConfigItem::Ptr self = static_pointer_cast(shared_from_this()); + if (ci && ci != self) { + ci->m_DynamicObject.reset(); + GetAllObjects()->RemoveObject(ci); + } + GetAllObjects()->CheckObject(self); } -void DConfigObject::RemoveObject(DConfigObject::Ptr object) +void ConfigItem::Unregister(void) { - throw logic_error("not implemented."); + // TODO: unregister associated DynamicObject + + ConfigItem::Ptr self = static_pointer_cast(shared_from_this()); + GetAllObjects()->RemoveObject(self); } -DConfigObject::Ptr DConfigObject::GetObject(string type, string name) +ConfigItem::Ptr ConfigItem::GetObject(string type, string name) { - ObjectMap, DConfigObject::Ptr>::Range range; + ConfigItem::TNMap::Range range; range = GetObjectsByTypeAndName()->GetRange(make_pair(type, name)); assert(distance(range.first, range.second) <= 1); if (range.first == range.second) - return DConfigObject::Ptr(); + return ConfigItem::Ptr(); else return range.first->second; } diff --git a/dyn/configitem.h b/dyn/configitem.h index c5c54f382..aa9aa259c 100644 --- a/dyn/configitem.h +++ b/dyn/configitem.h @@ -1,15 +1,36 @@ -#ifndef DCONFIGOBJECT_H -#define DCONFIGOBJECT_H +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#ifndef CONFIGITEM_H +#define CONFIGITEM_H namespace icinga { -class DConfigObject : public Object { +class ConfigItem : public Object { public: - typedef shared_ptr Ptr; - typedef weak_ptr WeakPtr; + typedef shared_ptr Ptr; + typedef weak_ptr WeakPtr; - DConfigObject(string type, string name, long debuginfo); + typedef ObjectMap, ConfigItem::Ptr> TNMap; + + ConfigItem(string type, string name, DebugInfo debuginfo); string GetType(void) const; string GetName(void) const; @@ -22,23 +43,26 @@ public: Dictionary::Ptr CalculateProperties(void) const; - static ObjectSet::Ptr GetAllObjects(void); - static ObjectMap, DConfigObject::Ptr>::Ptr GetObjectsByTypeAndName(void); - static void AddObject(DConfigObject::Ptr object); - static void RemoveObject(DConfigObject::Ptr object); - static DConfigObject::Ptr GetObject(string type, string name); + void Commit(void); + void Unregister(void); + + static ObjectSet::Ptr GetAllObjects(void); + static TNMap::Ptr GetObjectsByTypeAndName(void); + static ConfigItem::Ptr GetObject(string type, string name); private: string m_Type; string m_Name; - long m_DebugInfo; + DebugInfo m_DebugInfo; vector m_Parents; ExpressionList::Ptr m_ExpressionList; - static bool GetTypeAndName(const DConfigObject::Ptr& object, pair *key); + DynamicObject::WeakPtr m_DynamicObject; + + static bool GetTypeAndName(const ConfigItem::Ptr& object, pair *key); }; } -#endif /* DCONFIGOBJECT_H */ +#endif /* CONFIGITEM_H */ diff --git a/dyn/dynamicobject.cpp b/dyn/dynamicobject.cpp index fc31187cb..cc877ac3c 100644 --- a/dyn/dynamicobject.cpp +++ b/dyn/dynamicobject.cpp @@ -26,6 +26,11 @@ DynamicObject::DynamicObject(void) { } +void DynamicObject::SetConfig(Dictionary::Ptr config) +{ + m_Config = config; +} + Dictionary::Ptr DynamicObject::GetConfig(void) const { return m_Config; @@ -36,16 +41,32 @@ Dictionary::Ptr DynamicObject::GetTags(void) const return m_Tags; } +string DynamicObject::GetType(void) const +{ + string type; + GetConfig()->GetProperty("__type", &type); + return type; +} + +string DynamicObject::GetName(void) const +{ + string name; + GetConfig()->GetProperty("__name", &name); + return name; +} + void DynamicObject::Commit(void) { + DynamicObject::Ptr dobj = GetObject(GetType(), GetName()); DynamicObject::Ptr self = static_pointer_cast(shared_from_this()); - DynamicObject::GetAllObjects()->CheckObject(self); + assert(!dobj || dobj == self); + GetAllObjects()->CheckObject(self); } void DynamicObject::Unregister(void) { DynamicObject::Ptr self = static_pointer_cast(shared_from_this()); - DynamicObject::GetAllObjects()->RemoveObject(self); + GetAllObjects()->RemoveObject(self); } ObjectSet::Ptr DynamicObject::GetAllObjects(void) @@ -59,3 +80,36 @@ ObjectSet::Ptr DynamicObject::GetAllObjects(void) return allObjects; } + +DynamicObject::TNMap::Ptr DynamicObject::GetObjectsByTypeAndName(void) +{ + static DynamicObject::TNMap::Ptr tnmap; + + if (!tnmap) { + tnmap = make_shared(GetAllObjects(), &DynamicObject::GetTypeAndName); + tnmap->Start(); + } + + return tnmap; +} + +DynamicObject::Ptr DynamicObject::GetObject(string type, string name) +{ + DynamicObject::TNMap::Range range; + range = GetObjectsByTypeAndName()->GetRange(make_pair(type, name)); + + assert(distance(range.first, range.second) <= 1); + + if (range.first == range.second) + return DynamicObject::Ptr(); + else + return range.first->second; +} + +bool DynamicObject::GetTypeAndName(const DynamicObject::Ptr& object, pair *key) +{ + *key = make_pair(object->GetType(), object->GetName()); + + return true; +} + diff --git a/dyn/dynamicobject.h b/dyn/dynamicobject.h index 6813dfe54..719a9df29 100644 --- a/dyn/dynamicobject.h +++ b/dyn/dynamicobject.h @@ -29,19 +29,30 @@ public: typedef shared_ptr Ptr; typedef weak_ptr WeakPtr; + typedef ObjectMap, DynamicObject::Ptr> TNMap; + DynamicObject(void); + void SetConfig(Dictionary::Ptr config); Dictionary::Ptr GetConfig(void) const; + Dictionary::Ptr GetTags(void) const; + string GetType(void) const; + string GetName(void) const; + void Commit(void); void Unregister(void); static ObjectSet::Ptr GetAllObjects(void); + static TNMap::Ptr GetObjectsByTypeAndName(void); + static DynamicObject::Ptr GetObject(string type, string name); private: Dictionary::Ptr m_Config; Dictionary::Ptr m_Tags; + + static bool GetTypeAndName(const DynamicObject::Ptr& object, pair *key); }; } diff --git a/dyn/expression.cpp b/dyn/expression.cpp index 2bf3a0599..5a0ed6bb3 100644 --- a/dyn/expression.cpp +++ b/dyn/expression.cpp @@ -21,23 +21,23 @@ using namespace icinga; -Expression::Expression(string key, ExpressionOperator op, Variant value, long debuginfo) - : Key(key), Operator(op), Value(value), DebugInfo(debuginfo) +Expression::Expression(string key, ExpressionOperator op, const Variant& value, const DebugInfo& debuginfo) + : m_Key(key), m_Operator(op), m_Value(value), m_DebugInfo(debuginfo) { } void Expression::Execute(const Dictionary::Ptr& dictionary) const { Variant oldValue, newValue; - dictionary->GetProperty(Key, &oldValue); + dictionary->GetProperty(m_Key, &oldValue); ExpressionList::Ptr exprl; - if (Value.GetType() == VariantObject) - exprl = dynamic_pointer_cast(Value.GetObject()); + if (m_Value.GetType() == VariantObject) + exprl = dynamic_pointer_cast(m_Value.GetObject()); - newValue = Value; + newValue = m_Value; - switch (Operator) { + switch (m_Operator) { case OperatorSet: if (exprl) { Dictionary::Ptr dict = make_shared(); @@ -56,7 +56,7 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const if (!dict) { if (!oldValue.IsEmpty()) { stringstream message; - message << "Wrong argument types for += (non-dictionary and dictionary) (in line " << DebugInfo << ")"; + message << "Wrong argument types for += (non-dictionary and dictionary) (" << m_DebugInfo << ")"; throw domain_error(message.str()); } @@ -67,7 +67,7 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const newValue = dict; } else { stringstream message; - message << "+= only works for dictionaries (in line " << DebugInfo << ")"; + message << "+= only works for dictionaries (" << m_DebugInfo << ")"; throw domain_error(message.str()); } @@ -79,5 +79,5 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const break; } - dictionary->SetProperty(Key, newValue); + dictionary->SetProperty(m_Key, newValue); } diff --git a/dyn/expression.h b/dyn/expression.h index cf7053e61..e6ec75eae 100644 --- a/dyn/expression.h +++ b/dyn/expression.h @@ -34,14 +34,16 @@ enum ExpressionOperator struct I2_DYN_API Expression { - string Key; - ExpressionOperator Operator; - Variant Value; - long DebugInfo; - - Expression(string key, ExpressionOperator op, Variant value, long debuginfo); +public: + Expression(string key, ExpressionOperator op, const Variant& value, const DebugInfo& debuginfo); void Execute(const Dictionary::Ptr& dictionary) const; + +private: + string m_Key; + ExpressionOperator m_Operator; + Variant m_Value; + DebugInfo m_DebugInfo; }; } diff --git a/dyn/i2-dyn.h b/dyn/i2-dyn.h index 970d3f889..da65f7d68 100644 --- a/dyn/i2-dyn.h +++ b/dyn/i2-dyn.h @@ -30,6 +30,7 @@ #include #include +#include #ifdef I2_DYN_BUILD # define I2_DYN_API I2_EXPORT @@ -37,12 +38,14 @@ # define I2_DYN_API I2_IMPORT #endif /* I2_DYN_BUILD */ +#include "debuginfo.h" #include "expression.h" #include "expressionlist.h" #include "objectset.h" #include "objectmap.h" #include "dynamicobject.h" -#include "dconfigobject.h" -#include "configcontext.h" +#include "configitem.h" +#include "configcompiler.h" +#include "configvm.h" #endif /* I2DYN_H */ diff --git a/dyntest/dyntest.cpp b/dyntest/dyntest.cpp index b08dda6d2..b132b0841 100644 --- a/dyntest/dyntest.cpp +++ b/dyntest/dyntest.cpp @@ -5,20 +5,23 @@ using namespace icinga; int main(int argc, char **argv) { - ConfigContext ctx; - ctx.Compile(); - set objects = ctx.GetResult(); + if (argc < 2) { + cout << "Syntax: " << argv[0] << " " << endl; + return 1; + } - for (auto it = objects.begin(); it != objects.end(); it++) { - DConfigObject::Ptr obj = *it; + for (int i = 0; i < 10; i++) { + vector objects = ConfigCompiler::CompileFile(string(argv[1])); + + ConfigVM::ExecuteItems(objects); + } + + ObjectSet::Iterator it; + for (it = DynamicObject::GetAllObjects()->Begin(); it != DynamicObject::GetAllObjects()->End(); it++) { + DynamicObject::Ptr obj = *it; cout << "Object, name: " << obj->GetName() << ", type: " << obj->GetType() << endl; - cout << "\t" << obj->GetParents().size() << " parents" << endl; - cout << "\t" << obj->GetExpressionList()->GetLength() << " top-level exprs" << endl; - Dictionary::Ptr props = obj->CalculateProperties(); - cout << "\t" << props->GetLength() << " top-level properties" << endl; - - MessagePart mp(props); + MessagePart mp(obj->GetConfig()); cout << mp.ToJsonString() << endl; }