diff --git a/Emulator/src/main/java/com/eu/habbo/database/SqlQueries.java b/Emulator/src/main/java/com/eu/habbo/database/SqlQueries.java
index 3040ceaf..0d0e12be 100644
--- a/Emulator/src/main/java/com/eu/habbo/database/SqlQueries.java
+++ b/Emulator/src/main/java/com/eu/habbo/database/SqlQueries.java
@@ -7,9 +7,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Optional;
-import java.util.function.BiConsumer;
public final class SqlQueries {
@@ -21,6 +21,11 @@ public final class SqlQueries {
T map(ResultSet rs) throws SQLException;
}
+ @FunctionalInterface
+ public interface RowConsumer {
+ void accept(ResultSet rs) throws SQLException;
+ }
+
@FunctionalInterface
public interface ParameterBinder
{
void bind(PreparedStatement ps, P value) throws SQLException;
@@ -60,6 +65,19 @@ public final class SqlQueries {
}
}
+ public static void forEach(String sql, RowConsumer consumer, Object... params) {
+ try (Connection c = Emulator.getDatabase().getDataSource().getConnection();
+ PreparedStatement ps = c.prepareStatement(sql)) {
+ bindAll(ps, params);
+ try (ResultSet rs = ps.executeQuery()) {
+ while (rs.next()) {
+ consumer.accept(rs);
+ }
+ }
+ } catch (SQLException e) {
+ throw new DataAccessException("forEach failed: " + sql, e);
+ }
+ }
public static int update(String sql, Object... params) {
try (Connection c = Emulator.getDatabase().getDataSource().getConnection();
@@ -71,7 +89,7 @@ public final class SqlQueries {
}
}
- public static
int[] batchUpdate(String sql, List
items, ParameterBinder
binder) {
+ public static
int[] batchUpdate(String sql, Collection extends P> items, ParameterBinder
binder) {
try (Connection c = Emulator.getDatabase().getDataSource().getConnection();
PreparedStatement ps = c.prepareStatement(sql)) {
for (P item : items) {
diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementManager.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementManager.java
index ff3700c4..df51f0bb 100644
--- a/Emulator/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementManager.java
+++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementManager.java
@@ -1,6 +1,7 @@
package com.eu.habbo.habbohotel.achievements;
import com.eu.habbo.Emulator;
+import com.eu.habbo.database.SqlQueries;
import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.users.Habbo;
import com.eu.habbo.habbohotel.users.HabboBadge;
@@ -49,16 +50,12 @@ public class AchievementManager {
if (habbo != null) {
progressAchievement(habbo, achievement, amount);
} else {
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection();
- PreparedStatement statement = connection.prepareStatement("" +
- "INSERT INTO users_achievements_queue (user_id, achievement_id, amount) VALUES (?, ?, ?) " +
- "ON DUPLICATE KEY UPDATE amount = amount + ?")) {
- statement.setInt(1, habboId);
- statement.setInt(2, achievement.id);
- statement.setInt(3, amount);
- statement.setInt(4, amount);
- statement.execute();
- } catch (SQLException e) {
+ try {
+ SqlQueries.update(
+ "INSERT INTO users_achievements_queue (user_id, achievement_id, amount) VALUES (?, ?, ?) "
+ + "ON DUPLICATE KEY UPDATE amount = amount + ?",
+ habboId, achievement.id, amount, amount);
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
}
}
@@ -203,44 +200,41 @@ public class AchievementManager {
}
public static void createUserEntry(Habbo habbo, Achievement achievement) {
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_achievements (user_id, achievement_name, progress) VALUES (?, ?, ?)")) {
- statement.setInt(1, habbo.getHabboInfo().getId());
- statement.setString(2, achievement.name);
- statement.setInt(3, 1);
- statement.execute();
- } catch (SQLException e) {
+ try {
+ SqlQueries.update(
+ "INSERT INTO users_achievements (user_id, achievement_name, progress) VALUES (?, ?, ?)",
+ habbo.getHabboInfo().getId(), achievement.name, 1);
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
}
}
public static void saveAchievements(Habbo habbo) {
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_achievements SET progress = ? WHERE achievement_name = ? AND user_id = ? LIMIT 1")) {
- statement.setInt(3, habbo.getHabboInfo().getId());
- for (Map.Entry map : habbo.getHabboStats().getAchievementProgress().entrySet()) {
- statement.setInt(1, map.getValue());
- statement.setString(2, map.getKey().name);
- statement.addBatch();
- }
- statement.executeBatch();
- } catch (SQLException e) {
+ int userId = habbo.getHabboInfo().getId();
+ try {
+ SqlQueries.batchUpdate(
+ "UPDATE users_achievements SET progress = ? WHERE achievement_name = ? AND user_id = ? LIMIT 1",
+ habbo.getHabboStats().getAchievementProgress().entrySet(),
+ (ps, entry) -> {
+ ps.setInt(1, entry.getValue());
+ ps.setString(2, entry.getKey().name);
+ ps.setInt(3, userId);
+ });
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
}
}
public static int getAchievementProgressForHabbo(int userId, Achievement achievement) {
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT progress FROM users_achievements WHERE user_id = ? AND achievement_name = ? LIMIT 1")) {
- statement.setInt(1, userId);
- statement.setString(2, achievement.name);
- try (ResultSet set = statement.executeQuery()) {
- if (set.next()) {
- return set.getInt("progress");
- }
- }
- } catch (SQLException e) {
+ try {
+ return SqlQueries.queryOne(
+ "SELECT progress FROM users_achievements WHERE user_id = ? AND achievement_name = ? LIMIT 1",
+ rs -> rs.getInt("progress"),
+ userId, achievement.name).orElse(0);
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
+ return 0;
}
-
- return 0;
}
public void reload() {
diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/campaign/calendar/CalendarManager.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/campaign/calendar/CalendarManager.java
index 1336f88f..99c238c3 100644
--- a/Emulator/src/main/java/com/eu/habbo/habbohotel/campaign/calendar/CalendarManager.java
+++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/campaign/calendar/CalendarManager.java
@@ -1,6 +1,7 @@
package com.eu.habbo.habbohotel.campaign.calendar;
import com.eu.habbo.Emulator;
+import com.eu.habbo.database.SqlQueries;
import com.eu.habbo.habbohotel.users.Habbo;
import com.eu.habbo.messages.outgoing.events.calendar.AdventCalendarProductComposer;
import com.eu.habbo.plugin.events.users.calendar.UserClaimRewardEvent;
@@ -33,27 +34,27 @@ public class CalendarManager {
public boolean reload() {
this.dispose();
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM calendar_campaigns WHERE enabled = 1")) {
- try (ResultSet set = statement.executeQuery()) {
- while (set.next()) {
- calendarCampaigns.put(set.getInt("id"), new CalendarCampaign(set));
- }
- }
- } catch (SQLException e) {
+ try {
+ SqlQueries.query(
+ "SELECT * FROM calendar_campaigns WHERE enabled = 1",
+ CalendarCampaign::new)
+ .forEach(c -> calendarCampaigns.put(c.getId(), c));
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
return false;
}
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM calendar_rewards")) {
- try (ResultSet set = statement.executeQuery()) {
- while (set.next()) {
- CalendarCampaign campaign = calendarCampaigns.get(set.getInt("campaign_id"));
- if(campaign != null){
- campaign.addReward(new CalendarRewardObject(set));
- }
- }
- }
- } catch (SQLException e) {
+ try {
+ SqlQueries.query(
+ "SELECT * FROM calendar_rewards",
+ rs -> Map.entry(rs.getInt("campaign_id"), new CalendarRewardObject(rs)))
+ .forEach(entry -> {
+ CalendarCampaign campaign = calendarCampaigns.get(entry.getKey());
+ if (campaign != null) {
+ campaign.addReward(entry.getValue());
+ }
+ });
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
return false;
}
@@ -94,14 +95,12 @@ public class CalendarManager {
public boolean deleteCampaign(CalendarCampaign campaign) {
calendarCampaigns.remove(campaign.getId());
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM calendar_campaigns WHERE id = ? LIMIT 1")) {
- statement.setInt(1, campaign.getId());
- return statement.execute();
- } catch (SQLException e) {
+ try {
+ return SqlQueries.update("DELETE FROM calendar_campaigns WHERE id = ? LIMIT 1", campaign.getId()) > 0;
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
+ return false;
}
-
- return false;
}
public CalendarCampaign getCalendarCampaign(String campaignName) {
@@ -136,14 +135,15 @@ public class CalendarManager {
habbo.getHabboStats().calendarRewardsClaimed.add(new CalendarRewardClaimed(habbo.getHabboInfo().getId(), campaign.getId(), day, object.getId(), new Timestamp(System.currentTimeMillis())));
habbo.getClient().sendResponse(new AdventCalendarProductComposer(true, object, habbo));
object.give(habbo);
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO calendar_rewards_claimed (user_id, campaign_id, day, reward_id, timestamp) VALUES (?, ?, ?, ?, ?)")) {
- statement.setInt(1, habbo.getHabboInfo().getId());
- statement.setInt(2, campaign.getId());
- statement.setInt(3, day);
- statement.setInt(4, object.getId());
- statement.setInt(5, Emulator.getIntUnixTimestamp());
- statement.execute();
- } catch (SQLException e) {
+ try {
+ SqlQueries.update(
+ "INSERT INTO calendar_rewards_claimed (user_id, campaign_id, day, reward_id, timestamp) VALUES (?, ?, ?, ?, ?)",
+ habbo.getHabboInfo().getId(),
+ campaign.getId(),
+ day,
+ object.getId(),
+ Emulator.getIntUnixTimestamp());
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
}
}
diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java
index 5c21f4ca..e53aee11 100644
--- a/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java
+++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java
@@ -1,6 +1,7 @@
package com.eu.habbo.habbohotel.users;
import com.eu.habbo.Emulator;
+import com.eu.habbo.database.SqlQueries;
import com.eu.habbo.habbohotel.catalog.CatalogItem;
import com.eu.habbo.habbohotel.games.Game;
import com.eu.habbo.habbohotel.games.GamePlayer;
@@ -14,7 +15,6 @@ import com.eu.habbo.habbohotel.rooms.RoomTile;
import com.eu.habbo.habbohotel.rooms.RoomUnit;
import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer;
import gnu.trove.map.hash.TIntIntHashMap;
-import gnu.trove.procedure.TIntIntProcedure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -104,53 +104,47 @@ public class HabboInfo implements Runnable {
private void loadCurrencies() {
this.currencies = new TIntIntHashMap();
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_currency WHERE user_id = ?")) {
- statement.setInt(1, this.id);
- try (ResultSet set = statement.executeQuery()) {
- while (set.next()) {
- this.currencies.put(set.getInt("type"), set.getInt("amount"));
- }
- }
- } catch (SQLException e) {
+ try {
+ SqlQueries.forEach(
+ "SELECT * FROM users_currency WHERE user_id = ?",
+ rs -> this.currencies.put(rs.getInt("type"), rs.getInt("amount")),
+ this.id);
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
}
}
private void saveCurrencies() {
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_currency (user_id, type, amount) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE amount = ?")) {
- this.currencies.forEachEntry(new TIntIntProcedure() {
- @Override
- public boolean execute(int a, int b) {
- try {
- statement.setInt(1, HabboInfo.this.getId());
- statement.setInt(2, a);
- statement.setInt(3, b);
- statement.setInt(4, b);
- statement.addBatch();
- } catch (SQLException e) {
- LOGGER.error("Caught SQL exception", e);
- }
- return true;
- }
- });
- statement.executeBatch();
- } catch (SQLException e) {
- LOGGER.error("Caught SQL exception", e);
+ List entries = new ArrayList<>(this.currencies.size());
+ this.currencies.forEachEntry((type, amount) -> {
+ entries.add(new int[]{type, amount});
+ return true;
+ });
+
+ try {
+ SqlQueries.batchUpdate(
+ "INSERT INTO users_currency (user_id, type, amount) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE amount = ?",
+ entries,
+ (ps, e) -> {
+ ps.setInt(1, this.id);
+ ps.setInt(2, e[0]);
+ ps.setInt(3, e[1]);
+ ps.setInt(4, e[1]);
+ });
+ } catch (SqlQueries.DataAccessException ex) {
+ LOGGER.error("Caught SQL exception", ex);
}
}
private void loadSavedSearches() {
- this.savedSearches = new ArrayList<>();
-
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_saved_searches WHERE user_id = ?")) {
- statement.setInt(1, this.id);
- try (ResultSet set = statement.executeQuery()) {
- while (set.next()) {
- this.savedSearches.add(new NavigatorSavedSearch(set.getString("search_code"), set.getString("filter"), set.getInt("id")));
- }
- }
- } catch (SQLException e) {
+ try {
+ this.savedSearches = SqlQueries.query(
+ "SELECT * FROM users_saved_searches WHERE user_id = ?",
+ rs -> new NavigatorSavedSearch(rs.getString("search_code"), rs.getString("filter"), rs.getInt("id")),
+ this.id);
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
+ this.savedSearches = new ArrayList<>();
}
}
@@ -182,26 +176,22 @@ public class HabboInfo implements Runnable {
public void deleteSavedSearch(NavigatorSavedSearch search) {
this.savedSearches.remove(search);
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM users_saved_searches WHERE id = ?")) {
- statement.setInt(1, search.getId());
- statement.execute();
- } catch (SQLException e) {
+ try {
+ SqlQueries.update("DELETE FROM users_saved_searches WHERE id = ?", search.getId());
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
}
}
private void loadMessengerCategories() {
- this.messengerCategories = new ArrayList<>();
-
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM messenger_categories WHERE user_id = ?")) {
- statement.setInt(1, this.id);
- try (ResultSet set = statement.executeQuery()) {
- while (set.next()) {
- this.messengerCategories.add(new MessengerCategory(set.getString("name"), set.getInt("user_id"), set.getInt("id")));
- }
- }
- } catch (SQLException e) {
+ try {
+ this.messengerCategories = SqlQueries.query(
+ "SELECT * FROM messenger_categories WHERE user_id = ?",
+ rs -> new MessengerCategory(rs.getString("name"), rs.getInt("user_id"), rs.getInt("id")),
+ this.id);
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
+ this.messengerCategories = new ArrayList<>();
}
}
@@ -232,10 +222,9 @@ public class HabboInfo implements Runnable {
public void deleteMessengerCategory(MessengerCategory category) {
this.messengerCategories.remove(category);
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM messenger_categories WHERE id = ?")) {
- statement.setInt(1, category.getId());
- statement.execute();
- } catch (SQLException e) {
+ try {
+ SqlQueries.update("DELETE FROM messenger_categories WHERE id = ?", category.getId());
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
}
}
@@ -389,12 +378,10 @@ public class HabboInfo implements Runnable {
public void setPixels(int pixels) {
this.setCurrencyAmount(0, pixels);
- this.run();
}
public void addPixels(int pixels) {
this.addCurrencyAmount(0, pixels);
- this.run();
}
public int getLastOnline() {
@@ -588,25 +575,26 @@ public class HabboInfo implements Runnable {
public void run() {
this.saveCurrencies();
- try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users SET motto = ?, online = ?, look = ?, gender = ?, credits = ?, last_login = ?, last_online = ?, home_room = ?, ip_current = ?, `rank` = ?, machine_id = ?, username = ?, background_id = ?, background_stand_id = ?, background_overlay_id = ? WHERE id = ?")) {
- statement.setString(1, this.motto);
- statement.setString(2, this.online ? "1" : "0");
- statement.setString(3, this.look);
- statement.setString(4, this.gender.name());
- statement.setInt(5, this.credits);
- statement.setInt(7, this.lastOnline);
- statement.setInt(6, Emulator.getIntUnixTimestamp());
- statement.setInt(8, this.homeRoom);
- statement.setString(9, this.ipLogin);
- statement.setInt(10, this.rank != null ? this.rank.getId() : 1);
- statement.setString(11, this.machineID);
- statement.setString(12, this.username);
- statement.setInt(13, this.InfostandBg);
- statement.setInt(14, this.InfostandStand);
- statement.setInt(15, this.InfostandOverlay);
- statement.setInt(16, this.id);
- statement.executeUpdate();
- } catch (SQLException e) {
+ try {
+ SqlQueries.update(
+ "UPDATE users SET motto = ?, online = ?, look = ?, gender = ?, credits = ?, last_login = ?, last_online = ?, home_room = ?, ip_current = ?, `rank` = ?, machine_id = ?, username = ?, background_id = ?, background_stand_id = ?, background_overlay_id = ? WHERE id = ?",
+ this.motto,
+ this.online ? "1" : "0",
+ this.look,
+ this.gender.name(),
+ this.credits,
+ Emulator.getIntUnixTimestamp(),
+ this.lastOnline,
+ this.homeRoom,
+ this.ipLogin,
+ this.rank != null ? this.rank.getId() : 1,
+ this.machineID,
+ this.username,
+ this.InfostandBg,
+ this.InfostandStand,
+ this.InfostandOverlay,
+ this.id);
+ } catch (SqlQueries.DataAccessException e) {
LOGGER.error("Caught SQL exception", e);
}
}