Added functional database concurrency
Created a ThreadManager class Added concurrency for only some methods
This commit is contained in:
1 parent
9c820676d4
commit
2c74327ec3
7 files changed
+127
-171
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();
|
||||
|
||||
try {
|
||||
if (database.isClosed()) {
|
||||
database.reconnect();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (controllers.containsKey(controller)) {
|
||||
try {
|
||||
if (controllers.get(controller).isClosed()) {
|
||||
System.out.println("Reconnecting to database..");
|
||||
controllers.get(controller).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);
|
||||
|
||||
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,81 +70,72 @@ 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) {
|
||||
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],
|
||||
(String) array[1][1]);
|
||||
end();
|
||||
return blacklisted;
|
||||
}
|
||||
} else {
|
||||
end();
|
||||
throw new RuntimeException("Is not blacklisted");
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
end();
|
||||
e.printStackTrace();
|
||||
}
|
||||
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) {
|
||||
blacklisted = new MBlacklist((String) array[1][0], (Boolean) array[1][2], (String) array[1][3],
|
||||
(String) array[1][1]);
|
||||
}
|
||||
} else {
|
||||
throw new RuntimeException("Is not blacklisted");
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
success.accept(blacklisted);
|
||||
});
|
||||
|
||||
end();
|
||||
return null;
|
||||
}
|
||||
|
||||
public ArrayList<MBlacklist> getBlacklistFromServer(String serverId) {
|
||||
ArrayList<MBlacklist> output = new ArrayList<>();
|
||||
public void getBlacklistFromServer(String serverId, Consumer<ArrayList<MBlacklist>> success) {
|
||||
ThreadManager.executor.submit(() -> {
|
||||
ArrayList<MBlacklist> output = new ArrayList<>();
|
||||
|
||||
try {
|
||||
ResultSet rs = database.prepareAndExecute("SELECT * FROM blacklist WHERE serverId = ? AND isEnabled = 1", serverId);
|
||||
MTableModel model = database.convertToTableModel(rs);
|
||||
try {
|
||||
ResultSet rs = database.prepareAndExecute("SELECT * FROM blacklist WHERE serverId = ? AND isEnabled = 1", serverId);
|
||||
MTableModel model = database.convertToTableModel(rs);
|
||||
|
||||
if (model.getNbRows() != 0) {
|
||||
for (int row = 0; row < model.getNbRows(); row++) {
|
||||
output.add(new MBlacklist((String) model.getRow(row).get(0), (Boolean) model.getRow(row).get(2), (String) model.getRow(row).get(3),
|
||||
(String) model.getRow(row).get(1)));
|
||||
if (model.getNbRows() != 0) {
|
||||
for (int row = 0; row < model.getNbRows(); row++) {
|
||||
output.add(new MBlacklist((String) model.getRow(row).get(0), (Boolean) model.getRow(row).get(2), (String) model.getRow(row).get(3),
|
||||
(String) model.getRow(row).get(1)));
|
||||
}
|
||||
} else {
|
||||
throw new RuntimeException("Blacklist is empty");
|
||||
}
|
||||
} else {
|
||||
end();
|
||||
throw new RuntimeException("Blacklist is empty");
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
end();
|
||||
e.printStackTrace();
|
||||
} catch (NullPointerException | IndexOutOfBoundsException e) {
|
||||
end();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
} 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) {
|
||||
|
||||
try {
|
||||
database.insert("INSERT INTO log_message VALUES(?,?,?,?,?,?,?)", servername, channelname, username, datesent, messageId, message, null);
|
||||
} catch (SQLException e) {
|
||||
end();
|
||||
LogHandler.log(e);
|
||||
}
|
||||
ThreadManager.executor.submit(() -> {
|
||||
try {
|
||||
database.insert("INSERT INTO log_message VALUES(?,?,?,?,?,?,?)", servername, channelname, username, datesent, messageId, message, null);
|
||||
} catch (SQLException e) {
|
||||
LogHandler.log(e);
|
||||
}
|
||||
});
|
||||
|
||||
end();
|
||||
}
|
||||
|
||||
public void logEdit(String messageId, String newMessage) {
|
||||
|
||||
try {
|
||||
database.update("UPDATE log_message SET editedMessage = ? WHERE messageId = ?", newMessage, messageId);
|
||||
} catch (SQLException e) {
|
||||
end();
|
||||
LogHandler.log(e);
|
||||
}
|
||||
ThreadManager.executor.submit(() -> {
|
||||
try {
|
||||
database.update("UPDATE log_message SET editedMessage = ? WHERE messageId = ?", newMessage, messageId);
|
||||
} catch (SQLException e) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user