Sindbad~EG File Manager
<?php
namespace Duplicator\Installer\Core\Deploy\Database;
use Duplicator\Installer\Core\Params\PrmMng;
use Duplicator\Installer\Utils\Log\Log;
use DUPX_ArchiveConfig;
use DUPX_DB;
use DUPX_DB_Functions;
use DUPX_DBInstall;
use DUPX_InstallerState;
use DUPX_NOTICE_ITEM;
use DUPX_NOTICE_MANAGER;
/**
* Class with db cleanup functions
*/
class DbCleanup
{
/**
* Cleanup extra entities (views, procs, funcs)
*
* @return void
*/
public static function cleanupExtra()
{
if (DUPX_InstallerState::isRestoreBackup()) {
return;
}
Log::info("CLEANUP EXTRA");
$paramsManager = PrmMng::getInstance();
if (!$paramsManager->getValue(PrmMng::PARAM_DB_VIEW_CREATION)) {
self::dropViews();
Log::info("\t- VIEWS DROPPED");
} else {
Log::info("\t- SKIP DROP VIEWS");
}
if (!$paramsManager->getValue(PrmMng::PARAM_DB_PROC_CREATION)) {
self::dropProcs();
Log::info("\t- PROCS DROPPED");
} else {
Log::info("\t- SKIP DROP PROCS");
}
if (!$paramsManager->getValue(PrmMng::PARAM_DB_FUNC_CREATION)) {
self::dropFuncs();
Log::info("\t- FUNCS DROPPED");
} else {
Log::info("\t- SKIP DROP FUNCS");
}
}
/**
* Cleanup packages
*
* @return void
*/
public static function cleanupPackages()
{
if (DUPX_InstallerState::isRestoreBackup()) {
Log::info("REMOVE CURRENT PACKAGE IN BACKUP");
self::deletePackageInBackup();
} else {
Log::info("EMPTY PACKAGES TABLE");
self::emptyDuplicatorPackages();
}
}
/**
* Cleanup options tables (remove transientes ..)
*
* @return int return number of items deleted
*/
public static function cleanupOptions()
{
if (DUPX_InstallerState::isRestoreBackup()) {
return;
}
$dbh = DUPX_DB_Functions::getInstance()->dbConnection();
$archiveConfig = DUPX_ArchiveConfig::getInstance();
$optionsTableList = array();
$deleteOptionConds = array();
$optionsTableList[] = mysqli_real_escape_string($dbh, DUPX_DB_Functions::getOptionsTableName());
$deleteOptionConds[] = '`option_name` = "duplicator_plugin_data_stats"';
$deleteOptionConds[] = '`option_name` LIKE "\_transient%"';
$deleteOptionConds[] = '`option_name` LIKE "\_site\_transient%"';
$opts_delete = array();
foreach ($archiveConfig->opts_delete as $value) {
$opts_delete[] = '"' . mysqli_real_escape_string($dbh, $value) . '"';
}
if (count($opts_delete) > 0) {
$deleteOptionConds[] = '`option_name` IN (' . implode(',', $opts_delete) . ')';
}
$count = 0;
foreach ($optionsTableList as $optionsTable) {
$log = "CLEAN OPTIONS [" . $optionsTable . "]";
foreach ($deleteOptionConds as $cond) {
$log .= "\n\t" . $cond;
}
Log::info($log);
$count += DUPX_DB::chunksDelete($dbh, $optionsTable, implode(' OR ', $deleteOptionConds));
Log::info(sprintf('DATABASE OPTIONS DELETED [ROWS:%6d]', $count));
}
return $count;
}
/**
* Delete current package in backup
*
* @return void
*/
protected static function deletePackageInBackup()
{
$dbh = DUPX_DB_Functions::getInstance()->dbConnection();
$packageId = DUPX_ArchiveConfig::getInstance()->packInfo->packageId;
Log::info("CLEANUP CURRENT PACKAGE STATUS ID " . $packageId);
$packagesTable = mysqli_real_escape_string($dbh, DUPX_DB_Functions::getPackagesTableName());
$optionsTable = mysqli_real_escape_string($dbh, DUPX_DB_Functions::getOptionsTableName());
DUPX_DB::mysqli_query($dbh, 'DELETE FROM `' . $packagesTable . '` WHERE `id` = ' . $packageId);
DUPX_DB::mysqli_query($dbh, "DELETE FROM `" . $optionsTable . "` WHERE `option_name` = 'duplicator_package_active'");
}
/**
* Empty duplicator packages table
*
* @return int return number of packages deleted
*/
protected static function emptyDuplicatorPackages()
{
Log::info("CLEAN PACKAGES");
$dbh = DUPX_DB_Functions::getInstance()->dbConnection();
$packagesTable = mysqli_real_escape_string($dbh, DUPX_DB_Functions::getPackagesTableName());
$count = DUPX_DB::chunksDelete($dbh, $packagesTable, '1 = 1');
Log::info('DATABASE PACKAGE DELETED [ROWS:' . str_pad($count, 6, " ", STR_PAD_LEFT) . ']');
return$count;
}
/**
* Drop db procedures
*
* @return void
*/
public static function dropProcs()
{
$dbh = DUPX_DB_Functions::getInstance()->dbConnection();
$dbName = PrmMng::getInstance()->getValue(PrmMng::PARAM_DB_NAME);
$sql = "SHOW PROCEDURE STATUS WHERE db='{$dbName}'";
$nManager = DUPX_NOTICE_MANAGER::getInstance();
if (!($result = DUPX_DB::mysqli_query($dbh, $sql))) {
$nManager->addFinalReportNotice(array(
'shortMsg' => 'PROCEDURE CLEAN ERROR: ' . mysqli_error($dbh),
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to get list of PROCEDURES from database "%s".', $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => 'database',
));
Log::info("PROCEDURE CLEAN ERROR: Could not get list of PROCEDURES to drop them.");
return;
}
if ($result->num_rows === 0) {
return;
}
while ($row = mysqli_fetch_row($result)) {
$proc_name = $row[1];
$sql = "DROP PROCEDURE IF EXISTS `" . mysqli_real_escape_string($dbh, $dbName) . "`.`" . mysqli_real_escape_string($dbh, $proc_name) . "`";
if (!DUPX_DB::mysqli_query($dbh, $sql)) {
$err = mysqli_error($dbh);
$nManager->addNextStepNotice(array(
'shortMsg' => 'PROCEDURE CLEAN ERROR',
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to remove PROCEDURE "%s" from database "%s".<br/>', $proc_name, $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'drop-proc-fail-msg');
$nManager->addFinalReportNotice(array(
'shortMsg' => 'PROCEDURE CLEAN ERROR: ' . $err,
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to remove PROCEDURE "%s" from database "%s".', $proc_name, $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => 'database',
));
Log::info("PROCEDURE CLEAN ERROR: '{$err}'\n\t[SQL=" . substr($sql, 0, DUPX_DBInstall::QUERY_ERROR_LOG_LEN) . "...]\n\n");
}
}
$nManager->addNextStepNotice(array(
'shortMsg' => 'PROCEDURE CLEAN ERROR',
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf(ERR_DROP_PROCEDURE_TRYCLEAN, mysqli_error($dbh)),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_PREPEND_IF_EXISTS, 'drop-proc-fail-msg');
}
/**
* Drop db functions
*
* @return void
*/
public static function dropFuncs()
{
$dbh = DUPX_DB_Functions::getInstance()->dbConnection();
$dbName = PrmMng::getInstance()->getValue(PrmMng::PARAM_DB_NAME);
$sql = "SHOW FUNCTION STATUS WHERE db='{$dbName}'";
$nManager = DUPX_NOTICE_MANAGER::getInstance();
if (!($result = DUPX_DB::mysqli_query($dbh, $sql))) {
$nManager->addFinalReportNotice(array(
'shortMsg' => 'FUNCTION CLEAN ERROR: ' . mysqli_error($dbh),
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to get list of FUNCTIONS from database "%s".', $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => 'database',
));
Log::info("FUNCTION CLEAN ERROR: Could not get list of FUNCTIONS to drop them.");
return;
}
if ($result->num_rows === 0) {
return;
}
while ($row = mysqli_fetch_row($result)) {
$func_name = $row[1];
$sql = "DROP FUNCTION IF EXISTS `" . mysqli_real_escape_string($dbh, $dbName) . "`.`" . mysqli_real_escape_string($dbh, $func_name) . "`";
if (!DUPX_DB::mysqli_query($dbh, $sql)) {
$err = mysqli_error($dbh);
$nManager->addNextStepNotice(array(
'shortMsg' => 'FUNCTION CLEAN ERROR',
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to remove FUNCTION "%s" from database "%s".<br/>', $func_name, $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'drop-func-fail-msg');
$nManager->addFinalReportNotice(array(
'shortMsg' => 'FUNCTION CLEAN ERROR: ' . $err,
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to remove FUNCTION "%s" from database "%s".', $func_name, $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => 'database',
));
Log::info("FUNCTION CLEAN ERROR: '{$err}'\n\t[SQL=" . substr($sql, 0, DUPX_DBInstall::QUERY_ERROR_LOG_LEN) . "...]\n\n");
}
}
$nManager->addNextStepNotice(array(
'shortMsg' => 'FUNCTION CLEAN ERROR',
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf(ERR_DROP_FUNCTION_TRYCLEAN, mysqli_error($dbh)),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_PREPEND_IF_EXISTS, 'drop-func-fail-msg');
}
/**
* Drop db views
*
* @return void
*/
public static function dropViews()
{
$dbh = DUPX_DB_Functions::getInstance()->dbConnection();
$dbName = PrmMng::getInstance()->getValue(PrmMng::PARAM_DB_NAME);
$sql = "SHOW FULL TABLES WHERE Table_Type = 'VIEW'";
$nManager = DUPX_NOTICE_MANAGER::getInstance();
if (!($result = DUPX_DB::mysqli_query($dbh, $sql))) {
$nManager->addFinalReportNotice(array(
'shortMsg' => 'VIEW CLEAN ERROR: ' . mysqli_error($dbh),
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to get list of VIEWS from database "%s"', $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => 'database',
));
Log::info("VIEW CLEAN ERROR: Could not get list of VIEWS to drop them.");
return;
}
if ($result->num_rows === 0) {
return;
}
while ($row = mysqli_fetch_row($result)) {
$view_name = $row[0];
$sql = "DROP VIEW `" . mysqli_real_escape_string($dbh, $dbName) . "`.`" . mysqli_real_escape_string($dbh, $view_name) . "`";
if (!DUPX_DB::mysqli_query($dbh, $sql)) {
$err = mysqli_error($dbh);
$nManager->addNextStepNotice(array(
'shortMsg' => 'VIEW CLEAN ERROR',
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to remove VIEW "%s" from database "%s".<br/>', $view_name, $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'drop-view-fail-msg');
$nManager->addFinalReportNotice(array(
'shortMsg' => 'VIEW CLEAN ERROR: ' . $err,
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf('Unable to remove VIEW "%s" from database "%s"', $view_name, $dbName),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => 'database',
));
Log::info("VIEW CLEAN ERROR: '{$err}'\n\t[SQL=" . substr($sql, 0, DUPX_DBInstall::QUERY_ERROR_LOG_LEN) . "...]\n\n");
}
}
$nManager->addNextStepNotice(array(
'shortMsg' => 'VIEW CLEAN ERROR',
'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
'longMsg' => sprintf(ERR_DROP_VIEW_TRYCLEAN, mysqli_error($dbh)),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
), DUPX_NOTICE_MANAGER::ADD_UNIQUE_PREPEND_IF_EXISTS, 'drop-view-fail-msg');
}
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists