Skip to content

Commit e836251

Browse files
committed
Add util to dump db
1 parent eb4c739 commit e836251

File tree

4 files changed

+108
-1
lines changed

4 files changed

+108
-1
lines changed

Diff for: build.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ dependencies {
6969
}
7070

7171
modCompileOnly("maven.modrinth:enchancement:1.20-26")
72+
73+
implementation(include("com.mysql:mysql-connector-j:8.0.31")!!)
7274
}
7375

7476
tasks.processResources {

Diff for: gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
org.gradle.jvmargs=-Xmx2G
33

44
# Mod Properties
5-
mod_version = 0.0.40
5+
mod_version = 0.0.41
66
maven_group = dev.ithundxr
77
archives_base_name = RailwaysTweaks
88

Diff for: src/main/java/dev/ithundxr/railwaystweaks/commands/RailwaysTweaksCommands.java

+12
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import com.simibubi.create.Create;
55
import com.simibubi.create.content.trains.entity.CarriageContraptionEntity;
66
import dev.ithundxr.railwaystweaks.RailwaysTweaks;
7+
import dev.ithundxr.railwaystweaks.database.DumpDatabase;
78
import dev.ithundxr.railwaystweaks.mixin.compat.tconstruct.SimpleChannelAccessor;
89
import me.pepperbell.simplenetworking.C2SPacket;
910
import me.pepperbell.simplenetworking.S2CPacket;
1011
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
12+
import net.minecraft.Util;
1113
import net.minecraft.commands.CommandSourceStack;
1214
import net.minecraft.network.chat.Component;
1315
import slimeknights.tconstruct.common.network.TinkerNetwork;
@@ -36,6 +38,16 @@ public static void init() {
3638
.requires(cs -> cs.hasPermission(2))
3739
.executes(ctx -> avgMSPT(ctx.getSource())));
3840
});
41+
42+
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
43+
dispatcher.register(literal("railwaystweaks")
44+
.then(literal("dump_db")
45+
.requires(cs -> cs.hasPermission(4))
46+
.executes(ctx -> {
47+
Util.ioPool().execute(DumpDatabase::dump);
48+
return 0;
49+
})));
50+
});
3951
}
4052

4153
private static ArgumentBuilder<CommandSourceStack, ?> $dump_hephaestus_packets() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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

Comments
 (0)