1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
<?php
/* Icinga Web 2 | (c) 2013 Icinga Development Team | GPLv2+ */
namespace Icinga\Module\Monitoring\Backend\Ido\Query;
use Icinga\Application\Config;
use Icinga\Data\Filter\FilterExpression;
class CustomvarQuery extends IdoQuery
{
protected $columnMap = array(
'instances' => array(
'instance_name' => 'i.instance_name'
),
'customvariablestatus' => array(
'varname' => 'cvs.varname',
'varvalue' => 'cvs.varvalue',
'is_json' => 'cvs.is_json',
),
'objects' => array(
'host' => 'cvo.name1 COLLATE latin1_general_ci',
'host_name' => 'cvo.name1',
'service' => 'cvo.name2 COLLATE latin1_general_ci',
'service_description' => 'cvo.name2',
'contact' => 'cvo.name1 COLLATE latin1_general_ci',
'contact_name' => 'cvo.name1',
'object_type' => "CASE cvo.objecttype_id WHEN 1 THEN 'host' WHEN 2 THEN 'service' WHEN 10 THEN 'contact' ELSE 'invalid' END",
'object_type_id' => 'cvo.objecttype_id'
// 'object_type' => "CASE cvo.objecttype_id WHEN 1 THEN 'host' WHEN 2 THEN 'service' WHEN 3 THEN 'hostgroup' WHEN 4 THEN 'servicegroup' WHEN 5 THEN 'hostescalation' WHEN 6 THEN 'serviceescalation' WHEN 7 THEN 'hostdependency' WHEN 8 THEN 'servicedependency' WHEN 9 THEN 'timeperiod' WHEN 10 THEN 'contact' WHEN 11 THEN 'contactgroup' WHEN 12 THEN 'command' ELSE 'other' END"
),
);
public function where($expression, $parameters = null)
{
$types = array('host' => 1, 'service' => 2, 'contact' => 10);
if ($expression === 'object_type') {
parent::where('object_type_id', $types[$parameters]);
} else {
parent::where($expression, $parameters);
}
return $this;
}
public function whereEx(FilterExpression $ex)
{
$types = ['host' => 1, 'service' => 2, 'contact' => 10];
if ($ex->getColumn() === 'object_type') {
$ex = clone $ex;
$ex->setColumn('object_type_id');
$ex->setExpression($types[$ex->getExpression()]);
}
parent::whereEx($ex);
return $this;
}
protected function joinBaseTables()
{
if (version_compare($this->getIdoVersion(), '1.12.0', '<')) {
$this->columnMap['customvariablestatus']['is_json'] = '(0)';
}
if (! (bool) Config::module('monitoring')->get('ido', 'use_customvar_status_table', true)) {
$table = 'customvariables';
} else {
$table = 'customvariablestatus';
}
$this->select->from(
array('cvs' => $this->prefix . $table),
array()
)->join(
array('cvo' => $this->prefix . 'objects'),
'cvs.object_id = cvo.object_id AND cvo.is_active = 1',
array()
);
$this->joinedVirtualTables = array(
'customvariablestatus' => true,
'objects' => true
);
}
/**
* Join instances
*/
protected function joinInstances()
{
$this->select->join(
array('i' => $this->prefix . 'instances'),
'i.instance_id = cvs.instance_id',
array()
);
}
/**
* {@inheritdoc}
*/
public function getGroup()
{
$group = parent::getGroup();
if (! empty($group) && $this->ds->getDbType() === 'pgsql') {
foreach ($this->columnMap as $table => $columns) {
$pk = ($table === 'objects' ? 'cvo.' : 'cvs.') . $this->getPrimaryKeyColumn($table);
foreach ($columns as $alias => $_) {
if (! in_array($pk, $group, true) && in_array($alias, $group, true)) {
$group[] = $pk;
break;
}
}
}
}
return $group;
}
}
|