Passed
Push — master ( 6228a9...3cc130 )
by Patrick
01:58
created

UIDatabase::testGetIdoDb()   A

Complexity

Conditions 6
Paths 7

Size

Total Lines 35
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 16
c 1
b 0
f 0
nc 7
nop 0
dl 0
loc 35
rs 9.1111
1
<?php
2
3
use Icinga\Module\Trapdirector\TrapsController;
4
use Icinga\Data\Db\DbConnection as IcingaDbConnection;
5
6
/**
7
 * Exception for Database test
8
 *
9
 * @license GPL
10
 * @author Patrick Proy
11
 * @package trapdirector
12
 * @subpackage UI
13
 *
14
 */
15
class DBException extends Exception
16
{
17
    /** @var array $returnArray */
18
    private $returnArray;
19
    
20
    /**
21
     * Buil DBException
22
     * @param array $retarray
23
     * @param string $message
24
     * @param int $code
25
     * @param Exception $previous
26
     */
27
    public function __construct(array $retarray, string $message = null, int $code = 0, Exception $previous = null)
28
    {
29
        parent::__construct($message,$code,$previous);
30
        $this->returnArray = $retarray;
31
    }
32
    
33
    /**
34
     * Get exception array
35
     * @return array
36
     */
37
    public function getArray()
38
    {
39
        return $this->returnArray;
40
    }
41
}
42
43
/**
44
 * Database functions for user interface
45
 * 
46
 * @license GPL
47
 * @author Patrick Proy
48
 * @package trapdirector
49
 * @subpackage UI
50
 *
51
 */
