* adjust for change table engine.

This commit is contained in:
wangyidong
2022-08-15 13:04:24 +08:00
parent b6dcbaa519
commit 811c1d2ad6
6 changed files with 62 additions and 41 deletions
+29 -23
View File
@@ -393,22 +393,36 @@ class admin extends control
* @access public
* @return void
*/
public function ajaxChangeTableEngine($tableName)
public function ajaxChangeTableEngine()
{
$response = array();
$response['result'] = 'success';
$response['message'] = '';
$response['result'] = 'success';
$response['message'] = '';
$response['thisTable'] = '';
$response['nextTable'] = '';
$tableEngines = $this->loadModel('misc')->getTableEngines();
if(!isset($tableEngines[$tableName]))
$thisTable = '';
$nextTable = '';
foreach($tableEngines as $table => $engine)
{
$response['result'] = 'fail';
return print(json_encode($response));
if($engine == 'InnoDB') continue;
if(stripos($table, 'searchindex') !== false)
{
$mysqlVersion = $this->loadModel('install')->getMysqlVersion();
if($mysqlVersion < 5.6) continue;
}
if($thisTable and empty($nextTable)) $nextTable = $table;
if(empty($thisTable)) $thisTable = $table;
if($thisTable and $nextTable) break;
}
if($tableEngines[$tableName] == 'InnoDB')
if(empty($thisTable))
{
$response['message'] = sprintf($this->lang->admin->changeSuccess, $tableName);
$response['result'] = 'finished';
return print(json_encode($response));
}
@@ -419,36 +433,28 @@ class admin extends control
foreach($dbProcesses as $dbProcess)
{
if($dbProcess->db != $this->config->db->name) continue;
if(strpos($dbProcess->Info, " {$tableName} ") !== false)
if(strpos($dbProcess->Info, " {$thisTable} ") !== false)
{
$response['message'] = sprintf($this->lang->upgrade->changingTable, $tableName);
$response['message'] = sprintf($this->lang->upgrade->changingTable, $thisTable);
return print(json_encode($response));
}
}
}
catch(PDOException $e){}
if(stripos($tableName, 'searchindex') !== false)
{
$mysqlVersion = $this->loadModel('install')->getMysqlVersion();
if($mysqlVersion < 5.6)
{
$response['result'] = 'fail';
$response['message'] = $this->lang->admin->errorInnodb;
return print(json_encode($response));
}
}
$response['thisTable'] = $thisTable;
$response['nextTable'] = $nextTable;
try
{
$sql = "ALTER TABLE `$tableName` ENGINE='InnoDB'";
$sql = "ALTER TABLE `$thisTable` ENGINE='InnoDB'";
$this->dao->exec($sql);
$response['message'] = sprintf($this->lang->admin->changeSuccess, $tableName);
$response['message'] = sprintf($this->lang->admin->changeSuccess, $thisTable);
}
catch(PDOException $e)
{
$response['result'] = 'fail';
$response['message'] = sprintf($this->lang->admin->changeFail, $tableName, htmlspecialchars($e->getMessage()));
$response['message'] = sprintf($this->lang->admin->changeFail, $thisTable, htmlspecialchars($e->getMessage()));
}
return print(json_encode($response));
+1
View File
@@ -35,6 +35,7 @@ $lang->admin->changingTable = 'Replacing data table %s engine...';
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
$lang->admin->changeFinished = "Database engine replacement completed.";
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
+1
View File
@@ -35,6 +35,7 @@ $lang->admin->changingTable = 'Replacing data table %s engine...';
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
$lang->admin->changeFinished = "Database engine replacement completed.";
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
+1
View File
@@ -35,6 +35,7 @@ $lang->admin->changingTable = 'Replacing data table %s engine...';
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
$lang->admin->changeFinished = "Database engine replacement completed.";
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
+1
View File
@@ -35,6 +35,7 @@ $lang->admin->changingTable = '正在更换数据表%s引擎...';
$lang->admin->changeSuccess = '已经更换数据表%s引擎为InnoDB。';
$lang->admin->changeFail = "更换数据表%s引擎失败,原因:<span class='text-red'>%s</span>。";
$lang->admin->errorInnodb = '您当前的数据库不支持使用InnoDB数据表引擎。';
$lang->admin->changeFinished = "更换数据库引擎完毕。";
$lang->admin->engineInfo = "表<strong>%s</strong>的引擎是<strong>%s</strong>。";
$lang->admin->engineSummary['hasMyISAM'] = "有%s个表不是InnoDB引擎";
$lang->admin->engineSummary['allInnoDB'] = "所有的表都是InnoDB引擎了";
+29 -18
View File
@@ -36,6 +36,7 @@
</div>
</div>
<?php js::set('changingTable', $lang->admin->changingTable);?>
<?php js::set('hasMyISAM', $lang->admin->engineSummary['hasMyISAM']);?>
<script>
/**
* Change all table engines.
@@ -45,34 +46,24 @@
*/
function changeAllEngines()
{
var tables = [];
var $engineBox = $('#engineBox');
$engineBox.find('li').each(function()
{
tables.push($(this).attr('data-table'));
});
$('.btn.changeEngine').hide();
$engineBox.empty();
$.each(tables, function(_, table)
{
changeEngine(table);
});
changeTableEngine();
}
/**
* Change one engine.
* Ajax change table engine.
*
* @param string $table
* @access public
* @return void
*/
function changeEngine(table)
function changeTableEngine()
{
var $engineBox = $('#engineBox');
var link = createLink('admin', 'ajaxChangeTableEngine', 'table=' + table);
if($engineBox.find('[data-table=' + table + ']').length == 0) $engineBox.append("<div data-table='" + table + "'>" + changingTable.replace('%s', table) + "</div>");
var link = createLink('admin', 'ajaxChangeTableEngine');
var fails = 0;
$.ajax(
{
type: "GET",
@@ -80,11 +71,31 @@ function changeEngine(table)
success: function(response)
{
response = JSON.parse(response);
$engineBox.find('[data-table=' + table + ']').html(response.message).addClass('text-success');
if(response == null || response.result == 'finished')
{
$engineBox.append("<div class='text-success'><?php echo $lang->admin->changeFinished?></div>");
$engineBox.append("<div class='btn btn-sm'><a href='javascript:location.reload()'><?php echo $lang->refresh;?></a></div>");
if(fails == 0) $('#mainContent .main-header h2').html("<?php echo $lang->admin->engineSummary['allInnoDB']?>");
if(fails != 0) $('#mainContent .main-header h2').html(hasMyISAM.replace('%s', fails));
}
else
{
table = response.thisTable;
if($engineBox.find('[data-table=' + table + ']').length == 0) $engineBox.append("<li data-table='" + table + "'>" + changingTable.replace('%s', table) + "</li>");
$engineBox.find('[data-table=' + table + ']').html(response.message).addClass('text-success');
nextTable = response.nextTable;
if(nextTable && $engineBox.find('[data-table=' + nextTable + ']').length == 0) $engineBox.append("<li data-table='" + nextTable + "'>" + changingTable.replace('%s', nextTable) + "</li>");
if(response.result == 'fail') fails += 1;
$(document).scrollTop($(document).height());
changeTableEngine();
}
},
error: function()
{
changeEngine(table);
changeTableEngine();
}
})
}