Skip to content

Commit fa890be

Browse files
Stepa4manishakhsuvarov
authored andcommitted
MSI-1988 issue fixed: Database Rollback not working M2.3
1 parent 9626815 commit fa890be

File tree

4 files changed

+211
-2
lines changed

4 files changed

+211
-2
lines changed

app/code/Magento/Backup/Model/Db.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
namespace Magento\Backup\Model;
77

88
use Magento\Backup\Helper\Data as Helper;
9+
use Magento\Backup\Model\ResourceModel\Table\GetListTables;
10+
use Magento\Backup\Model\ResourceModel\View\GetViewsBackup;
911
use Magento\Framework\App\ObjectManager;
1012
use Magento\Framework\Exception\RuntimeException;
1113

@@ -43,19 +45,35 @@ class Db implements \Magento\Framework\Backup\Db\BackupDbInterface
4345
*/
4446
private $helper;
4547

48+
/**
49+
* @var GetListTables
50+
*/
51+
private $getListTables;
52+
53+
/**
54+
* @var GetViewsBackup
55+
*/
56+
private $getViewsBackup;
57+
4658
/**
4759
* @param \Magento\Backup\Model\ResourceModel\Db $resourceDb
4860
* @param \Magento\Framework\App\ResourceConnection $resource
61+
* @param GetListTables|null $getListTables
62+
* @param GetViewsBackup|null $getViewsBackup
4963
* @param Helper|null $helper
5064
*/
5165
public function __construct(
5266
\Magento\Backup\Model\ResourceModel\Db $resourceDb,
5367
\Magento\Framework\App\ResourceConnection $resource,
54-
?Helper $helper = null
68+
?Helper $helper = null,
69+
GetListTables $getListTables = null,
70+
GetViewsBackup $getViewsBackup = null
5571
) {
5672
$this->_resourceDb = $resourceDb;
5773
$this->_resource = $resource;
5874
$this->helper = $helper ?? ObjectManager::getInstance()->get(Helper::class);
75+
$this->getListTables = $getListTables ?: ObjectManager::getInstance()->get(GetListTables::class);
76+
$this->getViewsBackup = $getViewsBackup ?: ObjectManager::getInstance()->get(GetViewsBackup::class);
5977
}
6078

6179
/**
@@ -161,7 +179,7 @@ public function createBackup(\Magento\Framework\Backup\Db\BackupInterface $backu
161179

162180
$this->getResource()->beginTransaction();
163181

164-
$tables = $this->getResource()->getTables();
182+
$tables = $this->getListTables->execute();
165183

166184
$backup->write($this->getResource()->getHeader());
167185

@@ -198,6 +216,8 @@ public function createBackup(\Magento\Framework\Backup\Db\BackupInterface $backu
198216
$backup->write($this->getResource()->getTableDataAfterSql($table));
199217
}
200218
}
219+
$this->getViewsBackup->execute($backup);
220+
201221
$backup->write($this->getResource()->getTableForeignKeysSql());
202222
$backup->write($this->getResource()->getTableTriggersSql());
203223
$backup->write($this->getResource()->getFooter());
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Backup\Model\ResourceModel\Table;
9+
10+
use Magento\Framework\App\ResourceConnection;
11+
12+
/**
13+
* Class GetListTables
14+
*/
15+
class GetListTables
16+
{
17+
private const TABLE_TYPE = 'BASE TABLE';
18+
19+
/**
20+
* @var ResourceConnection
21+
*/
22+
private $resource;
23+
24+
/**
25+
* @param ResourceConnection $resource
26+
*/
27+
public function __construct(ResourceConnection $resource)
28+
{
29+
$this->resource = $resource;
30+
}
31+
32+
/**
33+
* @return array
34+
*/
35+
public function execute()
36+
{
37+
return $this->resource->getConnection('backup')->fetchCol(
38+
"SHOW FULL TABLES WHERE `Table_type` = ?",
39+
self::TABLE_TYPE
40+
);
41+
}
42+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Backup\Model\ResourceModel\View;
9+
10+
use Magento\Framework\App\ResourceConnection;
11+
12+
/**
13+
* Class GetListViews
14+
*/
15+
class GetListViews
16+
{
17+
private const TABLE_TYPE = 'VIEW';
18+
/**
19+
* @var ResourceConnection
20+
*/
21+
private $resource;
22+
23+
/**
24+
* @param ResourceConnection $resource
25+
*/
26+
public function __construct(ResourceConnection $resource)
27+
{
28+
$this->resource = $resource;
29+
}
30+
31+
/**
32+
* @return array
33+
*/
34+
public function execute()
35+
{
36+
return $this->resource->getConnection('backup')->fetchCol(
37+
"SHOW FULL TABLES WHERE `Table_type` = ?",
38+
self::TABLE_TYPE
39+
);
40+
}
41+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Backup\Model\ResourceModel\View;
9+
10+
use Magento\Framework\App\ResourceConnection;
11+
use Magento\Framework\Backup\Db\BackupInterface;
12+
use Magento\Framework\DB\Adapter\AdapterInterface;
13+
14+
/**
15+
* Class GetViewsBackup
16+
*/
17+
class GetViewsBackup
18+
{
19+
/**
20+
* @var GetListViews
21+
*/
22+
private $getListViews;
23+
24+
/**
25+
* @var ResourceConnection
26+
*/
27+
private $resourceConnection;
28+
29+
/**
30+
* @var AdapterInterface
31+
*/
32+
private $connection;
33+
34+
/**
35+
* @param GetListViews $getListViews
36+
* @param ResourceConnection $resourceConnection
37+
*/
38+
public function __construct(
39+
GetListViews $getListViews,
40+
ResourceConnection $resourceConnection
41+
) {
42+
$this->getListViews = $getListViews;
43+
$this->resourceConnection = $resourceConnection;
44+
}
45+
46+
/**
47+
* @param BackupInterface $backup
48+
*/
49+
public function execute(BackupInterface $backup)
50+
{
51+
$views = $this->getListViews->execute();
52+
53+
foreach ($views as $view) {
54+
$backup->write($this->getViewHeader($view));
55+
$backup->write($this->getDropViewSql($view));
56+
$backup->write($this->getShowCreateView($view));
57+
}
58+
}
59+
60+
/**
61+
* @return AdapterInterface
62+
*/
63+
private function getConnection()
64+
{
65+
if (!$this->connection) {
66+
$this->connection = $this->resourceConnection->getConnection('backup');
67+
}
68+
69+
return $this->connection;
70+
}
71+
72+
/**
73+
* @param string $viewName
74+
* @return string
75+
*/
76+
private function getShowCreateView($viewName)
77+
{
78+
$quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
79+
$query = 'SHOW CREATE VIEW ' . $quotedViewName;
80+
$row = $this->getConnection()->fetchRow($query);
81+
$regExp = '/\sDEFINER\=\`([^`]*)\`\@\`([^`]*)\`/';
82+
$sql = preg_replace($regExp, '', $row['Create View']);
83+
84+
return $sql . ';' . "\n";
85+
}
86+
87+
/**
88+
* @param string $viewName
89+
* @return string
90+
*/
91+
public function getViewHeader($viewName)
92+
{
93+
$quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
94+
return "\n--\n" . "-- Structure for view {$quotedViewName}\n" . "--\n\n";
95+
}
96+
97+
/**
98+
* @param string $viewName
99+
* @return string
100+
*/
101+
public function getDropViewSql($viewName)
102+
{
103+
$quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
104+
return sprintf('DROP VIEW IF EXISTS %s;' . "\n", $quotedViewName);
105+
}
106+
}

0 commit comments

Comments
 (0)