Skip to content

Commit 22342af

Browse files
committed
fix(provider): add MySQL connection readiness checks
1 parent ee29118 commit 22342af

1 file changed

Lines changed: 35 additions & 23 deletions

File tree

src/main/java/me/onebone/economyapi/provider/MySQLProvider.java

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,18 @@
1919
import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG;
2020

2121
public class MySQLProvider implements Provider {
22-
private static SqlManager manager;
22+
private static volatile SqlManager manager;
2323
private static String TABLE_NAME_PREFIX = "";
2424
private final ReadWriteLock lock = new ReentrantReadWriteLock();
2525

2626
public static void initTablePrefix(String prefix) {
2727
MySQLProvider.TABLE_NAME_PREFIX = prefix;
2828
}
2929

30+
private static boolean isReady() {
31+
return MySQLProvider.manager != null;
32+
}
33+
3034
@Override
3135
public void init(File path) {
3236
if (MySQLProvider.manager != null && MySQLProvider.manager.isEnable()) {
@@ -35,8 +39,7 @@ public void init(File path) {
3539
}
3640

3741
if (!MAIN_CONFIG.getConfig().exists("sql.mysql")) {
38-
EconomyAPI.getInstance().getLogger().error("MySQL is not configured.");
39-
return;
42+
throw new RuntimeException("MySQL is not configured.");
4043
}
4144
ConfigSection mysqlSection = MAIN_CONFIG.getConfig().getSection("sql.mysql");
4245
String host = mysqlSection.getString("host", "localhost");
@@ -47,26 +50,24 @@ public void init(File path) {
4750
String tablePrefix = mysqlSection.getString("table-prefix", "v1_");
4851
MySQLProvider.initTablePrefix(tablePrefix);
4952

50-
Server.getInstance().getScheduler().scheduleTask(EconomyAPI.getInstance(), () -> {
51-
try {
52-
SqlManager manager = new SqlManager(EconomyAPI.getInstance(), new UserData(
53-
username, password, host, port, database
54-
));
55-
MySQLProvider.manager = manager;
56-
57-
MAIN_CONFIG.getCurrencyList().forEach(currencyName -> {
58-
manager.createTable(
59-
TABLE_NAME_PREFIX + currencyName,
60-
new TableType("player", DataType.getUUID(), true),
61-
new TableType("money", DataType.getBIGINT(), false)
62-
);
63-
});
64-
EconomyAPI.getInstance().getLogger().info("MySQL initialized!");
65-
} catch (MySqlLoginException e) {
66-
EconomyAPI.getInstance().getLogger().error("MySQL connection failed.", e);
67-
Server.getInstance().getPluginManager().disablePlugin(EconomyAPI.getInstance());
68-
}
69-
}, true);
53+
try {
54+
SqlManager manager = new SqlManager(EconomyAPI.getInstance(), new UserData(
55+
username, password, host, port, database
56+
));
57+
MySQLProvider.manager = manager;
58+
59+
MAIN_CONFIG.getCurrencyList().forEach(currencyName -> {
60+
manager.createTable(
61+
TABLE_NAME_PREFIX + currencyName,
62+
new TableType("player", DataType.getUUID(), true),
63+
new TableType("money", DataType.getBIGINT(), false)
64+
);
65+
});
66+
EconomyAPI.getInstance().getLogger().info("MySQL initialized!");
67+
} catch (MySqlLoginException e) {
68+
EconomyAPI.getInstance().getLogger().error("MySQL connection failed.", e);
69+
Server.getInstance().getPluginManager().disablePlugin(EconomyAPI.getInstance());
70+
}
7071
}
7172

7273
@Override
@@ -97,6 +98,7 @@ public void close() {
9798
public boolean accountExists(String currencyName, String id) {
9899
lock.readLock().lock();
99100
try {
101+
if (!isReady()) return false;
100102
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return false;
101103
if (MySQLProvider.manager.isExistTable(TABLE_NAME_PREFIX + currencyName)) {
102104
return MySQLProvider.manager.isExistsData(TABLE_NAME_PREFIX + currencyName, "player", id);
@@ -116,6 +118,7 @@ public boolean accountExists(String id) {
116118
public boolean removeAccount(String currencyName, String id) {
117119
lock.writeLock().lock();
118120
try {
121+
if (!isReady()) return false;
119122
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return false;
120123
if (MySQLProvider.manager.isExistTable(TABLE_NAME_PREFIX + currencyName)) {
121124
return MySQLProvider.manager.deleteData(TABLE_NAME_PREFIX + currencyName, new SqlData("player", id));
@@ -135,6 +138,7 @@ public boolean removeAccount(String id) {
135138
public boolean createAccount(String currencyName, String id, double defaultMoney) {
136139
lock.writeLock().lock();
137140
try {
141+
if (!isReady()) return false;
138142
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return false;
139143
long money = (long) (defaultMoney * 100);
140144
if (!accountExists(currencyName, id)) {
@@ -156,6 +160,7 @@ public boolean createAccount(String id, double defaultMoney) {
156160
public boolean setMoney(String currencyName, String id, double amount) {
157161
lock.writeLock().lock();
158162
try {
163+
if (!isReady()) return false;
159164
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return false;
160165
long money = (long) (amount * 100);
161166
return MySQLProvider.manager.setData(TABLE_NAME_PREFIX + currencyName, new SqlData("money", money), new SqlData("player", id));
@@ -173,6 +178,7 @@ public boolean setMoney(String id, double amount) {
173178
public boolean addMoney(String currencyName, String id, double amount) {
174179
lock.writeLock().lock();
175180
try {
181+
if (!isReady()) return false;
176182
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return false;
177183
double current = getMoney(currencyName, id);
178184
if (current == -1) return false;
@@ -192,6 +198,7 @@ public boolean addMoney(String id, double amount) {
192198
public boolean reduceMoney(String currencyName, String id, double amount) {
193199
lock.writeLock().lock();
194200
try {
201+
if (!isReady()) return false;
195202
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return false;
196203
double current = getMoney(currencyName, id);
197204
if (current == -1) return false;
@@ -211,6 +218,7 @@ public boolean reduceMoney(String id, double amount) {
211218
public double getMoney(String currencyName, String id) {
212219
lock.readLock().lock();
213220
try {
221+
if (!isReady()) return -1;
214222
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return -1;
215223
SqlDataList<SqlData> sqlDataList = MySQLProvider.manager.getData(TABLE_NAME_PREFIX + currencyName, "money", new SqlData("player", id));
216224
if (sqlDataList.isEmpty()) return -1;
@@ -230,6 +238,7 @@ public LinkedHashMap<String, Double> getAll(String currencyName) {
230238
lock.readLock().lock();
231239
try {
232240
LinkedHashMap<String, Double> map = new LinkedHashMap<>();
241+
if (!isReady()) return map;
233242
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return map;
234243
SqlData emptyData = new SqlData();
235244
SqlDataList<SqlData> sqlDataList = MySQLProvider.manager.getData(TABLE_NAME_PREFIX + currencyName, "*", emptyData);
@@ -266,6 +275,7 @@ public String getName() {
266275
public int setMoneyChecked(String currencyName, String id, double amount, double maxMoney) {
267276
lock.writeLock().lock();
268277
try {
278+
if (!isReady()) return RET_NO_ACCOUNT;
269279
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return RET_NO_ACCOUNT;
270280
if (!accountExists(currencyName, id)) return RET_NO_ACCOUNT;
271281
if (amount > maxMoney) return RET_INVALID;
@@ -281,6 +291,7 @@ public int setMoneyChecked(String currencyName, String id, double amount, double
281291
public int addMoneyChecked(String currencyName, String id, double amount, double maxMoney) {
282292
lock.writeLock().lock();
283293
try {
294+
if (!isReady()) return RET_NO_ACCOUNT;
284295
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return RET_NO_ACCOUNT;
285296
double current = getMoney(currencyName, id);
286297
if (current == -1) return RET_NO_ACCOUNT;
@@ -297,6 +308,7 @@ public int addMoneyChecked(String currencyName, String id, double amount, double
297308
public int reduceMoneyChecked(String currencyName, String id, double amount) {
298309
lock.writeLock().lock();
299310
try {
311+
if (!isReady()) return RET_NO_ACCOUNT;
300312
if (!MAIN_CONFIG.getCurrencyList().contains(currencyName)) return RET_NO_ACCOUNT;
301313
double current = getMoney(currencyName, id);
302314
if (current == -1) return RET_NO_ACCOUNT;

0 commit comments

Comments
 (0)