Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Db.php
Go to the documentation of this file.
1 <?php
6 namespace Magento\Backup\Model;
7 
8 use Magento\Backup\Helper\Data as Helper;
11 
19 class Db implements \Magento\Framework\Backup\Db\BackupDbInterface
20 {
25  const BUFFER_LENGTH = 102400;
26 
32  protected $_resourceDb = null;
33 
39  protected $_resource = null;
40 
44  private $helper;
45 
51  public function __construct(
52  \Magento\Backup\Model\ResourceModel\Db $resourceDb,
53  \Magento\Framework\App\ResourceConnection $resource,
54  ?Helper $helper = null
55  ) {
56  $this->_resourceDb = $resourceDb;
57  $this->_resource = $resource;
58  $this->helper = $helper ?? ObjectManager::getInstance()->get(Helper::class);
59  }
60 
66  protected $_ignoreDataTablesList = ['importexport/importdata'];
67 
73  public function getResource()
74  {
75  return $this->_resourceDb;
76  }
77 
83  public function getTables()
84  {
85  return $this->getResource()->getTables();
86  }
87 
95  public function getTableCreateScript($tableName, $addDropIfExists = false)
96  {
97  return $this->getResource()->getTableCreateScript($tableName, $addDropIfExists);
98  }
99 
106  public function getTableDataDump($tableName)
107  {
108  return $this->getResource()->getTableDataDump($tableName);
109  }
110 
116  public function getHeader()
117  {
118  return $this->getResource()->getHeader();
119  }
120 
126  public function getFooter()
127  {
128  return $this->getResource()->getFooter();
129  }
130 
136  public function renderSql()
137  {
138  ini_set('max_execution_time', 0);
139  $sql = $this->getHeader();
140 
141  $tables = $this->getTables();
142  foreach ($tables as $tableName) {
143  $sql .= $this->getTableCreateScript($tableName, true);
144  $sql .= $this->getTableDataDump($tableName);
145  }
146 
147  $sql .= $this->getFooter();
148  return $sql;
149  }
150 
154  public function createBackup(\Magento\Framework\Backup\Db\BackupInterface $backup)
155  {
156  if (!$this->helper->isEnabled()) {
157  throw new RuntimeException(__('Backup functionality is disabled'));
158  }
159 
160  $backup->open(true);
161 
162  $this->getResource()->beginTransaction();
163 
164  $tables = $this->getResource()->getTables();
165 
166  $backup->write($this->getResource()->getHeader());
167 
168  $ignoreDataTablesList = $this->getIgnoreDataTablesList();
169 
170  foreach ($tables as $table) {
171  $backup->write(
172  $this->getResource()->getTableHeader($table) . $this->getResource()->getTableDropSql($table) . "\n"
173  );
174  $backup->write($this->getResource()->getTableCreateSql($table, false) . "\n");
175 
176  $tableStatus = $this->getResource()->getTableStatus($table);
177 
178  if ($tableStatus->getRows() && !in_array($table, $ignoreDataTablesList)) {
179  $backup->write($this->getResource()->getTableDataBeforeSql($table));
180 
181  if ($tableStatus->getDataLength() > self::BUFFER_LENGTH) {
182  if ($tableStatus->getAvgRowLength() < self::BUFFER_LENGTH) {
183  $limit = floor(self::BUFFER_LENGTH / max($tableStatus->getAvgRowLength(), 1));
184  $multiRowsLength = ceil($tableStatus->getRows() / $limit);
185  } else {
186  $limit = 1;
187  $multiRowsLength = $tableStatus->getRows();
188  }
189  } else {
190  $limit = $tableStatus->getRows();
191  $multiRowsLength = 1;
192  }
193 
194  for ($i = 0; $i < $multiRowsLength; $i++) {
195  $backup->write($this->getResource()->getTableDataSql($table, $limit, $i * $limit));
196  }
197 
198  $backup->write($this->getResource()->getTableDataAfterSql($table));
199  }
200  }
201  $backup->write($this->getResource()->getTableForeignKeysSql());
202  $backup->write($this->getResource()->getTableTriggersSql());
203  $backup->write($this->getResource()->getFooter());
204 
205  $this->getResource()->commitTransaction();
206 
207  $backup->close();
208  }
209 
215  public function getDBBackupSize()
216  {
217  $tables = $this->getResource()->getTables();
218  $ignoreDataTablesList = $this->getIgnoreDataTablesList();
219  $size = 0;
220  foreach ($tables as $table) {
221  $tableStatus = $this->getResource()->getTableStatus($table);
222  if ($tableStatus->getRows() && !in_array($table, $ignoreDataTablesList)) {
223  $size += $tableStatus->getDataLength() + $tableStatus->getIndexLength();
224  }
225  }
226  return $size;
227  }
228 
234  public function getIgnoreDataTablesList()
235  {
236  $result = [];
237 
238  foreach ($this->_ignoreDataTablesList as $table) {
239  $result[] = $this->_resource->getTableName($table);
240  }
241 
242  return $result;
243  }
244 }
$tableName
Definition: trigger.php:13
ini_set($varName, $newValue)
getTableCreateScript($tableName, $addDropIfExists=false)
Definition: Db.php:95
createBackup(\Magento\Framework\Backup\Db\BackupInterface $backup)
Definition: Db.php:154
__()
Definition: __.php:13
$resource
Definition: bulk.php:12
const BUFFER_LENGTH
Definition: Db.php:25
getTableDataDump($tableName)
Definition: Db.php:106
__construct(\Magento\Backup\Model\ResourceModel\Db $resourceDb, \Magento\Framework\App\ResourceConnection $resource, ?Helper $helper=null)
Definition: Db.php:51
$table
Definition: trigger.php:14
$i
Definition: gallery.phtml:31