package net.scapeemulator.game.io.jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import net.scapeemulator.game.model.player.Player;
public final class FriendsTable extends Table<Player> {
private final PreparedStatement loadStatement;
private final PreparedStatement saveStatement;
private final PreparedStatement clearStatement;
public FriendsTable(Connection connection) throws SQLException {
this.loadStatement = connection.prepareStatement("SELECT * FROM friends WHERE player_id = ?;");
this.saveStatement = connection.prepareStatement("INSERT INTO friends (player_id, list, list_index, name) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name);");
this.clearStatement = connection.prepareStatement("DELETE FROM friends WHERE player_id = ? and list = ? and list_index >= ?;");
}
@Override
public void load(Player player) throws SQLException, IOException {
loadStatement.setInt(1, player.getDatabaseId());
long[] friendsA = new long[200];
long[] ignoresA = new long[100];
try (ResultSet set = loadStatement.executeQuery()) {
while (set.next()) {
String list = set.getString("list");
int index = set.getInt("list_index");
long name = set.getLong("name");
switch (list) {
case "FRIEND":
friendsA[index] = name;
break;
case "IGNORE":
ignoresA[index] = name;
break;
}
}
}
List<Long> friends = new ArrayList<Long>();
for (long l : friendsA) {
if (l > 0) {
friends.add(l);
}
}
List<Long> ignores = new ArrayList<Long>();
for (long l : ignoresA) {
if (l > 0) {
ignores.add(l);
}
}
player.getFriends().loadedLists(friends, ignores);
}
@Override
public void save(Player player) throws SQLException, IOException {
List<Long> friends = player.getFriends().getFriendsList();
clearStatement.setInt(1, player.getDatabaseId());
clearStatement.setString(2, "FRIEND");
clearStatement.setInt(3, friends.size());
clearStatement.addBatch();
if (friends.size() > 0) {
saveStatement.setInt(1, player.getDatabaseId());
saveStatement.setString(2, "FRIEND");
for (int i = 0; i < friends.size(); i++) {
saveStatement.setInt(3, i);
saveStatement.setLong(4, friends.get(i));
saveStatement.addBatch();
}
saveStatement.executeBatch();
}
List<Long> ignores = player.getFriends().getIgnoreList();
clearStatement.setInt(1, player.getDatabaseId());
clearStatement.setString(2, "IGNORE");
clearStatement.setInt(3, ignores.size());
clearStatement.addBatch();
clearStatement.executeBatch();
if (ignores.size() > 0) {
saveStatement.setInt(1, player.getDatabaseId());
saveStatement.setString(2, "IGNORE");
for (int i = 0; i < friends.size(); i++) {
saveStatement.setInt(3, i);
saveStatement.setLong(4, ignores.get(i));
saveStatement.addBatch();
}
saveStatement.executeBatch();
}
}
}