/*
* Copyright (C) 2004-2015 L2J Server
*
* This file is part of L2J Server.
*
* L2J Server is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* L2J Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package com.l2jserver.tools.dbinstaller.util.mysql;
import java.io.File;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.l2jserver.tools.dbinstaller.DBOutputInterface;
import com.l2jserver.tools.dbinstaller.util.FileWriterStdout;
/**
* @author mrTJO
*/
public class DBDumper
{
DBOutputInterface _frame;
String _db;
public DBDumper(DBOutputInterface frame, String db)
{
_frame = frame;
_db = db;
createDump();
}
public void createDump()
{
try (Formatter form = new Formatter())
{
Connection con = _frame.getConnection();
try (Statement s = con.createStatement();
ResultSet rset = s.executeQuery("SHOW TABLES"))
{
File dump = new File("dumps", form.format("%1$s_dump_%2$tY%2$tm%2$td-%2$tH%2$tM%2$tS.sql", _db, new GregorianCalendar().getTime()).toString());
new File("dumps").mkdir();
dump.createNewFile();
_frame.appendToProgressArea("Writing dump " + dump.getName());
if (rset.last())
{
int rows = rset.getRow();
rset.beforeFirst();
if (rows > 0)
{
_frame.setProgressIndeterminate(false);
_frame.setProgressMaximum(rows);
}
}
try (FileWriter fileWriter = new FileWriter(dump);
FileWriterStdout fws = new FileWriterStdout(fileWriter))
{
while (rset.next())
{
_frame.setProgressValue(rset.getRow());
_frame.appendToProgressArea("Dumping Table " + rset.getString(1));
fws.println("CREATE TABLE `" + rset.getString(1) + "`");
fws.println("(");
try (Statement desc = con.createStatement();
ResultSet dset = desc.executeQuery("DESC " + rset.getString(1)))
{
Map> keys = new HashMap<>();
boolean isFirst = true;
while (dset.next())
{
if (!isFirst)
{
fws.println(",");
}
fws.print("\t`" + dset.getString(1) + "`");
fws.print(" " + dset.getString(2));
if (dset.getString(3).equals("NO"))
{
fws.print(" NOT NULL");
}
if (!dset.getString(4).isEmpty())
{
if (!keys.containsKey(dset.getString(4)))
{
keys.put(dset.getString(4), new ArrayList());
}
keys.get(dset.getString(4)).add(dset.getString(1));
}
if (dset.getString(5) != null)
{
fws.print(" DEFAULT '" + dset.getString(5) + "'");
}
if (!dset.getString(6).isEmpty())
{
fws.print(" " + dset.getString(6));
}
isFirst = false;
}
if (keys.containsKey("PRI"))
{
fws.println(",");
fws.print("\tPRIMARY KEY (");
isFirst = true;
for (String key : keys.get("PRI"))
{
if (!isFirst)
{
fws.print(", ");
}
fws.print("`" + key + "`");
isFirst = false;
}
fws.print(")");
}
if (keys.containsKey("MUL"))
{
fws.println(",");
isFirst = true;
for (String key : keys.get("MUL"))
{
if (!isFirst)
{
fws.println(", ");
}
fws.print("\tKEY `key_" + key + "` (`" + key + "`)");
isFirst = false;
}
}
fws.println();
fws.println(");");
fws.flush();
}
try (Statement desc = con.createStatement();
ResultSet dset = desc.executeQuery("SELECT * FROM " + rset.getString(1)))
{
boolean isFirst = true;
int cnt = 0;
while (dset.next())
{
if ((cnt % 100) == 0)
{
fws.println("INSERT INTO `" + rset.getString(1) + "` VALUES ");
}
else
{
fws.println(",");
}
fws.print("\t(");
boolean isInFirst = true;
for (int i = 1; i <= dset.getMetaData().getColumnCount(); i++)
{
if (!isInFirst)
{
fws.print(", ");
}
if (dset.getString(i) == null)
{
fws.print("NULL");
}
else
{
fws.print("'" + dset.getString(i).replace("\'", "\\\'") + "'");
}
isInFirst = false;
}
fws.print(")");
isFirst = false;
if ((cnt % 100) == 99)
{
fws.println(";");
}
cnt++;
}
if (!isFirst && ((cnt % 100) != 0))
{
fws.println(";");
}
fws.println();
fws.flush();
}
}
fws.flush();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
_frame.appendToProgressArea("Dump Complete!");
}
}