Added functional database concurrency

Created a ThreadManager class
Added concurrency for only some methods
This commit is contained in:
Anthony committed 2018-03-28 21:26:26 -04:00
1 parent 9c820676d4
commit 2c74327ec3
7 files changed
+86 -130

No files matched your search

@@ -0,0 +1,37 @@
package netneutrality;
/*
* Copyright (c) anthorob
*
* This file is closed-source. It should not be distributed or copied in any way or form
*/
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadManager {
public static final ExecutorService executor = Executors.newSingleThreadExecutor();
// public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public static void shutdownExecutor() {
try {
System.out.println("attempt to shutdown executor");
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
}
catch (InterruptedException e) {
System.err.println("tasks interrupted");
}
finally {
if (!executor.isTerminated()) {
System.err.println("cancel non-finished tasks");
}
executor.shutdownNow();
System.out.println("shutdown finished");
}
}
}
@@ -61,18 +61,25 @@ public class BlacklistCommand extends AbstractCommand {
case "get":
event.getTextChannel().sendMessage("Retreiving list, please wait...").queue(t -> {
String out = "";
ArrayList<MBlacklist> blacklist = new ArrayList<>();
try {
blacklist = ((DBBlacklist) DBController.get("blacklist")).getBlacklistFromServer(event.getGuild().getId());
for (MBlacklist bl : blacklist) {
out += bl.getWord() + " -> " + (bl.isEnabled() ? "enabled" : "disabled") + "\n";
StringBuilder sb = new StringBuilder();
((DBBlacklist) DBController.get("blacklist")).getBlacklistFromServer(event.getGuild().getId(), new Consumer<ArrayList<MBlacklist>>() {
@Override
public void accept(ArrayList<MBlacklist> mBlacklists) {
for (MBlacklist bl : mBlacklists) {
sb.append(bl.getWord() + " -> " + (bl.isEnabled() ? "enabled" : "disabled") + "\n");
}
t.editMessage("List of blacklisted words for this server [" + event.getGuild().getName() + "] :\n" + (mBlacklists.isEmpty() ? "No word found" : sb.toString())).queue();
}
});
} catch (RuntimeException e) {
e.printStackTrace();
}
t.editMessage("List of blacklisted words for this server [" + event.getGuild().getName() + "] :\n" + (blacklist.isEmpty() ? "No word found" : out)).queue();
});
@@ -1,13 +1,8 @@
package netneutrality.db;
import netneutrality.MusicBot;
import java.sql.SQLException;
public abstract class AbstractController {
protected MysqlDatabase database;
private boolean isDoingSomething = false;
/**
* The controller name to be used in {@link DBController} get(String controller) method
@@ -16,30 +11,6 @@ public abstract class AbstractController {
*/
public abstract String getControllerName();
public boolean isDoingSomething() {
return isDoingSomething;
}
public AbstractController start() {
DBController.isDoingSomething = true;
isDoingSomething = true;
return this;
}
protected AbstractController end() {
DBController.isDoingSomething = false;
isDoingSomething = false;
return this;
}
public void reconnect() {
database.reconnect();
}
public boolean isClosed() throws SQLException {
return database.isClosed();
}
protected void setDatabase(MysqlDatabase database) {
this.database = database;
}
@@ -14,9 +14,10 @@ public class DBController {
/**
* A map that contains all the controllers currently loaded
*/
private static HashMap<String, AbstractController> controllers = new HashMap<>();
private final static HashMap<String, AbstractController> controllers = new HashMap<>();
private static MysqlDatabase database = new MysqlDatabase("discord");
protected static boolean isDoingSomething = false;
/**
* @param controller The name of the controller as defined in the {@link AbstractController#getControllerName()}'s method
@@ -24,33 +25,19 @@ public class DBController {
*/
public static AbstractController get(String controller) {
if (controllers.isEmpty())
init();
if (controllers.containsKey(controller)) {
try {
if (controllers.get(controller).isClosed()) {
System.out.println("Reconnecting to database..");
controllers.get(controller).reconnect();
if (database.isClosed()) {
database.reconnect();
}
} catch (SQLException e) {
e.printStackTrace();
}
MusicBot.LOGGER.debug("Getting controller " + controller);
do {
if (!isDoingSomething && !controllers.get(controller).isDoingSomething()) {
return controllers.get(controller).start();
} else {
}
} while (true);
if (controllers.containsKey(controller)) {
return controllers.get(controller);
}
return null;
@@ -72,13 +59,6 @@ public class DBController {
public static void shutdown() throws SQLException {
database.close();
controllers.forEach((k,v) -> {
try {
v.database.close();
} catch (SQLException e) {
e.printStackTrace();
}
});
}
/**
@@ -87,6 +67,14 @@ public class DBController {
public static void init() {
if (controllers.isEmpty())
loadControllers();
/*ThreadManager.scheduler.scheduleWithFixedDelay(() -> {
try {
DBController.get().prepareAndExecute("SELECT 1;");
} catch (SQLException e) {
e.printStackTrace();
}
}, 60, 60, TimeUnit.SECONDS);*/
}
/**
@@ -3,7 +3,9 @@ package netneutrality.db.controllers;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.function.Consumer;
import netneutrality.ThreadManager;
import netneutrality.db.AbstractController;
import netneutrality.db.DBController;
import netneutrality.db.MysqlDatabase;
@@ -30,15 +32,12 @@ public class DBBlacklist extends AbstractController {
if (!isAlreadyBlacklisted(obj.getWord(), obj.getServerId())) {
database.insert("INSERT INTO blacklist VALUES(?,?,?,?)", obj.getWord(), obj.getServerId(), obj.isEnabled(), obj.getCreatorId());
} else {
end();
throw new RuntimeException("Word is already blacklisted");
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
}
public void delete(String word, String serverId) {
@@ -46,15 +45,11 @@ public class DBBlacklist extends AbstractController {
if (isAlreadyBlacklisted(word, serverId)) {
database.delete("DELETE FROM blacklist WHERE word = ? AND serverId = ?", word, serverId);
} else {
end();
throw new RuntimeException("Is not blacklisted");
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
}
public void enable(String word, String serverId) {
@@ -62,15 +57,12 @@ public class DBBlacklist extends AbstractController {
if (isAlreadyBlacklisted(word, serverId)) {
database.update("UPDATE blacklist SET isEnabled = 1 WHERE word = ? AND serverId = ?", word, serverId);
} else {
end();
throw new RuntimeException("Is not blacklisted");
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
}
public void disable(String word, String serverId) {
@@ -78,43 +70,39 @@ public class DBBlacklist extends AbstractController {
if (isAlreadyBlacklisted(word, serverId)) {
database.update("UPDATE blacklist SET isEnabled = 0 WHERE word = ? AND serverId = ?", word, serverId);
} else {
end();
throw new RuntimeException("Is not blacklisted");
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
}
public MBlacklist getBlacklistForWord(String word, String serverId) {
public void getBlacklistForWord(String word, String serverId, Consumer<MBlacklist> success) {
ThreadManager.executor.submit(() -> {
MBlacklist blacklisted = null;
try {
if (isAlreadyBlacklisted(word, serverId)) {
ResultSet rs = database.prepareAndExecute("SELECT * FROM blacklist WHERE word = ? AND serverId = ?", word, serverId);
Object array[][] = database.convertToArray(rs);
if (database.getNbRow() != 0) {
MBlacklist blacklisted = new MBlacklist((String) array[1][0], (Boolean) array[1][2], (String) array[1][3],
blacklisted = new MBlacklist((String) array[1][0], (Boolean) array[1][2], (String) array[1][3],
(String) array[1][1]);
end();
return blacklisted;
}
} else {
end();
throw new RuntimeException("Is not blacklisted");
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
return null;
success.accept(blacklisted);
});
}
public ArrayList<MBlacklist> getBlacklistFromServer(String serverId) {
public void getBlacklistFromServer(String serverId, Consumer<ArrayList<MBlacklist>> success) {
ThreadManager.executor.submit(() -> {
ArrayList<MBlacklist> output = new ArrayList<>();
try {
@@ -127,32 +115,27 @@ public class DBBlacklist extends AbstractController {
(String) model.getRow(row).get(1)));
}
} else {
end();
throw new RuntimeException("Blacklist is empty");
}
} catch (SQLException e) {
end();
e.printStackTrace();
} catch (NullPointerException | IndexOutOfBoundsException e) {
end();
}
} catch (NullPointerException | IndexOutOfBoundsException e) { }
success.accept(output);
});
end();
return output;
}
public boolean isAlreadyBlacklisted(String word, String serverId) throws SQLException {
ResultSet rs = database.prepareAndExecute("SELECT COUNT(*) FROM blacklist WHERE word = ? AND serverId = ?", word, serverId);
if (rs.next()) {
if (rs.getInt(1) == 0) {
end();
return false;
}
}
end();
return true;
}
@@ -4,6 +4,7 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.sql.ResultSet;
import netneutrality.ThreadManager;
import netneutrality.db.AbstractController;
import netneutrality.db.DBController;
import netneutrality.db.MysqlDatabase;
@@ -25,26 +26,26 @@ public class DBMessage extends AbstractController {
public void log(String servername, String channelname, String username, String datesent, String messageId, String message) {
ThreadManager.executor.submit(() -> {
try {
database.insert("INSERT INTO log_message VALUES(?,?,?,?,?,?,?)", servername, channelname, username, datesent, messageId, message, null);
} catch (SQLException e) {
end();
LogHandler.log(e);
}
});
end();
}
public void logEdit(String messageId, String newMessage) {
ThreadManager.executor.submit(() -> {
try {
database.update("UPDATE log_message SET editedMessage = ? WHERE messageId = ?", newMessage, messageId);
} catch (SQLException e) {
end();
LogHandler.log(e);
}
});
end();
}
public MMessage getMessage(String messageId) {
@@ -52,18 +53,14 @@ public class DBMessage extends AbstractController {
ResultSet rs = database.prepareAndExecute("SELECT * FROM log_message WHERE messageId = ?", messageId);
Object[][] array = database.convertToArray(rs);
if (database.getNbRow() != 0) {
MMessage message = new MMessage(array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
end();
return message;
return new MMessage(array[1][0], array[1][1], array[1][2], array[1][3], array[1][4], array[1][5]);
}
} catch (SQLException e) {
end();
LogHandler.log(e);
}
end();
return null;
}
@@ -80,11 +77,9 @@ public class DBMessage extends AbstractController {
}
} catch (SQLException e) {
end();
LogHandler.log(e);
}
end();
return messages;
}
@@ -93,16 +88,13 @@ public class DBMessage extends AbstractController {
try {
ResultSet rs = database.prepareAndExecute("SELECT message FROM log_message WHERE messageId = ?", messageId);
if (rs.next()) {
end();
return rs.getString(1);
}
} catch (SQLException e) {
end();
LogHandler.log(e);
}
end();
return "No message found";
}
@@ -111,16 +103,13 @@ public class DBMessage extends AbstractController {
try {
int result = database.insert("INSERT INTO logging VALUES(?,?,?)", serverId, channelId, true);
if (result == 1) {
end();
return true;
}
} catch (SQLException e) {
end();
LogHandler.log(e);
}
end();
return false;
}
@@ -129,16 +118,13 @@ public class DBMessage extends AbstractController {
try {
int result = database.update("UPDATE logging SET enabled = NOT enabled");
if (result == 1) {
end();
return true;
}
} catch (SQLException e) {
end();
LogHandler.log(e);
}
end();
return false;
}
@@ -147,16 +133,13 @@ public class DBMessage extends AbstractController {
try {
ResultSet rs = database.prepareAndExecute("SELECT enabled FROM logging WHERE serverId = ? AND channelId = ?", serverId, channelId);
if (rs.next()) {
end();
return rs.getBoolean(1);
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
return false;
}
@@ -9,22 +9,18 @@ public class DBSettings extends AbstractController {
public String getLoggingChannel(String serverId) {
if (serverId.isEmpty()) {
end();
return null;
}
try {
ResultSet rs = database.prepareAndExecute("SELECT channelId FROM logging WHERE serverId = ? AND enabled = 1", serverId);
if (rs.next()) {
end();
return rs.getString(1);
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
return null;
}
@@ -32,15 +28,12 @@ public class DBSettings extends AbstractController {
try {
ResultSet rs = database.prepareAndExecute("SELECT token FROM settings");
if (rs.next()) {
end();
return rs.getString(1);
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
return null;
}
@@ -48,15 +41,12 @@ public class DBSettings extends AbstractController {
try {
ResultSet rs = database.prepareAndExecute("SELECT selly_email FROM settings");
if (rs.next()) {
end();
return rs.getString(1);
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
return null;
}
@@ -64,15 +54,12 @@ public class DBSettings extends AbstractController {
try {
ResultSet rs = database.prepareAndExecute("SELECT selly_key FROM settings");
if (rs.next()) {
end();
return rs.getString(1);
}
} catch (SQLException e) {
end();
e.printStackTrace();
}
end();
return null;
}