]> granicus.if.org Git - icinga2/commitdiff
Allow rterm in indexer ops.
authorGunnar Beutner <gunnar@beutner.name>
Sun, 30 Mar 2014 08:00:11 +0000 (10:00 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Sun, 30 Mar 2014 08:00:11 +0000 (10:00 +0200)
Refs #5870

lib/config/aexpression.cpp
lib/config/config_parser.yy
lib/config/configitembuilder.cpp
lib/icinga/dependency-apply.cpp
lib/icinga/notification-apply.cpp
lib/icinga/scheduleddowntime-apply.cpp
lib/icinga/service-apply.cpp

index 68cdc49b62638b2e05f1df5165f88fe7951c42c3..3e9e53f99767dfe77b79a6ef5df848cb2e71ffd5 100644 (file)
@@ -299,14 +299,16 @@ Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals
 
 Value AExpression::OpSet(const AExpression *expr, const Dictionary::Ptr& locals)
 {
+       Value index = expr->EvaluateOperand1(locals);
        Value right = expr->EvaluateOperand2(locals);
-       locals->Set(expr->m_Operand1, right);
+       locals->Set(index, right);
        return right;
 }
 
 Value AExpression::OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals)
 {
-       Value left = locals->Get(expr->m_Operand1);
+       Value index = expr->EvaluateOperand1(locals);
+       Value left = locals->Get(index);
        AExpression::Ptr exp_right = expr->m_Operand2;
        Dictionary::Ptr xlocals = locals;
 
@@ -326,13 +328,14 @@ Value AExpression::OpSetPlus(const AExpression *expr, const Dictionary::Ptr& loc
                dict->Remove("__parent");
        }
 
-       locals->Set(expr->m_Operand1, result);
+       locals->Set(index, result);
        return result;
 }
 
 Value AExpression::OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals)
 {
-       Value left = locals->Get(expr->m_Operand1);
+       Value index = expr->EvaluateOperand1(locals);
+       Value left = locals->Get(index);
        AExpression::Ptr exp_right = expr->m_Operand2;
        Dictionary::Ptr xlocals = locals;
 
@@ -352,13 +355,14 @@ Value AExpression::OpSetMinus(const AExpression *expr, const Dictionary::Ptr& lo
                dict->Remove("__parent");
        }
 
-       locals->Set(expr->m_Operand1, result);
+       locals->Set(index, result);
        return result;
 }
 
 Value AExpression::OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals)
 {
-       Value left = locals->Get(expr->m_Operand1);
+       Value index = expr->EvaluateOperand1(locals);
+       Value left = locals->Get(index);
        AExpression::Ptr exp_right = expr->m_Operand2;
        Dictionary::Ptr xlocals = locals;
 
@@ -378,13 +382,14 @@ Value AExpression::OpSetMultiply(const AExpression *expr, const Dictionary::Ptr&
                dict->Remove("__parent");
        }
 
-       locals->Set(expr->m_Operand1, result);
+       locals->Set(index, result);
        return result;
 }
 
 Value AExpression::OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals)
 {
-       Value left = locals->Get(expr->m_Operand1);
+       Value index = expr->EvaluateOperand1(locals);
+       Value left = locals->Get(index);
        AExpression::Ptr exp_right = expr->m_Operand2;
        Dictionary::Ptr xlocals = locals;
 
@@ -404,7 +409,7 @@ Value AExpression::OpSetDivide(const AExpression *expr, const Dictionary::Ptr& l
                dict->Remove("__parent");
        }
 
-       locals->Set(expr->m_Operand1, result);
+       locals->Set(index, result);
        return result;
 }
 
index afd41f0e6303d6e21f96618981f2e5e10a8ba303..0d093e76f51bb658ffeac7b4e2a22e353d19f932 100644 (file)
@@ -524,36 +524,43 @@ lterm_items_inner: /* empty */
 
 lterm: identifier lbinary_op rterm
        {
-               AExpression::Ptr aexpr = static_cast<AExpression::Ptr>(*$3);
-               $$ = new Value(make_shared<AExpression>($2, $1, aexpr, DebugInfoRange(@1, @3)));
+               AExpression::Ptr aindex = make_shared<AExpression>(&AExpression::OpLiteral, $1, @1);
                free($1);
+
+               AExpression::Ptr aexpr = static_cast<AExpression::Ptr>(*$3);
+               $$ = new Value(make_shared<AExpression>($2, aindex, aexpr, DebugInfoRange(@1, @3)));
                delete $3;
        }
