CreateViewsBackup.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Backup\Model\ResourceModel\View;
  8. use Magento\Framework\App\ResourceConnection;
  9. use Magento\Framework\Backup\Db\BackupInterface;
  10. use Magento\Framework\DB\Adapter\AdapterInterface;
  11. /**
  12. * Creates backup of Views in the database.
  13. */
  14. class CreateViewsBackup
  15. {
  16. /**
  17. * @var GetListViews
  18. */
  19. private $getListViews;
  20. /**
  21. * @var ResourceConnection
  22. */
  23. private $resourceConnection;
  24. /**
  25. * @var AdapterInterface
  26. */
  27. private $connection;
  28. /**
  29. * @param GetListViews $getListViews
  30. * @param ResourceConnection $resourceConnection
  31. */
  32. public function __construct(
  33. GetListViews $getListViews,
  34. ResourceConnection $resourceConnection
  35. ) {
  36. $this->getListViews = $getListViews;
  37. $this->resourceConnection = $resourceConnection;
  38. }
  39. /**
  40. * Write backup data to backup file.
  41. *
  42. * @param BackupInterface $backup
  43. */
  44. public function execute(BackupInterface $backup): void
  45. {
  46. $views = $this->getListViews->execute();
  47. foreach ($views as $view) {
  48. $backup->write($this->getViewHeader($view));
  49. $backup->write($this->getDropViewSql($view));
  50. $backup->write($this->getCreateView($view));
  51. }
  52. }
  53. /**
  54. * Retrieve Database connection for Backup.
  55. *
  56. * @return AdapterInterface
  57. */
  58. private function getConnection(): AdapterInterface
  59. {
  60. if (!$this->connection) {
  61. $this->connection = $this->resourceConnection->getConnection('backup');
  62. }
  63. return $this->connection;
  64. }
  65. /**
  66. * Get CREATE VIEW query for the specific view.
  67. *
  68. * @param string $viewName
  69. * @return string
  70. */
  71. private function getCreateView(string $viewName): string
  72. {
  73. $quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
  74. $query = 'SHOW CREATE VIEW ' . $quotedViewName;
  75. $row = $this->getConnection()->fetchRow($query);
  76. $regExp = '/\sDEFINER\=\`([^`]*)\`\@\`([^`]*)\`/';
  77. $sql = preg_replace($regExp, '', $row['Create View']);
  78. return $sql . ';' . "\n";
  79. }
  80. /**
  81. * Prepare a header for View being dumped.
  82. *
  83. * @param string $viewName
  84. * @return string
  85. */
  86. public function getViewHeader(string $viewName): string
  87. {
  88. $quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
  89. return "\n--\n" . "-- Structure for view {$quotedViewName}\n" . "--\n\n";
  90. }
  91. /**
  92. * Make sure that View being created is deleted if already exists.
  93. *
  94. * @param string $viewName
  95. * @return string
  96. */
  97. public function getDropViewSql(string $viewName): string
  98. {
  99. $quotedViewName = $this->getConnection()->quoteIdentifier($viewName);
  100. return sprintf('DROP VIEW IF EXISTS %s;\n', $quotedViewName);
  101. }
  102. }