Passed
Push — master ( 2ecc51...c1b656 )
by Michael
04:26 queued 02:02
created

db_manager   D

Complexity

Total Complexity 59

Size/Duplication

Total Lines 272
Duplicated Lines 31.25 %

Importance

Changes 0
Metric Value
dl 85
loc 272
rs 4.5454
c 0
b 0
f 0
wmc 59

13 Methods

Rating   Name   Duplication   Size   Complexity  
A insert() 13 21 4
F report() 40 47 17
A __construct() 0 5 1
A createDB() 0 7 2
A fetchArray() 0 5 1
A prefix() 0 5 1
A dbExists() 0 3 2
A deleteTables() 0 12 3
A query() 0 5 1
A isError() 0 3 2
A isConnectable() 0 3 2
C queryFromFile() 32 67 20
A tableExists() 0 11 3

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like db_manager often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use db_manager, and based on these observations, apply Extract Interface, too.

1
<?php
2
/*
3
 * You may not change or alter any portion of this comment or credits
4
 * of supporting developers from this source code or any supporting source code
5
 * which is considered copyrighted (c) material of the original comment or credit authors.
6
 *
7
 * This program is distributed in the hope that it will be useful,
8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10
 */
11
12
/**
13
 * @copyright    {@link https://xoops.org/ XOOPS Project}
14
 * @license      {@link http://www.gnu.org/licenses/gpl-2.0.html GNU GPL 2 or later}
15
 * @package      efqdirectory
16
 * @since
17
 * @author       Martijn Hertog (aka wtravel)
18
 * @author       XOOPS Development Team,
19
 */
20
21
require_once XOOPS_ROOT_PATH . '/class/logger.php';
0 ignored issues
show
Bug introduced by
The constant XOOPS_ROOT_PATH was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
22
require_once XOOPS_ROOT_PATH . '/class/database/databasefactory.php';
23
require_once XOOPS_ROOT_PATH . '/class/database/' . XOOPS_DB_TYPE . 'database.php';
0 ignored issues
show
Bug introduced by
The constant XOOPS_DB_TYPE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
24
require_once XOOPS_ROOT_PATH . '/class/database/sqlutility.php';
25
26
/**
27
 * database manager for XOOPS installer
28
 *
29
 * @author  Haruki Setoyama  <[email protected]>
30
 * @version $Id: dbmanager.php 19391 2010-06-13 06:53:15Z underdogg $
31
 * @access  public
32
 **/