-       | identifier '[' T_STRING ']' lbinary_op rterm
+       | identifier '[' rterm ']' lbinary_op rterm
        {
-               AExpression::Ptr subexpr = make_shared<AExpression>($5, $3, static_cast<AExpression::Ptr>(*$6), DebugInfoRange(@1, @6));
-               free($3);
+               AExpression::Ptr subexpr = make_shared<AExpression>($5, static_cast<AExpression::Ptr>(*$3), static_cast<AExpression::Ptr>(*$6), DebugInfoRange(@1, @6));
+               delete $3;
                delete $6;
 
                Array::Ptr subexprl = make_shared<Array>();
                subexprl->Add(subexpr);
                
-               AExpression::Ptr expr = make_shared<AExpression>(&AExpression::OpDict, subexprl, DebugInfoRange(@1, @6));
-               $$ = new Value(make_shared<AExpression>(&AExpression::OpSetPlus, $1, expr, DebugInfoRange(@1, @6)));
+               AExpression::Ptr aindex = make_shared<AExpression>(&AExpression::OpLiteral, $1, @1);
                free($1);
+
+               AExpression::Ptr expr = make_shared<AExpression>(&AExpression::OpDict, subexprl, DebugInfoRange(@1, @6));
+               $$ = new Value(make_shared<AExpression>(&AExpression::OpSetPlus, aindex, expr, DebugInfoRange(@1, @6)));
        }
        | identifier '.' T_IDENTIFIER lbinary_op rterm
        {
-               AExpression::Ptr subexpr = make_shared<AExpression>($4, $3, static_cast<AExpression::Ptr>(*$5), DebugInfoRange(@1, @5));
+               AExpression::Ptr aindex = make_shared<AExpression>(&AExpression::OpLiteral, $1, @1);
+               AExpression::Ptr subexpr = make_shared<AExpression>($4, aindex, static_cast<AExpression::Ptr>(*$5), DebugInfoRange(@1, @5));
                free($3);
                delete $5;
 
                Array::Ptr subexprl = make_shared<Array>();
                subexprl->Add(subexpr);
 
-               AExpression::Ptr expr = make_shared<AExpression>(&AExpression::OpDict, subexprl, DebugInfoRange(@1, @5));
-               $$ = new Value(make_shared<AExpression>(&AExpression::OpSetPlus, $1, expr, DebugInfoRange(@1, @5)));
+               AExpression::Ptr aindexl = make_shared<AExpression>(&AExpression::OpLiteral, $1, @1);
                free($1);
+
+               AExpression::Ptr expr = make_shared<AExpression>(&AExpression::OpDict, subexprl, DebugInfoRange(@1, @5));
+               $$ = new Value(make_shared<AExpression>(&AExpression::OpSetPlus, aindexl, expr, DebugInfoRange(@1, @5)));
        }
        | T_IMPORT rterm
        {
index dc4f20b7f56ce61ac92a484ebbb8113fc6a7f19e..4a6a8d6dda94c3ffc72e6c0608875b034c94ec62 100644 (file)
@@ -88,7 +88,12 @@ ConfigItem::Ptr ConfigItemBuilder::Compile(void)
        Array::Ptr exprs = make_shared<Array>();
        Array::Ptr templateArray = make_shared<Array>();
        templateArray->Add(m_Name);
-       exprs->Add(make_shared<AExpression>(&AExpression::OpSetPlus, "templates", make_shared<AExpression>(&AExpression::OpLiteral, templateArray, m_DebugInfo), m_DebugInfo));
+
+       exprs->Add(make_shared<AExpression>(&AExpression::OpSetPlus,
+           make_shared<AExpression>(&AExpression::OpLiteral, "templates", m_DebugInfo),
+           make_shared<AExpression>(&AExpression::OpLiteral, templateArray, m_DebugInfo),
+           m_DebugInfo));
+
        exprs->Add(make_shared<AExpression>(&AExpression::OpDict, m_Expressions, true, m_DebugInfo));
        
        AExpression::Ptr exprl = make_shared<AExpression>(&AExpression::OpDict, exprs, true, m_DebugInfo);
index 24d614206e72a1c9d90768c88a5803bdae18b367..a99b10a24fb17a8882a20b6eb760f4acd8b12a1b 100644 (file)
@@ -67,8 +67,15 @@ void Dependency::EvaluateApplyRules(const std::vector<ApplyRule>& rules)
                        builder->SetName(name);
                        builder->SetScope(rule.GetScope());
 
-                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet, "child_host", make_shared<AExpression>(&AExpression::OpLiteral, service->GetHost()->GetName(), di), di));
-                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet, "child_service", make_shared<AExpression>(&AExpression::OpLiteral, service->GetShortName(), di), di));
+                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet,
+                           make_shared<AExpression>(&AExpression::OpLiteral, "child_host", di),
+                           make_shared<AExpression>(&AExpression::OpLiteral, service->GetHost()->GetName(),
+                           di), di));
+
+                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet,
+                           make_shared<AExpression>(&AExpression::OpLiteral, "child_service", di),
+                           make_shared<AExpression>(&AExpression::OpLiteral, service->GetShortName(), di), di));
+
                        builder->AddExpression(rule.GetExpression());
 
                        ConfigItem::Ptr serviceItem = builder->Compile();