52
class UIDatabase
53
{
54
    
55
    /** @var TrapsController $trapController TrapController 'parent' class */
56
    protected  $trapController;
57
    
58
    /** @var Zend_Db_Adapter_Abstract $trapDB Trap Database*/
59
    protected $trapDB;
60
 
61
    /** @var Zend_Db_Adapter_Abstract $trapDB Icinga IDO database*/
62
    protected $idoDB;
63
    
64
    /** @var array $testResult */
65
    protected $testResult;
66
    
67
    /**
68
     * 
69
     * @param TrapsController $trapCtrl
70
     */
71
    function __construct(TrapsController $trapCtrl)
72
    {
73
        $this->trapController=$trapCtrl;
74
    }
75
    
76
    /**
77
     * Test if database version >= min database version
78
     * 
79
     * @param \Zend_Db_Adapter_Abstract $dbConn
80
     * @param int $min Minimum version
81
     * @param bool $test Test mode
82
     * @param string $DBname Name of DB
83
     * @return bool true if OK, false if version < min version
84
     * @throws Exception if error and test = true
85
     */
86
    protected function testDbVersion($dbAdapter,int $min,bool $test, string $DBname)
87
    {
88
        try
89
        {
90
            $query = $dbAdapter->select()
91
            ->from($this->trapController->getModuleConfig()->getDbConfigTableName(),'value')
92
            ->where('name=\'db_version\'');
93
            $version=$dbAdapter->fetchRow($query);
94
            if ( ($version == null) || ! property_exists($version,'value') )
95
            {
96
                if ($test === true) 
97
                {
98
                    $this->testResult = array(4,$DBname);
99
                    return false;
100
                }
101
                $this->trapController->redirectNow('trapdirector/settings?dberror=4');
102
                return false;
103
            }
104
            if ($version->value < $min)
105
            {
106
                if ($test === true) 
107
                {
108
                    $this->testResult = array(5,$version->value,$min);
109
                    return false;
110
                }
111
                $this->trapController->redirectNow('trapdirector/settings?dberror=5');
112
                return false;
113
            }
114
        }
115
        catch (Exception $e)
116
        {
117
            if ($test === true) 
118
            {
119
                $this->testResult = array(3,$DBname,$e->getMessage());
120
                return false;
121
            }
122
            $this->trapController->redirectNow('trapdirector/settings?dberror=4');
123
            return false;
124
        }
125
        return true;
126
    }
127
    
128
    /**	Get Database connexion
129
     *	@param $DBname string DB name in resource.ini_ge
130
     *	@param $test bool if set to true, returns error code and not database
131
     *	@param $test_version bool if set to flase, does not test database version of trapDB
132
     *  @throws DBException if test = true and error
133
     *	@return Zend_Db_Adapter_Abstract|null : if test=false, returns DB connexion, else array(error_num,message) or null on error.
134
     */
135
    protected function getDbByName($DBname , $test = false , $test_version = true)
136
    {
137
        try
138
        {
139
            $dbconn = IcingaDbConnection::fromResourceName($DBname);
140
        }
141
        catch (Exception $e)
142
        {
143
            if ($test === true) 
144
            {
145
                throw new DBException(array(2,$DBname));
146
            }
147
            $this->trapController->redirectNow('trapdirector/settings?dberror=2');
148
            return null;
149
        }
150
151
        try
152
        {
153
            $dbAdapter=$dbconn->getDbAdapter();
154
            
155
        }
156
        catch (Exception $e)
157
        {
158
            if ($test === true)
159
            {
160
                throw new DBException(array(3,$DBname,$e->getMessage()));
161
            }
162
            $this->trapController->redirectNow('trapdirector/settings?dberror=3');
163
            return null;
164
        }
165
        
166
        if ($test_version == true) {
167
            $testRet=$this->testDbVersion($dbAdapter, $this->trapController->getModuleConfig()->getDbMinVersion(), $test, $DBname);
168
            if ($testRet !== true) 
169
            {
170
                throw new DBException($this->testResult);
171
            }
172
        }
173
 
174
        return $dbAdapter;
175
    }
176
177
    /**
178
     * Get Trap database
179
     * @param boolean $test
180
     * @return Zend_Db_Adapter_Abstract|array|null : if test=false, returns DB connexion, else array(error_num,message) or null on error.
181
     */
182
    public function getDb()
183
    {
184
        if ( $this->trapDB != null ) return $this->trapDB;
185
        
186
        $dbresource=$this->trapController->Config()->get('config', 'database');
187
        
188
        if ( ! $dbresource )
189
        {
190
            $this->trapController->redirectNow('trapdirector/settings?dberror=1');
191
            return null;
192
        }
193
194
        try {
195
            $this->trapDB = $this->getDbByName($dbresource,false,true);
196
        } catch (DBException $e) {
197
            return null; // Should not happen as test = false
198
        }
199
        
200
        return $this->trapDB;
201
    }
202
203
    /**
204
     * Test Trap database
205
     * @param boolean $test
206
     * @throws DBException on error.
207
     * @return Zend_Db_Adapter_Abstract|array|null : if test=false, returns DB connexion, else array(error_num,message) or null on error.
208
     */
209
    public function testGetDb()
210
    {       
211
        $dbresource=$this->trapController->Config()->get('config', 'database');
212
        
213
        if ( ! $dbresource )
214
        {
215
                throw new DBException(array(1,''));
216
        }
217
        
218
        $this->trapDB = $this->getDbByName($dbresource,true,true);       
219
        return;
220
    }
221
    
222
    /**
223
     * Get IDO Database 
224
     * @param boolean $test
225
     * @return Zend_Db_Adapter_Abstract|NULL  returns DB connexion or null on error.
226
     */
227
    public function getIdoDb($test=false)
228
    {
229
        if ($this->idoDB != null && $test === false) return $this->idoDB;
230
        // TODO : get ido database directly from icingaweb2 config -> (or not if using only API)
231
        $dbresource=$this->trapController->Config()->get('config', 'IDOdatabase');;
232
        
233
        if ( ! $dbresource )
234
        {
235
            $this->redirectNow('trapdirector/settings?idodberror=1');
0 ignored issues
show
Bug introduced by
The method redirectNow() does not exist on UIDatabase. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

235
            $this->/** @scrutinizer ignore-call */ 
236
                   redirectNow('trapdirector/settings?idodberror=1');

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
236
            return null;
237
        }
238
        
239
        try
240
        {
241
            $dbconn = IcingaDbConnection::fromResourceName($dbresource);
242
        }
243
        catch (Exception $e)
244
        {
245
            $this->redirectNow('trapdirector/settings?idodberror=2');
246
            return null;
247
        }
248
249
        $this->idoDB = $dbconn->getDbAdapter();
250
        return $this->idoDB;
251
    }
252
253
    /**
254
     * Get IDO Database
255
     * @param boolean $test
256
     * @throws DBException on error
257
     */
258
    public function testGetIdoDb()
259
    {
260
        // TODO : get ido database directly from icingaweb2 config -> (or not if using only API)
261
        $dbresource=$this->trapController->Config()->get('config', 'IDOdatabase');;
262
        
263
        if ( ! $dbresource )
264
        {
265
            throw new DBException(array(1,'No database in config.ini'));
266
        }
267
        
268
        try
269
        {
270
            $dbconn = IcingaDbConnection::fromResourceName($dbresource);
271
        }
272
        catch (Exception $e)
273
        {
274
            throw new DBException( array(2,"Database $dbresource does not exists in IcingaWeb2") );
275
        }
276
               
277
        try
278
        {
279
            $query = $dbconn->select()
280
            ->from('icinga_dbversion',array('version'));
281
            $version=$dbconn->fetchRow($query);
282
            if ( ($version == null) || ! property_exists($version,'version') )
283
            {
284
                throw new DBException( array(4,"$dbresource does not look like an IDO database"));
285
            }
286
        }
287
        catch (Exception $e)
288
        {
289
            throw new DBException( array(3,"Error connecting to $dbresource : " . $e->getMessage()));
290
        }
291
        
292
        return;
293
    }
294
    
295
}