package com.nicewuerfel.blockown.importer;
import com.nicewuerfel.blockown.OwningState;
import com.nicewuerfel.blockown.Setting;
import com.nicewuerfel.blockown.database.Database;
import com.nicewuerfel.blockown.database.DatabaseAction;
import com.nicewuerfel.blockown.database.MySqlDatabase;
import java.io.File;
import java.sql.SQLException;
import java.util.Iterator;
public class MySql extends Importer {
private Integer threadCount;
public MySql(Setting settings, Database db, File pluginsFolder, Runnable runnable) {
super(settings, db, pluginsFolder, runnable);
}
@Override
public void run() {
final Database db = getDatabase();
if (db instanceof MySqlDatabase) {
throw new ImporterException("Can't import from running database");
}
String host = getSettings().DATABASE.MYSQL.HOST;
int port = getSettings().DATABASE.MYSQL.PORT;
String databaseName = getSettings().DATABASE.MYSQL.DATABASE;
String userName = getSettings().DATABASE.MYSQL.USER;
String password = getSettings().DATABASE.MYSQL.PASSWORD;
try {
MySqlDatabase source = new MySqlDatabase.Builder(getOutput()).host(host).port(port)
.database(databaseName).user(userName).password(password).build();
final Iterator<OwningState> it = source.getOwnings();
final Object LOCK = new Object();
threadCount = Runtime.getRuntime().availableProcessors();
Thread[] threads = new Thread[threadCount];
for (int i = 0; i < threadCount; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
OwningState owning;
while ((owning = it.next()) != null) {
if (!db.getOwner(owning.getOwnable()).isPresent() && owning.getUser().isPresent()) {
db.enqueue(
DatabaseAction.newOwnInstance(owning.getOwnable(), owning.getUser().get()));
}
}
synchronized (LOCK) {
if (--threadCount == 0) {
finished();
}
}
}
}, "MySql import thread #" + (i + 1));
threads[i].start();
}
} catch (ClassNotFoundException | SQLException e) {
getOutput().printException(e);
}
}
}