MaintenanceController.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <?php
  2. declare(strict_types=1);
  3. namespace PhpMyAdmin\Controllers\Table;
  4. use PhpMyAdmin\Html\Generator;
  5. use PhpMyAdmin\Response;
  6. use PhpMyAdmin\Table\Maintenance;
  7. use PhpMyAdmin\Template;
  8. use function count;
  9. use function is_array;
  10. final class MaintenanceController extends AbstractController
  11. {
  12. /** @var Maintenance */
  13. private $model;
  14. /**
  15. * @param Response $response
  16. * @param string $db
  17. * @param string $table
  18. */
  19. public function __construct(
  20. $response,
  21. Template $template,
  22. $db,
  23. $table,
  24. Maintenance $model
  25. ) {
  26. parent::__construct($response, $template, $db, $table);
  27. $this->model = $model;
  28. }
  29. public function analyze(): void
  30. {
  31. global $cfg;
  32. /** @var string[] $selected */
  33. $selected = $_POST['selected_tbl'] ?? [];
  34. if (empty($selected) || ! is_array($selected)) {
  35. $this->response->setRequestStatus(false);
  36. $this->response->addJSON('message', __('No table selected.'));
  37. return;
  38. }
  39. if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
  40. $this->response->setRequestStatus(false);
  41. $this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
  42. return;
  43. }
  44. [$rows, $query] = $this->model->getAnalyzeTableRows($this->db, $selected);
  45. $message = Generator::getMessage(
  46. __('Your SQL query has been executed successfully.'),
  47. $query,
  48. 'success'
  49. );
  50. $this->render('table/maintenance/analyze', [
  51. 'message' => $message,
  52. 'rows' => $rows,
  53. ]);
  54. }
  55. public function check(): void
  56. {
  57. global $cfg;
  58. /** @var string[] $selected */
  59. $selected = $_POST['selected_tbl'] ?? [];
  60. if (empty($selected) || ! is_array($selected)) {
  61. $this->response->setRequestStatus(false);
  62. $this->response->addJSON('message', __('No table selected.'));
  63. return;
  64. }
  65. if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
  66. $this->response->setRequestStatus(false);
  67. $this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
  68. return;
  69. }
  70. [$rows, $query] = $this->model->getCheckTableRows($this->db, $selected);
  71. $message = Generator::getMessage(
  72. __('Your SQL query has been executed successfully.'),
  73. $query,
  74. 'success'
  75. );
  76. $indexesProblems = $this->model->getIndexesProblems($this->db, $selected);
  77. $this->render('table/maintenance/check', [
  78. 'message' => $message,
  79. 'rows' => $rows,
  80. 'indexes_problems' => $indexesProblems,
  81. ]);
  82. }
  83. public function checksum(): void
  84. {
  85. global $cfg;
  86. /** @var string[] $selected */
  87. $selected = $_POST['selected_tbl'] ?? [];
  88. if (empty($selected) || ! is_array($selected)) {
  89. $this->response->setRequestStatus(false);
  90. $this->response->addJSON('message', __('No table selected.'));
  91. return;
  92. }
  93. if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
  94. $this->response->setRequestStatus(false);
  95. $this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
  96. return;
  97. }
  98. [$rows, $query, $warnings] = $this->model->getChecksumTableRows($this->db, $selected);
  99. $message = Generator::getMessage(
  100. __('Your SQL query has been executed successfully.'),
  101. $query,
  102. 'success'
  103. );
  104. $this->render('table/maintenance/checksum', [
  105. 'message' => $message,
  106. 'rows' => $rows,
  107. 'warnings' => $warnings,
  108. ]);
  109. }
  110. public function optimize(): void
  111. {
  112. global $cfg;
  113. /** @var string[] $selected */
  114. $selected = $_POST['selected_tbl'] ?? [];
  115. if (empty($selected) || ! is_array($selected)) {
  116. $this->response->setRequestStatus(false);
  117. $this->response->addJSON('message', __('No table selected.'));
  118. return;
  119. }
  120. if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
  121. $this->response->setRequestStatus(false);
  122. $this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
  123. return;
  124. }
  125. [$rows, $query] = $this->model->getOptimizeTableRows($this->db, $selected);
  126. $message = Generator::getMessage(
  127. __('Your SQL query has been executed successfully.'),
  128. $query,
  129. 'success'
  130. );
  131. $this->render('table/maintenance/optimize', [
  132. 'message' => $message,
  133. 'rows' => $rows,
  134. ]);
  135. }
  136. public function repair(): void
  137. {
  138. global $cfg;
  139. /** @var string[] $selected */
  140. $selected = $_POST['selected_tbl'] ?? [];
  141. if (empty($selected) || ! is_array($selected)) {
  142. $this->response->setRequestStatus(false);
  143. $this->response->addJSON('message', __('No table selected.'));
  144. return;
  145. }
  146. if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
  147. $this->response->setRequestStatus(false);
  148. $this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
  149. return;
  150. }
  151. [$rows, $query] = $this->model->getRepairTableRows($this->db, $selected);
  152. $message = Generator::getMessage(
  153. __('Your SQL query has been executed successfully.'),
  154. $query,
  155. 'success'
  156. );
  157. $this->render('table/maintenance/repair', [
  158. 'message' => $message,
  159. 'rows' => $rows,
  160. ]);
  161. }
  162. }