/* * This program 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. * * This program 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.dbinstaller.util.mysql; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; 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.dbinstaller.DBOutputInterface; import com.l2jserver.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 { Connection con = _frame.getConnection(); Formatter form = new Formatter(); PreparedStatement stmt = con.prepareStatement("SHOW TABLES"); ResultSet rset = stmt.executeQuery(); 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); } } FileWriterStdout ps = new FileWriterStdout(dump); while (rset.next()) { _frame.setProgressValue(rset.getRow()); _frame.appendToProgressArea("Dumping Table "+rset.getString(1)); ps.println("CREATE TABLE `"+rset.getString(1)+"`"); ps.println("("); PreparedStatement desc = con.prepareStatement("DESC "+rset.getString(1)); ResultSet dset = desc.executeQuery(); Map> keys = new HashMap>(); boolean isFirst = true; while (dset.next()) { if (!isFirst) ps.println(","); ps.print("\t`"+dset.getString(1)+"`"); ps.print(" "+dset.getString(2)); if (dset.getString(3).equals("NO")) ps.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) ps.print(" DEFAULT '"+dset.getString(5)+"'"); if (!dset.getString(6).isEmpty()) ps.print(" "+dset.getString(6)); isFirst = false; } if (keys.containsKey("PRI")) { ps.println(","); ps.print("\tPRIMARY KEY ("); isFirst = true; for (String key : keys.get("PRI")) { if (!isFirst) ps.print(", "); ps.print("`"+key+"`"); isFirst = false; } ps.print(")"); } if (keys.containsKey("MUL")) { ps.println(","); isFirst = true; for (String key : keys.get("MUL")) { if (!isFirst) ps.println(", "); ps.print("\tKEY `key_"+key+"` (`"+key+"`)"); isFirst = false; } } ps.println(); ps.println(");"); ps.flush(); dset.close(); desc.close(); desc = con.prepareStatement("SELECT * FROM "+rset.getString(1)); dset = desc.executeQuery(); isFirst = true; int cnt = 0; while (dset.next()) { if ((cnt%100) == 0) ps.println("INSERT INTO `"+rset.getString(1)+"` VALUES "); else ps.println(","); ps.print("\t("); boolean isInFirst = true; for (int i = 1; i <= dset.getMetaData().getColumnCount(); i++) { if (!isInFirst) ps.print(", "); if (dset.getString(i) == null) ps.print("NULL"); else ps.print("'"+dset.getString(i).replace("\'", "\\\'")+"'"); isInFirst = false; } ps.print(")"); isFirst = false; if ((cnt%100) == 99) ps.println(";"); cnt++; } if (!isFirst && (cnt%100) != 0) ps.println(";"); ps.println(); ps.flush(); dset.close(); desc.close(); } rset.close(); stmt.close(); ps.flush(); ps.close(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } _frame.appendToProgressArea("Dump Complete!"); } }