public function extend(IcingaDoctrine_Query $query, array $params)
 {
     // target, host or service
     $target = $params["target"];
     // alias for the table to join from
     $alias = $params["alias"];
     $this->user = $this->getContext()->getUser()->getNsmUser();
     $aliasAbbr = "cv";
     $impl = ++Api_Views_Extender_CustomVariableExtenderModel::$impl;
     switch ($target) {
         case 'host':
             $aliasAbbr = "h_cv_{$impl}";
             $target = IcingaIPrincipalConstants::TYPE_CUSTOMVAR_HOST;
             break;
         case 'service':
             $aliasAbbr = "s_cv_{$impl}";
             $target = IcingaIPrincipalConstants::TYPE_CUSTOMVAR_SERVICE;
             break;
     }
     $targetVals = $this->user->getTargetValues($target, true)->toArray();
     if (empty($targetVals)) {
         return;
     }
     $keymap = array("cv_name" => "varname", "cv_value" => "varvalue");
     $pairs = array();
     $CVcredentials = array();
     // build correct array with the data we need
     foreach ($targetVals as $targetData) {
         if (isset($targetData["tv_pt_id"]) and isset($targetData["tv_key"])) {
             $tvid = $targetData["tv_pt_id"];
             if ($targetData["tv_key"] == "cv_name") {
                 $CVcredentials[$tvid]["name"] = $targetData["tv_val"];
             } else {
                 if ($targetData["tv_key"] == "cv_value") {
                     $CVcredentials[$tvid]["value"] = $targetData["tv_val"];
                 }
             }
         }
     }
     // make a join for each CV permission
     $query->leftJoin("{$alias}.customvariables " . $aliasAbbr);
     // now we build the sql data
     foreach ($CVcredentials as $tvid => $cvdata) {
         // skip incomplete sets
         if (!isset($cvdata["name"]) || !isset($cvdata["value"])) {
             continue;
         }
         $pairs[] = "({$aliasAbbr}.varname LIKE '" . $cvdata["name"] . "' and {$aliasAbbr}.varvalue LIKE '" . $cvdata["value"] . "')";
     }
     if ($target == IcingaIPrincipalConstants::TYPE_CUSTOMVAR_SERVICE) {
         $pairs[] = $params["alias"] . '.service_object_id IS NULL';
     }
     $query->orWhere(join(" OR ", $pairs));
 }
 public function extend(IcingaDoctrine_Query $query, array $params)
 {
     $target = $params["target"];
     $column = $params["column"];
     $ornull = isset($params["ornull"]) && $params["ornull"] == true ? true : false;
     $user = $this->getContext()->getUser()->getNsmUser();
     $targetVals = $user->getTargetValues($target, true)->toArray();
     if (empty($targetVals)) {
         return false;
     }
     $dqlParts = array();
     $dqlValues = array();
     foreach ($targetVals as $currentTarget) {
         $dqlParts[] = "{$column} LIKE '" . $currentTarget["tv_val"] . "'";
     }
     if ($ornull == true) {
         $dqlParts[] = "{$column} IS NULL";
     }
     $dql = "(" . implode(" OR ", $dqlParts) . ")";
     $query->orWhere($dql);
 }
 private function applyDQLCalls(IcingaDoctrine_Query $query, array $sequence, $targetValues = null, $nr = 0)
 {
     if ($targetValues !== null && empty($targetValues)) {
         return;
     }
     AppKitLogger::verbose("Applying dql sequence %s", $sequence);
     foreach ($sequence as $call) {
         $call["arg"] = str_replace("{ID}", $nr, $call["arg"]);
         if (in_array($call["arg"] . $call["type"], $this->dqlHistory)) {
             continue;
         }
         if ($targetValues !== null) {
             $arg = $this->replaceCredentialTokens($call["arg"], $targetValues);
         } else {
             $arg = $this->replaceTokens($call["arg"]);
         }
         AppKitLogger::verbose("Applying call query->%s(%s)", $call["type"], $arg);
         $this->dqlHistory[] = $call["arg"] . $call["type"];
         switch ($call["type"]) {
             case 'select':
                 $query->addSelect($arg);
                 break;
             case 'innerjoin':
             case 'join':
                 $query->innerJoin($arg, null);
                 break;
             case 'leftjoin':
                 $query->leftJoin($arg, null);
                 break;
             case 'where':
             case 'andwhere':
                 $query->andWhere($arg);
                 break;
             case 'orwhere':
                 $query->orWhere($arg);
                 break;
             case 'limit':
                 $query->limit($arg);
                 break;
             case 'offset':
                 $query->offset($arg);
                 break;
             case 'groupby':
                 $query->addGroupBy($arg);
                 break;
         }
         AppKitLogger::verbose("After call query->%s(%s): %s ", $call["type"], $arg, $query->getSqlQuery());
     }
 }