33
class db_manager
34
{
35
    public $s_tables = array();
36
    public $f_tables = array();
37
    public $db;
38
39
    /**
40
     * db_manager constructor.
41
     */
42
    public function __construct()
43
    {
44
        $this->db = XoopsDatabaseFactory::getDatabase();
0 ignored issues
show
Bug introduced by
The type XoopsDatabaseFactory was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
45
        $this->db->setPrefix(XOOPS_DB_PREFIX);
0 ignored issues
show
Bug introduced by
The constant XOOPS_DB_PREFIX was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
46
        $this->db->setLogger(XoopsLogger::instance());
0 ignored issues
show
Bug introduced by
The type XoopsLogger was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
47
    }
48
49
    /**
50
     * @return bool
51
     */
52
    public function isConnectable()
53
    {
54
        return ($this->db->connect(false) !== false) ? true : false;
55
    }
56
57
    /**
58
     * @return bool
59
     */
60
    public function dbExists()
61
    {
62
        return ($this->db->connect() !== false) ? true : false;
63
    }
64
65
    /**
66
     * @return bool
67
     */
68
    public function createDB()
69
    {
70
        $this->db->connect(false);
71
72
        $result = $this->db->query('CREATE DATABASE ' . XOOPS_DB_NAME);
0 ignored issues
show
Bug introduced by
The constant XOOPS_DB_NAME was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
73
74
        return ($result !== false) ? true : false;
75
    }
76
77
    /**
78
     * @param $sql_file_path
79
     * @return bool
80
     */
81
    public function queryFromFile($sql_file_path)
82
    {
83
        global $pieces;
84
        $tables = array();
0 ignored issues
show
Unused Code introduced by
The assignment to $tables is dead and can be removed.
Loading history...
85
86
        if (!file_exists($sql_file_path)) {
87
            return false;
88
        }
89
        $sql_query = trim(fread(fopen($sql_file_path, 'r'), filesize($sql_file_path)));
90
        SqlUtility::splitMySqlFile($pieces, $sql_query);
0 ignored issues
show
Bug introduced by
The type SqlUtility was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
91
        $this->db->connect();
92
        foreach ($pieces as $piece) {
93
            $piece = trim($piece);
94
            // [0] contains the prefixed query
95
            // [4] contains unprefixed table name
96
            $prefixed_query = SqlUtility::prefixQuery($piece, $this->db->prefix());
97
            if ($prefixed_query !== false) {
98
                $table = $this->db->prefix($prefixed_query[4]);
99
                if ($prefixed_query[1] === 'CREATE TABLE') {
100 View Code Duplication
                    if ($this->db->query($prefixed_query[0]) !== false) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
101
                        if (!isset($this->s_tables['create'][$table])) {
102
                            $this->s_tables['create'][$table] = 1;
103
                        }
104
                    } else {
105
                        if (!isset($this->f_tables['create'][$table])) {
106
                            $this->f_tables['create'][$table] = 1;
107
                        }
108
                    }
109
                } elseif ($prefixed_query[1] === 'INSERT INTO') {
110
                    if ($this->db->query($prefixed_query[0]) !== false) {
111 View Code Duplication
                        if (!isset($this->s_tables['insert'][$table])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
112
                            $this->s_tables['insert'][$table] = 1;
113
                        } else {
114
                            $this->s_tables['insert'][$table]++;
115
                        }
116 View Code Duplication
                    } else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
117
                        if (!isset($this->f_tables['insert'][$table])) {
118
                            $this->f_tables['insert'][$table] = 1;
119
                        } else {
120
                            $this->f_tables['insert'][$table]++;
121
                        }
122
                    }
123 View Code Duplication
                } elseif ($prefixed_query[1] === 'ALTER TABLE') {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
124
                    if ($this->db->query($prefixed_query[0]) !== false) {
125
                        if (!isset($this->s_tables['alter'][$table])) {
126
                            $this->s_tables['alter'][$table] = 1;
127
                        }
128
                    } else {
129
                        if (!isset($this->s_tables['alter'][$table])) {
130
                            $this->f_tables['alter'][$table] = 1;
131
                        }
132
                    }
133
                } elseif ($prefixed_query[1] === 'DROP TABLE') {
134
                    if ($this->db->query('DROP TABLE ' . $table) !== false) {
135
                        if (!isset($this->s_tables['drop'][$table])) {
136
                            $this->s_tables['drop'][$table] = 1;
137
                        }
138
                    } else {
139
                        if (!isset($this->s_tables['drop'][$table])) {
140
                            $this->f_tables['drop'][$table] = 1;
141
                        }
142
                    }
143
                }
144
            }
145
        }
146
147
        return true;
148
    }
149
150
    /**
151
     * @return string
152
     */
153
    public function report()