index 48e6bdd22ec8bc31cbf12164aa3c7d1147a4367a..557f6e124ec8ea6f17b72bbe4b0022bd398acb05 100644 (file)
@@ -67,8 +67,16 @@ void Notification::EvaluateApplyRules(const std::vector<ApplyRule>& rules)
                        builder->SetName(name);
                        builder->SetScope(rule.GetScope());
 
-                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet, "host", make_shared<AExpression>(&AExpression::OpLiteral, service->GetHost()->GetName(), di), di));
-                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet, "service", make_shared<AExpression>(&AExpression::OpLiteral, service->GetShortName(), di), di));
+                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet,
+                           make_shared<AExpression>(&AExpression::OpLiteral, "host", di),
+                           make_shared<AExpression>(&AExpression::OpLiteral, service->GetHost()->GetName(), di),
+                           di));
+
+                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet,
+                           make_shared<AExpression>(&AExpression::OpLiteral, "service", di),
+                           make_shared<AExpression>(&AExpression::OpLiteral, service->GetShortName(), di),
+                           di));
+
                        builder->AddExpression(rule.GetExpression());
 
                        ConfigItem::Ptr serviceItem = builder->Compile();
index 3ade63bf0a5c7173a0d1930a219bf5a8cf53da85..ff1ffb127d6b2495ad332ba8dfcd4a06f7797f11 100644 (file)
@@ -67,8 +67,16 @@ void ScheduledDowntime::EvaluateApplyRules(const std::vector<ApplyRule>& rules)
                        builder->SetName(name);
                        builder->SetScope(rule.GetScope());
 
-                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet, "host", make_shared<AExpression>(&AExpression::OpLiteral, service->GetHost()->GetName(), di), di));
-                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet, "service", make_shared<AExpression>(&AExpression::OpLiteral, service->GetShortName(), di), di));
+                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet,
+                           make_shared<AExpression>(&AExpression::OpLiteral, "host", di),
+                           make_shared<AExpression>(&AExpression::OpLiteral, service->GetHost()->GetName(), di),
+                           di));
+
+                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet,
+                           make_shared<AExpression>(&AExpression::OpLiteral, "service", di),
+                           make_shared<AExpression>(&AExpression::OpLiteral, service->GetShortName(), di),
+                           di));
+
                        builder->AddExpression(rule.GetExpression());
 
                        ConfigItem::Ptr serviceItem = builder->Compile();
index 89044285cb83eede7b58e58f0010c4f805c835de..6433237e82107f2d6aba71a8d44ebb0582b69a17 100644 (file)
@@ -66,8 +66,16 @@ void Service::EvaluateApplyRules(const std::vector<ApplyRule>& rules)
                        builder->SetName(name);
                        builder->SetScope(rule.GetScope());
 
-                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet, "host", make_shared<AExpression>(&AExpression::OpLiteral, host->GetName(), di), di));
-                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet, "short_name", make_shared<AExpression>(&AExpression::OpLiteral, rule.GetName(), di), di));
+                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet,
+                           make_shared<AExpression>(&AExpression::OpLiteral, "host", di), 
+                           make_shared<AExpression>(&AExpression::OpLiteral, host->GetName(), di),
+                           di));
+
+                       builder->AddExpression(make_shared<AExpression>(&AExpression::OpSet,
+                           make_shared<AExpression>(&AExpression::OpLiteral, "short_name", di),
+                           make_shared<AExpression>(&AExpression::OpLiteral, rule.GetName(), di),
+                           di));
+
                        builder->AddExpression(rule.GetExpression());
 
                        ConfigItem::Ptr serviceItem = builder->Compile();