package regalowl.hyperconomy;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.scheduler.BukkitTask;
import regalowl.databukkit.DataBukkit;
import regalowl.databukkit.QueryResult;
import regalowl.databukkit.SQLRead;
import regalowl.databukkit.SQLWrite;
public class Copydatabase {
private HyperConomy hc;
private BukkitTask waitTask;
private CommandSender sender;
private String mysqlMessage;
private String sqliteMessage;
private LanguageFile L;
private boolean includeHistory;
private SQLWrite sw;
Copydatabase(CommandSender csender, String args[]) {
hc = HyperConomy.hc;
sender = csender;
L = hc.getLanguageFile();
includeHistory = false;
boolean useMySQL = hc.gYH().gQFC("config").gB("sql-connection.use-mysql");
try {
mysqlMessage = L.get("COPYDATABASE_MYSQL");
sqliteMessage = L.get("COPYDATABASE_SQLITE");
if (args.length == 0) {
if (useMySQL) {
sender.sendMessage(L.get("COPYDATABASE_MYSQL_WARNING"));
} else {
sender.sendMessage(L.get("COPYDATABASE_SQLITE_WARNING"));
}
} else if (args.length >= 1 && args[0].equalsIgnoreCase("confirm")) {
if (args.length == 2 && args[1].equalsIgnoreCase("history")) {
includeHistory = true;
}
if (hc.getSQLWrite().getBufferSize() != 0) {
sender.sendMessage(L.get("WAIT_FOR_QUEUE"));
return;
}
DataBukkit db2 = new DataBukkit(hc);
if (!useMySQL) {
FileConfiguration config = hc.gYH().gFC("config");
String username = config.getString("config.sql-connection.username");
String password = config.getString("config.sql-connection.password");
int port = config.getInt("config.sql-connection.port");
String host = config.getString("config.sql-connection.host");
String database = config.getString("config.sql-connection.database");
db2.enableMySQL(host, database, username, password, port);
}
db2.createDatabase();
if (!useMySQL) {
if (!db2.useMySQL()) {
sender.sendMessage(L.get("COPYDATABASE_CONNECTION_FAILED_MYSQL"));
return;
}
}
sw = db2.getSQLWrite();
hc.getServer().getScheduler().runTaskAsynchronously(hc, new Runnable() {
public void run() {
EconomyManager em = hc.getEconomyManager();
SQLRead sr = hc.getSQLRead();
hc.getHyperLock().setLoadLock(true);
em.createTables(sw);
sw.addToQueue("DELETE FROM hyperconomy_objects");
sw.addToQueue("DELETE FROM hyperconomy_players");
sw.addToQueue("DELETE FROM hyperconomy_audit_log");
sw.addToQueue("DELETE FROM hyperconomy_history");
sw.addToQueue("DELETE FROM hyperconomy_log");
sw.addToQueue("DELETE FROM hyperconomy_settings");
sw.addToQueue("DELETE FROM hyperconomy_shop_objects");
for (HyperObject ho : em.getHyperObjects()) {
if (ho instanceof HyperItem) {
HyperItem hi = (HyperItem)ho;
sw.addToQueue("INSERT INTO hyperconomy_objects (NAME, ECONOMY, DISPLAY_NAME, ALIASES, TYPE, MATERIAL, DATA, DURABILITY, VALUE, STATIC, STATICPRICE, STOCK, MEDIAN, INITIATION, STARTPRICE, CEILING, FLOOR, MAXSTOCK)" + " VALUES ('" + ho.getName() + "','" + ho.getEconomy() + "','" + ho.getDisplayName() + "','" + ho.getAliasesString() + "','" + ho.getType() + "','" + hi.getMaterial() + "','" + hi.getData() + "','" + hi.getDurability() + "','" + ho.getValue() + "','" + ho.getIsstatic() + "','"
+ ho.getStaticprice() + "','" + ho.getStock() + "','" + ho.getMedian() + "','" + ho.getInitiation() + "','" + ho.getStartprice() + "','" + ho.getCeiling() + "','" + ho.getFloor() + "','" + ho.getMaxstock() + "')");
} else if (ho instanceof HyperEnchant) {
HyperEnchant he = (HyperEnchant)ho;
sw.addToQueue("INSERT INTO hyperconomy_objects (NAME, ECONOMY, DISPLAY_NAME, ALIASES, TYPE, MATERIAL, DATA, DURABILITY, VALUE, STATIC, STATICPRICE, STOCK, MEDIAN, INITIATION, STARTPRICE, CEILING, FLOOR, MAXSTOCK)" + " VALUES ('" + ho.getName() + "','" + ho.getEconomy() + "','" + ho.getDisplayName() + "','" + ho.getAliasesString() + "','" + ho.getType() + "','" + he.getEnchantmentName() + "','-1','-1','" + ho.getValue() + "','" + ho.getIsstatic() + "','"
+ ho.getStaticprice() + "','" + ho.getStock() + "','" + ho.getMedian() + "','" + ho.getInitiation() + "','" + ho.getStartprice() + "','" + ho.getCeiling() + "','" + ho.getFloor() + "','" + ho.getMaxstock() + "')");
} else if (ho instanceof BasicObject) {
sw.addToQueue("INSERT INTO hyperconomy_objects (NAME, ECONOMY, DISPLAY_NAME, ALIASES, TYPE, MATERIAL, DATA, DURABILITY, VALUE, STATIC, STATICPRICE, STOCK, MEDIAN, INITIATION, STARTPRICE, CEILING, FLOOR, MAXSTOCK)" + " VALUES ('" + ho.getName() + "','" + ho.getEconomy() + "','" + ho.getDisplayName() + "','" + ho.getAliasesString() + "','" + ho.getType() + "','none','-1','-1','" + ho.getValue() + "','" + ho.getIsstatic() + "','"
+ ho.getStaticprice() + "','" + ho.getStock() + "','" + ho.getMedian() + "','" + ho.getInitiation() + "','" + ho.getStartprice() + "','" + ho.getCeiling() + "','" + ho.getFloor() + "','" + ho.getMaxstock() + "')");
}
}
for (HyperPlayer hp : em.getHyperPlayers()) {
sw.addToQueue("INSERT INTO hyperconomy_players (PLAYER, ECONOMY, BALANCE, X, Y, Z, WORLD, HASH)" + " VALUES ('" + hp.getName() + "','" + hp.getEconomy() + "','" + hp.getBalance() + "','" + hp.getX() + "','" + hp.getY() + "','" + hp.getZ() + "','" + hp.getWorld() + "','" + hp.getHash() + "')");
}
QueryResult result = sr.aSyncSelect("SELECT * FROM hyperconomy_audit_log");
while (result.next()) {
sw.addToQueue("INSERT INTO hyperconomy_audit_log (TIME, ACCOUNT, ACTION, AMOUNT, ECONOMY) VALUES ('" + result.getString("TIME") + "','" + result.getString("ACCOUNT") + "','" + result.getString("ACTION") + "','" + result.getDouble("AMOUNT") + "','" + result.getString("ECONOMY") + "')");
}
result.close();
result = sr.aSyncSelect("SELECT * FROM hyperconomy_log");
while (result.next()) {
sw.addToQueue("INSERT INTO hyperconomy_log (TIME, CUSTOMER, ACTION, OBJECT, AMOUNT, MONEY, TAX, STORE, TYPE) VALUES ('" + result.getString("TIME") + "','" + result.getString("CUSTOMER") + "','" + result.getString("ACTION") + "','" + result.getString("OBJECT") + "','" + result.getDouble("AMOUNT") + "','" + result.getDouble("MONEY") + "','" + result.getDouble("TAX") + "','" + result.getString("STORE") + "','" + result.getString("TYPE") + "')");
}
result.close();
result = sr.aSyncSelect("SELECT * FROM hyperconomy_settings");
while (result.next()) {
sw.addToQueue("INSERT INTO hyperconomy_settings (SETTING, VALUE, TIME)" + " VALUES ('" + result.getString("SETTING") + "','" + result.getString("VALUE") + "','" + result.getString("TIME") + "')");
}
result.close();
result = sr.aSyncSelect("SELECT * FROM hyperconomy_shop_objects");
while (result.next()) {
sw.addToQueue("INSERT INTO hyperconomy_shop_objects (SHOP, HYPEROBJECT, QUANTITY, PRICE, STATUS) VALUES ('"+result.getString("SHOP")+"', '"+result.getString("HYPEROBJECT")+"', '"+result.getDouble("QUANTITY")+"', '"+result.getDouble("PRICE")+"', '"+result.getString("STATUS")+"')");
}
result.close();
if (includeHistory) {
result = sr.aSyncSelect("SELECT * FROM hyperconomy_history");
while (result.next()) {
sw.addToQueue("INSERT INTO hyperconomy_history (OBJECT, ECONOMY, TIME, PRICE)" + " VALUES ('" + result.getString("OBJECT") + "','" + result.getString("ECONOMY") + "','" + result.getString("TIME") + "','" + result.getDouble("PRICE") + "')");
}
result.close();
}
waitForFinish();
hc.getServer().getScheduler().runTask(hc, new Runnable() {
public void run() {
sender.sendMessage(L.get("COPYDATABASE_STARTED"));
}
});
}
});
} else {
sender.sendMessage(L.get("COPYDATABASE_INVALID"));
}
return;
} catch (Exception e) {
sender.sendMessage(L.get("COPYDATABASE_INVALID"));
hc.getHyperLock().setLoadLock(false);
return;
}
}
private void waitForFinish() {
waitTask = hc.getServer().getScheduler().runTaskTimerAsynchronously(hc, new Runnable() {
public void run() {
hc.getServer().getScheduler().runTask(hc, new Runnable() {
public void run() {
if (sw != null) {
sender.sendMessage(sw.getBufferSize() + " statements remaining.");
}
}
});
if (sw == null || !sw.writeActive()) {
hc.getHyperLock().setLoadLock(false);
hc.getServer().getScheduler().runTask(hc, new Runnable() {
public void run() {
if (hc.gYH().gQFC("config").gB("sql-connection.use-mysql")) {
sender.sendMessage(mysqlMessage);
} else {
sender.sendMessage(sqliteMessage);
}
}
});
waitTask.cancel();
}
}
}, 40L, 40L);
}
}