154
    {
155
        $content = "<table align='center'><tr><td align='left'>\n";
156 View Code Duplication
        if (isset($this->s_tables['create'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
157
            foreach ($this->s_tables['create'] as $key => $val) {
158
                $content .= sprintf(_INSTALL_L45, "<b>$key</b>") . "<br>\n";
159
            }
160
        }
161 View Code Duplication
        if (isset($this->s_tables['insert'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
162
            foreach ($this->s_tables['insert'] as $key => $val) {
163
                $content .= sprintf(_INSTALL_L119, $val, "<b>$key</b>") . "<br>\n";
164
            }
165
        }
166 View Code Duplication
        if (isset($this->s_tables['alter'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
167
            foreach ($this->s_tables['alter'] as $key => $val) {
168
                $content .= sprintf(_INSTALL_L133, "<b>$key</b>") . "<br>\n";
169
            }
170
        }
171 View Code Duplication
        if (isset($this->s_tables['drop'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
172
            foreach ($this->s_tables['drop'] as $key => $val) {
173
                $content .= sprintf(_INSTALL_L163, "<b>$key</b>") . "<br>\n";
174
            }
175
        }
176
        $content .= "<br>\n";
177 View Code Duplication
        if (isset($this->f_tables['create'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
178
            foreach ($this->f_tables['create'] as $key => $val) {
179
                $content .= sprintf(_INSTALL_L118, "<b>$key</b>") . "<br>\n";
180
            }
181
        }
182 View Code Duplication
        if (isset($this->f_tables['insert'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
183
            foreach ($this->f_tables['insert'] as $key => $val) {
184
                $content .= sprintf(_INSTALL_L120, $val, "<b>$key</b>") . "<br>\n";
185
            }
186
        }
187 View Code Duplication
        if (isset($this->f_tables['alter'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
188
            foreach ($this->f_tables['alter'] as $key => $val) {
189
                $content .= sprintf(_INSTALL_L134, "<b>$key</b>") . "<br>\n";
190
            }
191
        }
192 View Code Duplication
        if (isset($this->f_tables['drop'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
193
            foreach ($this->f_tables['drop'] as $key => $val) {
194
                $content .= sprintf(_INSTALL_L164, "<b>$key</b>") . "<br>\n";
195
            }
196
        }
197
        $content .= "</td></tr></table>\n";
198
199
        return $content;
200
    }
201
202
    /**
203
     * @param $sql
204
     * @return mixed
205
     */
206
    public function query($sql)
207
    {
208
        $this->db->connect();
209
210
        return $this->db->query($sql);
211
    }
212
213
    /**
214
     * @param $table
215
     * @return mixed
216
     */
217
    public function prefix($table)
218
    {
219
        $this->db->connect();
220
221
        return $this->db->prefix($table);
222
    }
223
224
    /**
225
     * @param $ret
226
     * @return mixed
227
     */
228
    public function fetchArray($ret)
229
    {
230
        $this->db->connect();
231
232
        return $this->db->fetchArray($ret);
233
    }
234
235
    /**
236
     * @param $table
237
     * @param $query
238
     * @return bool
239
     */
240
    public function insert($table, $query)
241
    {
242
        $this->db->connect();
243
        $table = $this->db->prefix($table);
244
        $query = 'INSERT INTO ' . $table . ' ' . $query;
245
        if (!$this->db->queryF($query)) {
246 View Code Duplication
            if (!isset($this->f_tables['insert'][$table])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
247
                $this->f_tables['insert'][$table] = 1;
248
            } else {
249
                $this->f_tables['insert'][$table]++;
250
            }
251
252
            return false;
253 View Code Duplication
        } else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
254
            if (!isset($this->s_tables['insert'][$table])) {
255
                $this->s_tables['insert'][$table] = 1;
256
            } else {
257
                $this->s_tables['insert'][$table]++;
258
            }
259
260
            return $this->db->getInsertId();
261
        }
262
    }
263
264
    /**
265
     * @return bool
266
     */
267
    public function isError()
268
    {
269
        return isset($this->f_tables) ? true : false;
270
    }
271
272
    /**
273
     * @param $tables
274
     * @return array
275
     */
276
    public function deleteTables($tables)
277
    {
278
        global $ct;
279
        $deleted = array();
280
        $this->db->connect();
281
        foreach ($tables as $key => $val) {
282
            if (!$this->db->query('DROP TABLE ' . $this->db->prefix($key))) {
283
                $deleted[] = $ct;
284
            }
285
        }
286
287
        return $deleted;
288
    }
289
290
    /**
291
     * @param $table
292
     * @return bool
293
     */
294
    public function tableExists($table)
295
    {
296
        $table = trim($table);
297
        $ret   = false;
298
        if ($table !== '') {
299
            $this->db->connect();
300
            $sql = 'SELECT * FROM ' . $this->db->prefix($table);
301
            $ret = (false != $this->db->query($sql)) ? true : false;
302
        }
303
304
        return $ret;
305
    }
306
}
307