Skip to content

Commit

Permalink
Merge pull request #9 from HimaJyun/database-converter
Browse files Browse the repository at this point in the history
(close #8) Add convert command.
  • Loading branch information
HimaJyun authored May 30, 2019
2 parents 5cd8d39 + 61f4f56 commit 65db662
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 5 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Economy base plugin for Bukkit/Spigot

## Features
* UUID Ready
* 1.13 Ready
* 1.13, 1.14 Ready
* Vault Ready
* MySQL(+SQLite) Ready
* Command tab complete
Expand All @@ -30,6 +30,7 @@ Economy base plugin for Bukkit/Spigot
|/money create <player> [balance]|jecon.create|Create <player> account.|OP|
|/money remove <player>|jecon.remove|Remove <player> account.|OP|
|/money top [page]|jecon.top|Show billionaires ranking.|OP|
|/money convert|jecon.convert|Convert database.|
|/money reload|jecon.reload|Reload the config.|OP|
|/money version|jecon.version|Show version and check new version.|OP|
|/money help|N/A|Show helps.|ALL|
Expand All @@ -48,7 +49,7 @@ Economy base plugin for Bukkit/Spigot
<dependency>
<groupId>jp.jyn</groupId>
<artifactId>Jecon</artifactId>
<version>2.0.2</version>
<version>2.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>jp.jyn</groupId>
<artifactId>Jecon</artifactId>
<version>2.0.2</version>
<version>2.1.0</version>
<url>https://github.com/HimaJyun/Jecon</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand Down Expand Up @@ -63,7 +63,7 @@
<dependency>
<groupId>jp.jyn</groupId>
<artifactId>JBukkitLib</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/jp/jyn/jecon/Jecon.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jp.jyn.jbukkitlib.command.SubExecutor;
import jp.jyn.jbukkitlib.uuid.UUIDRegistry;
import jp.jyn.jecon.command.Convert;
import jp.jyn.jecon.command.Create;
import jp.jyn.jecon.command.Give;
import jp.jyn.jecon.command.Help;
Expand Down Expand Up @@ -103,6 +104,7 @@ public void onEnable() {
.putCommand("create", new Create(main, message, registry, repository))
.putCommand("remove", new Remove(message, registry, repository))
.putCommand("top", new Top(message, registry, repository))
.putCommand("convert", new Convert(config, repository, db))
.putCommand("reload", new Reload(message))
.putCommand("version", new Version(message, checker));
Help help = new Help(message, builder.getSubCommands());
Expand Down
103 changes: 103 additions & 0 deletions src/main/java/jp/jyn/jecon/command/Convert.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package jp.jyn.jecon.command;

import jp.jyn.jbukkitlib.command.SubCommand;
import jp.jyn.jbukkitlib.config.YamlLoader;
import jp.jyn.jecon.Jecon;
import jp.jyn.jecon.config.ConfigLoader;
import jp.jyn.jecon.config.MainConfig;
import jp.jyn.jecon.db.Database;
import jp.jyn.jecon.repository.BalanceRepository;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;

import java.util.Optional;
import java.util.Queue;

public class Convert extends SubCommand {
private final ConfigLoader loader;
private final BalanceRepository repository;
private final Database oldDB;
private final MainConfig.DatabaseConfig old;

public Convert(ConfigLoader loader, BalanceRepository repository,Database oldDB) {
this.loader = loader;
this.repository = repository;
this.oldDB = oldDB;
this.old = loader.getMainConfig().database;
}

@Override
protected Result execCommand(CommandSender sender, Queue<String> args) {
// 割と強引
YamlLoader config = new YamlLoader(Jecon.getInstance(), "config.yml");
if (Optional.ofNullable(args.poll()).map(a -> a.equalsIgnoreCase("confirm")).orElse(false)) {
convert(sender, config);
} else {
confirm(sender, config);
}
return Result.OK;
}

private void confirm(CommandSender sender, YamlLoader config) {
ConfigurationSection db = config.getConfig().getConfigurationSection("database");

if (old.url.startsWith("jdbc:sqlite:")) {
sender.sendMessage("Convert from SQLite to MySQL");
sender.sendMessage("Convert to:");
sender.sendMessage("Host: " + db.getString("mysql.host"));
sender.sendMessage("Name: " + db.getString("mysql.name"));
sender.sendMessage("User: " + db.getString("mysql.username"));
sender.sendMessage("Pass: " + db.getString("mysql.password"));
} else if (old.url.startsWith("jdbc:mysql:")) {
sender.sendMessage("Convert from MySQL to SQLite");
sender.sendMessage("Convert to:");
sender.sendMessage("File: " + db.getString("sqlite.file"));
} else {
sender.sendMessage("Unsupported Database");
return;
}

sender.sendMessage("");
sender.sendMessage("All data in the destination database is deleted.");
sender.sendMessage("Please be sure to back up.");
sender.sendMessage("");
sender.sendMessage("If there is no problem, please execute '/money convert confirm'.");
sender.sendMessage("If you need to change the settings, edit config.yml.");
}

private void convert(CommandSender sender, YamlLoader config) {
if (old.url.startsWith("jdbc:sqlite:")) {
config.getConfig().set("database.type", "mysql");
} else if (old.url.startsWith("jdbc:mysql:")) {
config.getConfig().set("database.type", "sqlite");
} else {
sender.sendMessage("Unsupported Database");
return;
}
config.saveConfig();
sender.sendMessage("Config reloading.");
loader.reloadConfig();

sender.sendMessage("Connect to database.");
Database db = Database.connect(loader.getMainConfig().database);

sender.sendMessage("Saving unsaved data.");
repository.saveAll();

sender.sendMessage("Converting...");
db.convert(oldDB);
sender.sendMessage("Converted.");

sender.sendMessage("Reloading...");
Jecon jecon = Jecon.getInstance();
jecon.onDisable();
db.close();
jecon.onEnable();
sender.sendMessage("Successfully completed.");
}

@Override
protected String requirePermission() {
return "jecon.convert";
}
}
49 changes: 49 additions & 0 deletions src/main/java/jp/jyn/jecon/db/Database.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
Expand Down Expand Up @@ -237,4 +238,52 @@ public Map<Integer, Long> top(int limit, int offset) {
public boolean setCreate(int id, long balance) {
return this.setBalance(id, balance) || this.createAccount(id, balance);
}

public void convert(Database oldDB) {
try (Connection old = oldDB.hikari.getConnection();
Connection connection = hikari.getConnection()) {
try {
connection.setAutoCommit(false);
try (Statement statement = connection.createStatement()) {
statement.executeUpdate("DELETE FROM `account`");
statement.executeUpdate("DELETE FROM `balance`");
}

try (Statement statement = old.createStatement();
PreparedStatement prepare = connection.prepareStatement(
"INSERT INTO `account` VALUES (?,?)"
)) {
try (ResultSet rs = statement.executeQuery("SELECT `id`,`uuid` FROM `account`")) {
while (rs.next()) {
prepare.setInt(1, rs.getInt("id"));
prepare.setBytes(2, rs.getBytes("uuid"));
prepare.addBatch();
}
prepare.executeBatch();
}
}

try (Statement statement = old.createStatement();
PreparedStatement prepare = connection.prepareStatement(
"INSERT INTO `balance` VALUES(?,?)"
)) {
try (ResultSet rs = statement.executeQuery("SELECT `id`,`balance` FROM `balance`")) {
while (rs.next()) {
prepare.setInt(1, rs.getInt("id"));
prepare.setLong(2, rs.getLong("balance"));
prepare.addBatch();
}
prepare.executeBatch();
}
}
} catch (SQLException e) {
connection.rollback();
throw e;
} finally {
connection.setAutoCommit(true);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
6 changes: 5 additions & 1 deletion src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ author: "HimaJyun( https://jyn.jp/ )"
description: "Jecon is a simple economy plugin."
load: STARTUP
loadbefore: [Vault]
api-version: 1.13
api-version: "1.13"

commands:
jecon:
Expand All @@ -25,6 +25,7 @@ permissions:
jecon.create: true
jecon.remove: true
jecon.top: true
jecon.convert: true
jecon.reload: true
jecon.version: true
jecon.user:
Expand All @@ -40,6 +41,7 @@ permissions:
jecon.create: true
jecon.remove: true
jecon.top: true
jecon.convert: true
jecon.reload: true
jecon.version: true
jecon.show:
Expand All @@ -60,6 +62,8 @@ permissions:
default: op
jecon.top:
default: op
jecon.convert:
default: op
jecon.reload:
default: op
jecon.version:
Expand Down

0 comments on commit 65db662

Please sign in to comment.