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); } } }