Issues (1519)

system/modules/Db/Db.php (1 issue)

1
<?php
2
3
namespace Inji;
4
class Db extends Module {
5
    public $name = 'Db';
6
    public $connection = null;
7
    public $connect = false;
8
    public $dbConfig = [];
9
    public $curQuery = null;
10
    public $className = '';
11
    public $QueryClassName = '';
12
    public $ResultClassName = '';
13
    public $migrationsVersions = [];
14
15 1
    public function init($param = 'default') {
16 1
        if (!$param || $param === 'default') {
17 1
            $param = isset($this->config['default']) ? $this->config['default'] : 'local';
18
        }
19 1
        if ($param === 'injiStorage') {
20
            $db = [
21 1
                'driver' => 'InjiStorage'
22
            ];
23 1
        } else if (!is_array($param)) {
24 1
            if (!($dbOption = Db\Options::sharedStorage()->where('connect_alias', $param)->get(['array' => true]))) {
25 1
                return false;
26
            }
27
            $db = $dbOption;
28
        } else {
29
            $db = $param;
30
        }
31
32 1
        $className = 'Inji\Db\\' . $db['driver'];
33 1
        $this->connection = new $className();
34 1
        if (method_exists($className, 'init')) {
35
            $this->connection->init($db);
36
        }
37 1
        $this->connection->dbInstance = $this;
38 1
        $this->connect = $this->connection->connect;
39 1
        $this->dbConfig = $db;
40
41 1
        $this->className = 'Inji\Db\\' . $this->dbConfig['driver'];
42 1
        $this->QueryClassName = 'Inji\Db\\' . $this->dbConfig['driver'] . '\\Query';
43 1
        $this->ResultClassName = 'Inji\Db\\' . $this->dbConfig['driver'] . '\\Result';
44 1
    }
45
46
    public function loadMigrationsVersion($code) {
47
        if (!$this->connect) {
48
            return false;
49
        }
50
        $version = Db\Migration::getList(['where' => ['code', $code], 'order' => ['date_create', 'desc'], 'limit' => 1, 'key' => false]);
51
        if ($version) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $version of type array<mixed,Inji\Model> is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
52
            $this->migrationsVersions[$code] = $version[0]->version;
53
        }
54
        return true;
55
    }
56
57
    public function compareMigrations($code, $migrations) {
58
        if (!isset($this->migrationsVersions[$code])) {
59
            $this->loadMigrationsVersion($code);
60
        }
61
        if (!isset($this->migrationsVersions[$code]) || !isset($migrations[$this->migrationsVersions[$code]])) {
62
            return $migrations;
63
        }
64
        $startVersion = $this->migrationsVersions[$code];
65
        end($migrations);
66
        if ($startVersion == key($migrations)) {
67
            return [];
68
        }
69
        $pos = 0;
70
        foreach ($migrations as $migrationVersion => $migration) {
71
            $pos++;
72
            if ($startVersion == $migrationVersion) {
73
                return array_slice($migrations, $pos, null, true);
74
            }
75
76
        }
77
        return [];
78
    }
79
80
    public function makeMigration($code, $version, $migration) {
81
        if (!isset($migration['up'])) {
82
            return false;
83
        }
84
        if (is_callable($migration['up'])) {
85
            $migration['up']();
86
        }
87
        $this->migrationsVersions[$code] = $version;
88
        $migrationVersion = new Db\Migration(['code' => $code, 'version' => $version]);
89
        $migrationVersion->save();
90
        return true;
91
    }
92
93
    public function __call($name, $params) {
94
        if (!is_object($this->connection)) {
95
            return false;
96
        }
97
        if (method_exists($this->className, $name)) {
98
            return call_user_func_array(array($this->connection, $name), $params);
99
        }
100
        if (method_exists($this->QueryClassName, $name)) {
101
            if (!is_object($this->curQuery)) {
102
                $this->curQuery = new $this->QueryClassName($this->connection);
103
            }
104
            return call_user_func_array(array($this->curQuery, $name), $params);
105
        }
106
107
        return false;
108
    }
109
110
    /**
111
     * @return false|\Inji\Db\DriverQuery
112
     */
113 4
    public function newQuery() {
114 4
        if ($this->QueryClassName) {
115 4
            return new $this->QueryClassName($this->connection);
116
        }
117
        return false;
118
    }
119
120
    public function __get($name) {
121
        if (isset($this->connection->$name)) {
122
            return $this->connection->$name;
123
        }
124
        if (!is_object($this->curQuery)) {
125
            $this->curQuery = $this->newQuery();
126
        }
127
        if (isset($this->curQuery->$name)) {
128
            return $this->curQuery->$name;
129
        }
130
    }
131
132
    public function __set($name, $value) {
133
        if (isset($this->connection->$name)) {
134
            return $this->connection->$name = $value;
135
        }
136
        if (!is_object($this->curQuery)) {
137
            $this->curQuery = $this->newQuery();
138
        }
139
        if (isset($this->curQuery->$name)) {
140
            return $this->curQuery->$name = $value;
141
        }
142
    }
143
}