Module::checkSqliteDb()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
c 0
b 0
f 0
dl 0
loc 7
rs 10
cc 1
nc 1
nop 0
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: floor12
5
 * Date: 31.12.2017
6
 * Time: 14:45
7
 */
8
9
namespace floor12\backup;
10
11
use Yii;
12
use yii\base\ErrorException;
13
use yii\base\NotSupportedException;
14
use yii\db\Connection;
15
use yii\db\Exception;
16
17
class Module extends \yii\base\Module
18
{
19
20
    /**
21
     * @var string
22
     */
23
    public $administratorRoleName = 'admin';
24
    /**
25
     * @var string
26
     */
27
    public $backupFolder = '@app/backups';
28
    /**
29
     * @var string
30
     */
31
    public $chmod;
32
    /**
33
     * @var array
34
     */
35
    public $authTokens = [];
36
    /**
37
     * @var string[]
38
     */
39
    public $binaries = [
40
        'mysql' => '/usr/bin/mysql',
41
        'mysqldump' => '/usr/bin/mysqldump',
42
        'pg_dump' => '/usr/bin/pg_dump',
43
        'pg_restore' => '/usr/bin/pg_restore',
44
        'gzip' => '/bin/gzip',
45
        'zcat' => '/bin/zcat',
46
        'ionice' => '/usr/bin/ionice',
47
        'zip' => '/usr/bin/zip',
48
        'unzip' => '/usr/bin/unzip',
49
        'chmod' => '/bin/chmod',
50
    ];
51
    /**
52
     * @inheritdoc
53
     */
54
    public $controllerNamespace = 'floor12\backup\controllers';
55
    /**
56
     * @var string
57
     */
58
    public $backupRootPath;
59
    /**
60
     * @var string
61
     */
62
    public $connection;
63
    /**
64
     * @var string
65
     */
66
    public $ionice;
67
    /**
68
     * @var array
69
     */
70
    public $configs = [];
71
    /**
72
     * @var string
73
     */
74
    public $adminLayout = '@app/views/layouts/main';
75
76
    /**
77
     * @inheritdoc
78
     */
79
    public function init()
80
    {
81
        $this->backupRootPath = Yii::getAlias($this->backupFolder);
0 ignored issues
show
Documentation Bug introduced by
It seems like Yii::getAlias($this->backupFolder) can also be of type false. However, the property $backupRootPath is declared as type string. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
82
83
        try {
84
            if (!file_exists($this->backupRootPath))
0 ignored issues
show
Bug introduced by
It seems like $this->backupRootPath can also be of type false; however, parameter $filename of file_exists() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

84
            if (!file_exists(/** @scrutinizer ignore-type */ $this->backupRootPath))
Loading history...
85
                mkdir($this->backupRootPath);
0 ignored issues
show
Bug introduced by
It seems like $this->backupRootPath can also be of type false; however, parameter $directory of mkdir() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

85
                mkdir(/** @scrutinizer ignore-type */ $this->backupRootPath);
Loading history...
86
        } catch (ErrorException $e) {
87
            throw new ErrorException("Backup folder not exists. Its impossible to create it because of permission error.");
88
        }
89
90
        if (!is_writable($this->backupRootPath))
0 ignored issues
show
Bug introduced by
It seems like $this->backupRootPath can also be of type false; however, parameter $filename of is_writable() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

90
        if (!is_writable(/** @scrutinizer ignore-type */ $this->backupRootPath))
Loading history...
91
            throw new ErrorException("Backup folder is not writable.");
92
93
        $this->checkSqliteDb();
94
        $this->registerTranslations();
95
    }
96
97
    /**
98
     * @throws NotSupportedException
99
     * @throws Exception
100
     */
101
    public function checkSqliteDb()
102
    {
103
        $dbFileName = $this->backupRootPath . '/sqlite.db';
104
        $this->connection = new Connection(['dsn' => 'sqlite:' . $dbFileName]);
0 ignored issues
show
Documentation Bug introduced by
It seems like new yii\db\Connection(ar...qlite:' . $dbFileName)) of type yii\db\Connection is incompatible with the declared type string of property $connection.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
105
        $this->connection->getSchema();
106
        $sql = file_get_contents(__DIR__ . '/migration/sqlite.backup.sql');
107
        $this->connection->createCommand($sql)->execute();
108
    }
109
110
    /**
111
     * Register some lang files
112
     * @return void
113
     */
114
    public function registerTranslations()
115
    {
116
        Yii::$app->i18n->translations['app.f12.backup'] = [
117
            'class' => 'yii\i18n\PhpMessageSource',
118
            'basePath' => '@vendor/floor12/yii2-module-backup/src/messages',
119
            'sourceLanguage' => 'en-US',
120
            'fileMap' => [
121
                'app.f12.backup' => 'backup.php',
122
            ],
123
        ];
124
    }
125
126
    /**
127
     * @param string $config_id
128
     * @return bool
129
     */
130
    public function checkConfig(string $config_id)
131
    {
132
        foreach (Yii::$app->getModule('backup')->configs as $config)
133
            if ($config['id'] == $config_id)
134
                return true;
135
        return false;
136
    }
137
138
}
139