133 lines
4.0 KiB
PHP
133 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\File;
|
|
use Illuminate\Support\Facades\Response;
|
|
use ZipArchive;
|
|
|
|
class JsonTransferController extends Controller
|
|
{
|
|
protected $exportPath = 'database/seeders/data/';
|
|
|
|
public function index()
|
|
{
|
|
//POSTGRESS
|
|
$tables = DB::select("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
|
|
$tableNames = array_map(fn($t) => $t->tablename, $tables);
|
|
//MYSQL
|
|
//$tables = DB::select('SHOW TABLES');
|
|
//$tableNames = array_map('current', $tables);
|
|
$tableInfo = [];
|
|
|
|
foreach ($tableNames as $table) {
|
|
$filePath = base_path($this->exportPath . $table . '.json');
|
|
$fileSize = file_exists($filePath) ? filesize($filePath) : null;
|
|
|
|
$tableInfo[] = [
|
|
'name' => $table,
|
|
'size' => $fileSize,
|
|
];
|
|
}
|
|
return view('backup', compact('tableInfo'));
|
|
}
|
|
|
|
public function generate()
|
|
{
|
|
$exportPath = base_path($this->exportPath);
|
|
if (!is_dir($exportPath)) {
|
|
mkdir($exportPath, 0777, true);
|
|
}
|
|
|
|
$tables = DB::select("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
|
|
$tableNames = array_map(fn($t) => $t->tablename, $tables);
|
|
|
|
foreach ($tableNames as $table) {
|
|
try {
|
|
$filePath = $exportPath . $table . '.json';
|
|
$handle = fopen($filePath, 'w');
|
|
|
|
fwrite($handle, "[\n");
|
|
|
|
$first = true;
|
|
|
|
foreach (DB::table($table)->cursor() as $row) {
|
|
$jsonRow = json_encode($row, JSON_UNESCAPED_UNICODE);
|
|
|
|
if (!$first) {
|
|
fwrite($handle, ",\n");
|
|
} else {
|
|
$first = false;
|
|
}
|
|
|
|
fwrite($handle, $jsonRow);
|
|
}
|
|
|
|
fwrite($handle, "\n]");
|
|
fclose($handle);
|
|
} catch (\Exception $e) {
|
|
\Log::warning("Gagal ekspor tabel $table: " . $e->getMessage());
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return redirect()->back()->with('success', 'Semua tabel berhasil diekspor tanpa kehabisan memori.');
|
|
}
|
|
|
|
|
|
public function downloadTable($table)
|
|
{
|
|
$file = base_path($this->exportPath . $table . '.json');
|
|
|
|
if (!file_exists($file)) {
|
|
return abort(404, 'File tidak ditemukan.');
|
|
}
|
|
|
|
return response()->download($file);
|
|
}
|
|
|
|
public function downloadAll()
|
|
{
|
|
$zipFile = base_path('database/seeders/data/all_json.zip');
|
|
$zip = new ZipArchive;
|
|
|
|
File::delete($zipFile);
|
|
|
|
if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
|
|
foreach (File::files(base_path($this->exportPath)) as $file) {
|
|
$zip->addFile($file->getRealPath(), basename($file));
|
|
}
|
|
$zip->close();
|
|
}
|
|
|
|
return response()->download($zipFile);
|
|
}
|
|
public function importTable($table)
|
|
{
|
|
$path = base_path($this->exportPath . $table . '.json');
|
|
if (!file_exists($path)) {
|
|
return redirect()->back()->with('error', "File JSON untuk tabel $table tidak ditemukan.");
|
|
}
|
|
$json = file_get_contents($path);
|
|
$data = json_decode($json, true);
|
|
if (!is_array($data)) {
|
|
return redirect()->back()->with('error', "File JSON untuk tabel $table tidak valid.");
|
|
}
|
|
try {
|
|
DB::beginTransaction();
|
|
DB::table($table)->truncate();
|
|
$chunks = array_chunk($data, 200);
|
|
foreach ($chunks as $chunk) {
|
|
DB::table($table)->insert($chunk);
|
|
}
|
|
DB::commit();
|
|
return redirect()->back()->with('success', "Data untuk tabel $table berhasil di-import.");
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
return redirect()->back()->with('error', "Gagal import tabel $table: " . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
}
|