1
+ package dev .ithundxr .railwaystweaks .database ;
2
+
3
+ import com .mysql .cj .jdbc .MysqlConnectionPoolDataSource ;
4
+ import dev .ithundxr .railwaystweaks .RailwaysTweaks ;
5
+ import net .fabricmc .loader .api .FabricLoader ;
6
+
7
+ import java .io .FileWriter ;
8
+ import java .io .IOException ;
9
+ import java .nio .file .Paths ;
10
+ import java .sql .Connection ;
11
+ import java .sql .DatabaseMetaData ;
12
+ import java .sql .ResultSet ;
13
+ import java .sql .ResultSetMetaData ;
14
+ import java .sql .SQLException ;
15
+ import java .sql .Statement ;
16
+
17
+ public class DumpDatabase {
18
+ public static void dump () {
19
+ try {
20
+ Class .forName ("com.mysql.cj.jdbc.Driver" );
21
+
22
+ String address = getProperty ("address" );
23
+ String database = getProperty ("database" );
24
+ String username = getProperty ("username" );
25
+ String password = getProperty ("password" );
26
+
27
+ MysqlConnectionPoolDataSource source = new MysqlConnectionPoolDataSource ();
28
+ source .setUrl ("jdbc:mysql://" + address + "/" + database );
29
+ source .setUser (username );
30
+ source .setPassword (password );
31
+ source .setDatabaseName (database );
32
+
33
+ try (Connection conn = source .getConnection ();
34
+ Statement stat = conn .createStatement ();
35
+ FileWriter writer = new FileWriter (Paths .get (FabricLoader .getInstance ().getGameDir ().toString (), "export.sql" ).toString ())) {
36
+ DatabaseMetaData metaData = conn .getMetaData ();
37
+ ResultSet tables = metaData .getTables (null , null , "%" , new String []{"TABLE" });
38
+
39
+ while (tables .next ()) {
40
+ String tableName = tables .getString ("TABLE_NAME" );
41
+ System .out .println ("Exporting table: " + tableName );
42
+
43
+ String createTableQuery = getCreateTableQuery (conn , tableName );
44
+ writer .write (createTableQuery + ";\n \n " );
45
+
46
+ exportTableData (conn , tableName , writer );
47
+ writer .write ("\n \n " );
48
+ }
49
+ }
50
+ } catch (Exception e ) {
51
+ RailwaysTweaks .LOGGER .error ("Error occurred while dumping DB" , e );
52
+ }
53
+ }
54
+
55
+ private static String getCreateTableQuery (Connection connection , String tableName ) throws SQLException {
56
+ Statement stmt = connection .createStatement ();
57
+ ResultSet rs = stmt .executeQuery ("SHOW CREATE TABLE " + tableName );
58
+ rs .next ();
59
+ String createTable = rs .getString (2 ); // The second column contains the CREATE TABLE statement.
60
+ rs .close ();
61
+ stmt .close ();
62
+ return createTable ;
63
+ }
64
+
65
+ private static void exportTableData (Connection connection , String tableName , FileWriter writer ) throws SQLException , IOException {
66
+ Statement stmt = connection .createStatement ();
67
+ ResultSet rs = stmt .executeQuery ("SELECT * FROM " + tableName );
68
+ ResultSetMetaData rsMetaData = rs .getMetaData ();
69
+ int columnCount = rsMetaData .getColumnCount ();
70
+
71
+ while (rs .next ()) {
72
+ StringBuilder row = new StringBuilder ("INSERT INTO " + tableName + " VALUES (" );
73
+ for (int i = 1 ; i <= columnCount ; i ++) {
74
+ String value = rs .getString (i );
75
+ if (value == null ) {
76
+ row .append ("NULL" );
77
+ } else {
78
+ row .append ("'" ).append (value .replace ("'" , "''" )).append ("'" );
79
+ }
80
+ if (i < columnCount ) row .append (", " );
81
+ }
82
+ row .append (");\n " );
83
+ writer .write (row .toString ());
84
+ }
85
+
86
+ rs .close ();
87
+ stmt .close ();
88
+ }
89
+
90
+ private static String getProperty (String name ) {
91
+ return System .getProperty ("railwayTweaks.database." + name );
92
+ }
93
+ }
0 commit comments