Skip to content

Commit e969b40

Browse files
authored
ENGCOM-4392: Database Rollback not working M2.3.0 #21151
2 parents a5330a7 + 3af27fc commit e969b40

File tree

4 files changed

+227
-3
lines changed

4 files changed

+227
-3
lines changed

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

Lines changed: 24 additions & 3 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

@@ -44,18 +46,35 @@ class Db implements \Magento\Framework\Backup\Db\BackupDbInterface
4446
private $helper;
4547

4648
/**
47-
* @param \Magento\Backup\Model\ResourceModel\Db $resourceDb
49+
* @var GetListTables
50+
*/
51+
private $getListTables;
52+
53+
/**
54+
* @var GetViewsBackup
55+
*/
56+
private $getViewsBackup;
57+
58+
/**
59+
* Db constructor.
60+
* @param ResourceModel\Db $resourceDb
4861
* @param \Magento\Framework\App\ResourceConnection $resource
4962
* @param Helper|null $helper
63+
* @param GetListTables|null $getListTables
64+
* @param GetViewsBackup|null $getViewsBackup
5065
*/
5166
public function __construct(
5267
\Magento\Backup\Model\ResourceModel\Db $resourceDb,
5368
\Magento\Framework\App\ResourceConnection $resource,
54-
?Helper $helper = null
69+
?Helper $helper = null,
70+
GetListTables $getListTables = null,
71+
GetViewsBackup $getViewsBackup = null
5572
) {
5673
$this->_resourceDb = $resourceDb;
5774
$this->_resource = $resource;
5875
$this->helper = $helper ?? ObjectManager::getInstance()->get(Helper::class);
76+
$this->getListTables = $getListTables ?: ObjectManager::getInstance()->get(GetListTables::class);
77+
$this->getViewsBackup = $getViewsBackup ?: ObjectManager::getInstance()->get(GetViewsBackup::class);
5978
}
6079

6180
/**
@@ -161,7 +180,7 @@ public function createBackup(\Magento\Framework\Backup\Db\BackupInterface $backu
161180

162181
$this->getResource()->beginTransaction();
163182

164-
$tables = $this->getResource()->getTables();
183+
$tables = $this->getListTables->execute();
165184

166185
$backup->write($this->getResource()->getHeader());
167186

@@ -198,6 +217,8 @@ public function createBackup(\Magento\Framework\Backup\Db\BackupInterface $backu
198217
$backup->write($this->getResource()->getTableDataAfterSql($table));
199218
}
200219
}
220+
$this->getViewsBackup->execute($backup);
221+
201222
$backup->write($this->getResource()->getTableForeignKeysSql());
202223
$backup->write($this->getResource()->getTableTriggersSql());
203224
$backup->write($this->getResource()->getFooter());
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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+
* Get base tables
34+
*
35+
* @return array
36+
*/
37+
public function execute()
38+
{
39+
return $this->resource->getConnection('backup')->fetchCol(
40+
"SHOW FULL TABLES WHERE `Table_type` = ?",
41+
self::TABLE_TYPE
42+
);
43+
}
44+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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+
* Get view tables
33+
*
34+
* @return array
35+
*/
36+
public function execute()
37+
{
38+
return $this->resource->getConnection('backup')->fetchCol(
39+
"SHOW FULL TABLES WHERE `Table_type` = ?",
40+
self::TABLE_TYPE
41+
);
42+
}
43+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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+
* Backup
48+
*
49+
* @param BackupInterface $backup
50+
*/
51+
public function execute(BackupInterface $backup)
52+
{
53+
$views = $this->getListViews->execute();
54+
55+
foreach ($views as $view) {
56+
$backup->write($this->getViewHeader($view));
57+
$backup->write($this->getDropViewSql($view));
58+
$backup->write($this->getShowCreateView($view));
59+
}
60+
}
61+
62+
/**
63+
* Get connection
64+
*
65+
* @return AdapterInterface
66+
*/
67+
private function getConnection()
68+
{
69+
if (!$this->connection) {
70+
$this->connection = $this->resourceConnection->getConnection('backup');
71+
}
72+
73+
return $this->connection;
74+
}
75+
76+
/**
77+
* Get show create view
78+
*
79+
* @param string $viewName
80+
* @return string
81+
*/
82+
private function getShowCreateView($viewName)
83+
{
84+
$quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
85+
$query = 'SHOW CREATE VIEW ' . $quotedViewName;
86+
$row = $this->getConnection()->fetchRow($query);
87+
$regExp = '/\sDEFINER\=\`([^`]*)\`\@\`([^`]*)\`/';
88+
$sql = preg_replace($regExp, '', $row['Create View']);
89+
90+
return $sql . ';' . "\n";
91+
}
92+
93+
/**
94+
* Get view header
95+
*
96+
* @param string $viewName
97+
* @return string
98+
*/
99+
public function getViewHeader($viewName)
100+
{
101+
$quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
102+
return "\n--\n" . "-- Structure for view {$quotedViewName}\n" . "--\n\n";
103+
}
104+
105+
/**
106+
* Get drop view SQL
107+
*
108+
* @param string $viewName
109+
* @return string
110+
*/
111+
public function getDropViewSql($viewName)
112+
{
113+
$quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
114+
return sprintf('DROP VIEW IF EXISTS %s;' . "\n", $quotedViewName);
115+
}
116+
}

0 commit comments

Comments
 (0)