123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Backup\Model;
- use Magento\Backup\Helper\Data as Helper;
- use Magento\Backup\Model\ResourceModel\Table\GetListTables;
- use Magento\Backup\Model\ResourceModel\View\CreateViewsBackup;
- use Magento\Framework\App\ObjectManager;
- use Magento\Framework\Exception\RuntimeException;
- /**
- * Database backup model
- *
- * @api
- * @since 100.0.2
- * @deprecated 100.2.6 Backup module is to be removed.
- */
- class Db implements \Magento\Framework\Backup\Db\BackupDbInterface
- {
- /**
- * Buffer length for multi rows
- * default 100 Kb
- */
- const BUFFER_LENGTH = 102400;
- /**
- * Backup resource model
- *
- * @var \Magento\Backup\Model\ResourceModel\Db
- */
- protected $_resourceDb = null;
- /**
- * Core resource model
- *
- * @var \Magento\Framework\App\ResourceConnection
- */
- protected $_resource = null;
- /**
- * @var Helper
- */
- private $helper;
- /**
- * @var GetListTables
- */
- private $getListTables;
- /**
- * @var CreateViewsBackup
- */
- private $getViewsBackup;
- /**
- * Db constructor.
- * @param ResourceModel\Db $resourceDb
- * @param \Magento\Framework\App\ResourceConnection $resource
- * @param Helper|null $helper
- * @param GetListTables|null $getListTables
- * @param CreateViewsBackup|null $getViewsBackup
- */
- public function __construct(
- ResourceModel\Db $resourceDb,
- \Magento\Framework\App\ResourceConnection $resource,
- ?Helper $helper = null,
- ?GetListTables $getListTables = null,
- ?CreateViewsBackup $getViewsBackup = null
- ) {
- $this->_resourceDb = $resourceDb;
- $this->_resource = $resource;
- $this->helper = $helper ?? ObjectManager::getInstance()->get(Helper::class);
- $this->getListTables = $getListTables ?? ObjectManager::getInstance()->get(GetListTables::class);
- $this->getViewsBackup = $getViewsBackup ?? ObjectManager::getInstance()->get(CreateViewsBackup::class);
- }
- /**
- * List of tables which data should not be backed up
- *
- * @var array
- */
- protected $_ignoreDataTablesList = ['importexport/importdata'];
- /**
- * Retrieve resource model
- *
- * @return \Magento\Backup\Model\ResourceModel\Db
- */
- public function getResource()
- {
- return $this->_resourceDb;
- }
- /**
- * Tables list.
- *
- * @return array
- */
- public function getTables()
- {
- return $this->getResource()->getTables();
- }
- /**
- * Command to recreate given table.
- *
- * @param string $tableName
- * @param bool $addDropIfExists
- * @return string
- */
- public function getTableCreateScript($tableName, $addDropIfExists = false)
- {
- return $this->getResource()->getTableCreateScript($tableName, $addDropIfExists);
- }
- /**
- * Generate table's data dump.
- *
- * @param string $tableName
- * @return string
- */
- public function getTableDataDump($tableName)
- {
- return $this->getResource()->getTableDataDump($tableName);
- }
- /**
- * Header for dumps.
- *
- * @return string
- */
- public function getHeader()
- {
- return $this->getResource()->getHeader();
- }
- /**
- * Footer for dumps.
- *
- * @return string
- */
- public function getFooter()
- {
- return $this->getResource()->getFooter();
- }
- /**
- * Get backup SQL.
- *
- * @return string
- */
- public function renderSql()
- {
- ini_set('max_execution_time', 0);
- $sql = $this->getHeader();
- $tables = $this->getTables();
- foreach ($tables as $tableName) {
- $sql .= $this->getTableCreateScript($tableName, true);
- $sql .= $this->getTableDataDump($tableName);
- }
- $sql .= $this->getFooter();
- return $sql;
- }
- /**
- * @inheritDoc
- */
- public function createBackup(\Magento\Framework\Backup\Db\BackupInterface $backup)
- {
- if (!$this->helper->isEnabled()) {
- throw new RuntimeException(__('Backup functionality is disabled'));
- }
- $backup->open(true);
- $this->getResource()->beginTransaction();
- $tables = $this->getListTables->execute();
- $backup->write($this->getResource()->getHeader());
- $ignoreDataTablesList = $this->getIgnoreDataTablesList();
- foreach ($tables as $table) {
- $backup->write(
- $this->getResource()->getTableHeader($table) . $this->getResource()->getTableDropSql($table) . "\n"
- );
- $backup->write($this->getResource()->getTableCreateSql($table, false) . "\n");
- $tableStatus = $this->getResource()->getTableStatus($table);
- if ($tableStatus->getRows() && !in_array($table, $ignoreDataTablesList)) {
- $backup->write($this->getResource()->getTableDataBeforeSql($table));
- if ($tableStatus->getDataLength() > self::BUFFER_LENGTH) {
- if ($tableStatus->getAvgRowLength() < self::BUFFER_LENGTH) {
- $limit = floor(self::BUFFER_LENGTH / max($tableStatus->getAvgRowLength(), 1));
- $multiRowsLength = ceil($tableStatus->getRows() / $limit);
- } else {
- $limit = 1;
- $multiRowsLength = $tableStatus->getRows();
- }
- } else {
- $limit = $tableStatus->getRows();
- $multiRowsLength = 1;
- }
- for ($i = 0; $i < $multiRowsLength; $i++) {
- $backup->write($this->getResource()->getTableDataSql($table, $limit, $i * $limit));
- }
- $backup->write($this->getResource()->getTableDataAfterSql($table));
- }
- }
- $this->getViewsBackup->execute($backup);
- $backup->write($this->getResource()->getTableForeignKeysSql());
- $backup->write($this->getResource()->getTableTriggersSql());
- $backup->write($this->getResource()->getFooter());
- $this->getResource()->commitTransaction();
- $backup->close();
- }
- /**
- * Get database backup size
- *
- * @return int
- */
- public function getDBBackupSize()
- {
- $tables = $this->getResource()->getTables();
- $ignoreDataTablesList = $this->getIgnoreDataTablesList();
- $size = 0;
- foreach ($tables as $table) {
- $tableStatus = $this->getResource()->getTableStatus($table);
- if ($tableStatus->getRows() && !in_array($table, $ignoreDataTablesList)) {
- $size += $tableStatus->getDataLength() + $tableStatus->getIndexLength();
- }
- }
- return $size;
- }
- /**
- * Returns the list of tables which data should not be backed up
- *
- * @return string[]
- */
- public function getIgnoreDataTablesList()
- {
- $result = [];
- foreach ($this->_ignoreDataTablesList as $table) {
- $result[] = $this->_resource->getTableName($table);
- }
- return $result;
- }
- }
|