Files
BE_CPONE/application/controllers/tools/Xdownload.php
2026-04-27 10:26:26 +07:00

235 lines
7.3 KiB
PHP

<?php
class Xdownload extends MY_Controller
{
function __construct()
{
parent::__construct();
}
function log()
{
$pwd = $this->db->password;
$temp_file = tempnam(sys_get_temp_dir(), '-log-db') . ".sql";
if (file_exists($temp_file)) {
unlink($temp_file);
}
$cmd = "/usr/bin/mysqldump --triggers --routines --no-data -u root -p$pwd cpone_log > $temp_file";
exec($cmd);
if (file_exists($temp_file)) {
return $temp_file;
}
return false;
}
/*
create table xdl_numbering (
xdlNumberingID int not null auto_increment primary key,
xdlNumberingS_NumberingID int,
xdlNumberingType varchar(12),
xdlNumberingPrefix varchar(50),
xdlNumberingIsActive varchar(1) default 'Y',
xdlNumberingCreated datetime default current_timestamp(),
xdlNumberingLastUpdated datetime default current_timestamp()
on update current_timestamp(),
key(xdlNumberingIsActive),
key(xdl_numberingType),
key(xdlNumberingPrefix)
);
create table xdl_log(
xdlLogID int not null auto_increment primary key,
xdlLogMgmMcuID int,
xdlLogIsActive varchar(1) default 'Y',
xdlLogStatus varchar(1) default 'N' comment 'N:New, P:Process, D:Done',
xdlLogCreated datetime current_timestamp(),
xdlLogLastUpdated datetime current_timestamp()
on update current_timestamp(),
key(xdlLogIsActive),
key(xdlLogStatus)
);
create table xdl_table(
xdlTableID int not null auto_increment primary key,
xdlTableName varchar(200),
xdlTableStruOnly varchar(1) default 'N',
xdlTableIsActive varchar(1) default 'Y',
xdlTableCreated datetime default current_timestamp(),
xdlTableLastUpdated datetime default current_timestamp()
on update current_timestamp()
);
*/
function table()
{
$pwd = $this->db->password;
$sql = "select * from xdl_table where xdlTableIsActive ='Y'";
$qry = $this->db->query($sql);
if (!$qry) {
return [false, $this->db->error()["message"]];
}
$temp_file = tempnam(sys_get_temp_dir(), "cpone-stru") . ".sql";
if (file_exists($temp_file)) {
unlink($temp_file);
}
$rows = $qry->result_array();
if (count($rows) == 0) {
unlink($temp_file);
return [false, "Download Tables not defined yet"];
}
foreach ($rows as $r) {
$tbl = $r["xdlTableName"];
$isStruOnly = $r["xdlTableStruOnly"] == "Y";
if ($isStruOnly) {
$cmd = "/usr/bin/mysqldump --triggers --no-data -u root -p$pwd cpone $tbl >> $temp_file";
} else {
$cmd = "/usr/bin/mysqldump --triggers -u root -p$pwd cpone $tbl >> $temp_file";
}
exec($cmd);
}
return [$temp_file, ""];
}
function routines()
{
$pwd = $this->db->password;
$temp_file = tempnam(sys_get_temp_dir(), '-routines') . ".sql";
if (file_exists($temp_file)) {
unlink($temp_file);
}
$cmd = "/usr/bin/mysqldump --triggers --routines --no-data -u root -p$pwd --no-create-db --no-create-info cpone > $temp_file";
exec($cmd);
if (file_exists($temp_file)) {
return $temp_file;
}
return false;
}
function compress($mcuID, $log_file, $table_file, $routines_file)
{
$dt = date("Ymd");
$temp_file = tempnam(sys_get_temp_dir(), "xdl_{$mcuID}_{$dt}") . ".zip";
if (file_exists($temp_file)) {
unlink($temp_file);
}
$cmd = "/usr/bin/zip $temp_file $log_file $table_file $routines_file";
exec($cmd);
if (file_exists($temp_file)) {
return $temp_file;
}
return false;
}
function check_and_update($mcuID)
{
$sql = "select * from xdl_log where xdlLogMgmMcuID = ?
and xdlLogIsActive = 'Y'";
$qry = $this->db->query($sql, [$mcuID]);
if (!$qry) {
echo json_encode(["status" => "ERR", "message" => $this->db->error()["message"]]);
exit;
}
$rows = $qry->result_array();
if (count($rows) > 0) {
$dt = $rows[0]["xdlLogCreated"];
if ($rows[0]["xdlLogStatus"] == "P") {
echo json_encode(["status" => "ERR", "message" => "Proses Download Mcu sedang berlangsung @ $dt"]);
exit;
}
if ($rows[0]["xdlLogStatus"] == "D") {
echo json_encode(["status" => "ERR", "message" => "Proses Download Mcu sudah selesai @ $dt"]);
exit;
}
}
$sql = "select group_concat( concat(S_NumberingType,':',S_NumberingPrefix))
as duplicate
from s_numbering
join xdl_numbering on S_NumberingIsActive = 'Y'
and S_NumberingType = xdlNumberingType
and S_NumberingPrefix = xdlNumberingPrefix";
$qry = $this->db->query($sql, [$mcuID]);
if (!$qry) {
echo json_encode(["status" => "ERR", "message" => $this->db->error()["message"]]);
exit;
}
$rows = $qry->result_array();
$msg = "";
if (count($rows) > O) {
$msg = $rows[0]["duplicate"];
}
if ($msg != "") {
echo json_encode(["status" => "ERR", "message" => "Setting Numbering Offline ada yang duplicate:\n$msg"]);
exit;
}
$sql = "insert into xdl_log(xdlLogMgmMcuID,xdlLogStatus) values(?,'P')";
$qry = $this->db->query($sql, [$mcuID]);
if (!$qry) {
echo json_encode(["status" => "ERR", "message" => $this->db->error()["message"]]);
exit;
}
return $this->db->insert_id();
}
function update_log($logID, $status)
{
$sql = "update xdl_log set xdlLogStatus = ? where xdlLogID = ?";
$qry = $this->db->query($sql, [$status, $logID]);
if (!$qry) {
echo json_encode(["status" => "ERR", "message" => $this->db->error()["message"]]);
exit;
}
}
function file($mcuID)
{
header("Content-type: application/zip");
$tgt_file = "/tmp-offline/offline-{$mcuID}-data.zip";
$tgt_name = "offline-{$mcuID}-data.zip";
header("Content-Disposition: inline; filename=\"$tgt_name\"");
echo file_get_contents($tgt_file);
}
function go($mcuID)
{
header("Content-type: application/json");
$logID = $this->check_and_update($mcuID);
$log_file = $this->log();
if ($log_file === false) {
$this->update_log($logID, "E");
echo json_encode(["status" => "ERR", "message" => "Error export cpone_log structure"]);
exit;
}
list($table_file, $msg) = $this->table();
if ($table_file === false) {
unlink($log_file);
$this->update_log($logID, "E");
echo json_encode(["status" => "ERR", "message" => "Error export cpone :\n$msg"]);
exit;
}
$routines_file = $this->routines();
if ($routines_file === false) {
unlink($log_file);
unlink($table_file);
$this->update_log($logID, "E");
echo json_encode(["status" => "ERR", "message" => "Error export cpone routines and triggers"]);
exit;
}
$zip_file = $this->compress($mcuID, $log_file, $table_file, $routines_file);
unlink($log_file);
unlink($table_file);
unlink($routines_file);
$this->update_log($logID, "D");
$tgt_file = "/tmp-offline/offline-{$mcuID}-data.zip";
$status = rename($zip_file, $tgt_file);
if ($status == false) {
echo json_encode([
"status" => "ERR",
"message" => "Permission when moving file to $tgt_file"
]);
unlink($zip_file);
exit;
}
echo json_encode([
"status" => "OK",
"file_name" => "offline-{$mcuID}-data.zip",
"url" => "/one-api/tools/xdownload/file/$mcuID"
]);
unlink($zip_file);
}
}