DBDumper.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. * Copyright (C) 2004-2015 L2J Server
  3. *
  4. * This file is part of L2J Server.
  5. *
  6. * L2J Server is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J Server is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package com.l2jserver.tools.dbinstaller.util.mysql;
  20. import java.io.File;
  21. import java.io.FileWriter;
  22. import java.sql.Connection;
  23. import java.sql.ResultSet;
  24. import java.sql.Statement;
  25. import java.util.ArrayList;
  26. import java.util.Formatter;
  27. import java.util.GregorianCalendar;
  28. import java.util.HashMap;
  29. import java.util.List;
  30. import java.util.Map;
  31. import com.l2jserver.tools.dbinstaller.DBOutputInterface;
  32. import com.l2jserver.tools.dbinstaller.util.FileWriterStdout;
  33. /**
  34. * @author mrTJO
  35. */
  36. public class DBDumper
  37. {
  38. DBOutputInterface _frame;
  39. String _db;
  40. public DBDumper(DBOutputInterface frame, String db)
  41. {
  42. _frame = frame;
  43. _db = db;
  44. createDump();
  45. }
  46. public void createDump()
  47. {
  48. try (Formatter form = new Formatter())
  49. {
  50. Connection con = _frame.getConnection();
  51. try (Statement s = con.createStatement();
  52. ResultSet rset = s.executeQuery("SHOW TABLES"))
  53. {
  54. 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());
  55. new File("dumps").mkdir();
  56. dump.createNewFile();
  57. _frame.appendToProgressArea("Writing dump " + dump.getName());
  58. if (rset.last())
  59. {
  60. int rows = rset.getRow();
  61. rset.beforeFirst();
  62. if (rows > 0)
  63. {
  64. _frame.setProgressIndeterminate(false);
  65. _frame.setProgressMaximum(rows);
  66. }
  67. }
  68. try (FileWriter fileWriter = new FileWriter(dump);
  69. FileWriterStdout fws = new FileWriterStdout(fileWriter))
  70. {
  71. while (rset.next())
  72. {
  73. _frame.setProgressValue(rset.getRow());
  74. _frame.appendToProgressArea("Dumping Table " + rset.getString(1));
  75. fws.println("CREATE TABLE `" + rset.getString(1) + "`");
  76. fws.println("(");
  77. try (Statement desc = con.createStatement();
  78. ResultSet dset = desc.executeQuery("DESC " + rset.getString(1)))
  79. {
  80. Map<String, List<String>> keys = new HashMap<>();
  81. boolean isFirst = true;
  82. while (dset.next())
  83. {
  84. if (!isFirst)
  85. {
  86. fws.println(",");
  87. }
  88. fws.print("\t`" + dset.getString(1) + "`");
  89. fws.print(" " + dset.getString(2));
  90. if (dset.getString(3).equals("NO"))
  91. {
  92. fws.print(" NOT NULL");
  93. }
  94. if (!dset.getString(4).isEmpty())
  95. {
  96. if (!keys.containsKey(dset.getString(4)))
  97. {
  98. keys.put(dset.getString(4), new ArrayList<String>());
  99. }
  100. keys.get(dset.getString(4)).add(dset.getString(1));
  101. }
  102. if (dset.getString(5) != null)
  103. {
  104. fws.print(" DEFAULT '" + dset.getString(5) + "'");
  105. }
  106. if (!dset.getString(6).isEmpty())
  107. {
  108. fws.print(" " + dset.getString(6));
  109. }
  110. isFirst = false;
  111. }
  112. if (keys.containsKey("PRI"))
  113. {
  114. fws.println(",");
  115. fws.print("\tPRIMARY KEY (");
  116. isFirst = true;
  117. for (String key : keys.get("PRI"))
  118. {
  119. if (!isFirst)
  120. {
  121. fws.print(", ");
  122. }
  123. fws.print("`" + key + "`");
  124. isFirst = false;
  125. }
  126. fws.print(")");
  127. }
  128. if (keys.containsKey("MUL"))
  129. {
  130. fws.println(",");
  131. isFirst = true;
  132. for (String key : keys.get("MUL"))
  133. {
  134. if (!isFirst)
  135. {
  136. fws.println(", ");
  137. }
  138. fws.print("\tKEY `key_" + key + "` (`" + key + "`)");
  139. isFirst = false;
  140. }
  141. }
  142. fws.println();
  143. fws.println(");");
  144. fws.flush();
  145. }
  146. try (Statement desc = con.createStatement();
  147. ResultSet dset = desc.executeQuery("SELECT * FROM " + rset.getString(1)))
  148. {
  149. boolean isFirst = true;
  150. int cnt = 0;
  151. while (dset.next())
  152. {
  153. if ((cnt % 100) == 0)
  154. {
  155. fws.println("INSERT INTO `" + rset.getString(1) + "` VALUES ");
  156. }
  157. else
  158. {
  159. fws.println(",");
  160. }
  161. fws.print("\t(");
  162. boolean isInFirst = true;
  163. for (int i = 1; i <= dset.getMetaData().getColumnCount(); i++)
  164. {
  165. if (!isInFirst)
  166. {
  167. fws.print(", ");
  168. }
  169. if (dset.getString(i) == null)
  170. {
  171. fws.print("NULL");
  172. }
  173. else
  174. {
  175. fws.print("'" + dset.getString(i).replace("\'", "\\\'") + "'");
  176. }
  177. isInFirst = false;
  178. }
  179. fws.print(")");
  180. isFirst = false;
  181. if ((cnt % 100) == 99)
  182. {
  183. fws.println(";");
  184. }
  185. cnt++;
  186. }
  187. if (!isFirst && ((cnt % 100) != 0))
  188. {
  189. fws.println(";");
  190. }
  191. fws.println();
  192. fws.flush();
  193. }
  194. }
  195. fws.flush();
  196. }
  197. }
  198. }
  199. catch (Exception e)
  200. {
  201. e.printStackTrace();
  202. }
  203. _frame.appendToProgressArea("Dump Complete!");
  204. }
  205. }