package javastory.channel.client;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javastory.db.Database;
public class Ring implements Comparable<Ring> {
private final int ringId;
private final int partnerRingId;
private final int partnerId;
private final int itemId;
private final String partnerName;
private boolean equipped;
private Ring(final int ringId, final int partnerRingId, final int partnerId, final int itemid, final String partnername) {
this.ringId = ringId;
this.partnerRingId = partnerRingId;
this.partnerId = partnerId;
this.itemId = itemid;
this.partnerName = partnername;
}
public static Ring loadFromDb(final int ringId) {
final Connection c = Database.getConnection();
try ( PreparedStatement ps = getRingById(ringId, c);
ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
final int partnerRingId = rs.getInt("partnerRingId");
final int partnerCharacterId = rs.getInt("partnerChrId");
final int ringItemId = rs.getInt("itemid");
final String partnerName = rs.getString("partnerName");
return new Ring(ringId, partnerRingId, partnerCharacterId, ringItemId, partnerName);
}
} catch (final SQLException ex) {
System.err.println("Could not load ring from database: " + ex);
}
return null;
}
private static PreparedStatement getRingById(final int ringId, final Connection con) throws SQLException {
final PreparedStatement ps = con.prepareStatement("SELECT * FROM rings WHERE id = ?");
ps.setInt(1, ringId);
return ps;
}
public static int createRing(final int itemid, final int partner1Id, final String partner1Name, final int partner2Id, final String partner2Name) {
// TODO: Check if item ID is actually a ring.
if (checkRingDB(partner1Id) || checkRingDB(partner2Id)) {
return 0;
}
final int[] ringID = new int[2];
final Connection con = Database.getConnection();
try {
PreparedStatement ps = con.prepareStatement("INSERT INTO rings (itemid, partnerChrId, partnername) VALUES (?, ?, ?)",
Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, itemid);
ps.setInt(2, partner2Id);
ps.setString(3, partner2Name);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
rs.next();
ringID[0] = rs.getInt(1);
rs.close();
ps.close();
ps = con.prepareStatement("INSERT INTO rings (itemid, partnerRingId, partnerChrId, partnername) VALUES (?, ?, ?, ?)",
Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, itemid);
ps.setInt(2, ringID[0]);
ps.setInt(3, partner1Id);
ps.setString(4, partner1Name);
ps.executeUpdate();
rs = ps.getGeneratedKeys();
rs.next();
ringID[1] = rs.getInt(1);
rs.close();
ps.close();
ps = con.prepareStatement("UPDATE rings SET partnerRingId = ? WHERE id = ?");
ps.setInt(1, ringID[1]);
ps.setInt(2, ringID[0]);
ps.executeUpdate();
ps.close();
return 1;
} catch (final SQLException ex) {
return 0;
}
// TODO: Make these work!
// InventoryManipulator.addRing(partner1, itemid, ringID[0]);
// InventoryManipulator.addRing(partner2, itemid, ringID[1]);
// TODO: resend character info and respawn both.
}
public int getRingId() {
return this.ringId;
}
public int getPartnerRingId() {
return this.partnerRingId;
}
public int getPartnerCharacterId() {
return this.partnerId;
}
public int getItemId() {
return this.itemId;
}
public String getPartnerName() {
return this.partnerName;
}
public boolean isEquipped() {
return this.equipped;
}
public void setEquipped(final boolean equipped) {
this.equipped = equipped;
}
@Override
public boolean equals(final Object o) {
if (o instanceof Ring) {
if (((Ring) o).getRingId() == this.getRingId()) {
return true;
} else {
return false;
}
}
return false;
}
@Override
public int hashCode() {
int hash = 5;
hash = 53 * hash + this.ringId;
return hash;
}
@Override
public int compareTo(final Ring other) {
if (this.ringId < other.getRingId()) {
return -1;
} else if (this.ringId == other.getRingId()) {
return 0;
} else {
return 1;
}
}
public static boolean checkRingDB(final int characterId) {
final Connection con = Database.getConnection();
try ( PreparedStatement ps = getSelectRingIdByPartnerId(characterId, con);
ResultSet rs = ps.executeQuery()) {
return rs.next();
} catch (final SQLException ex) {
// TS NOTE: This used to return true. Very wrong. Failure is appropriate for this case.
return false;
}
}
private static PreparedStatement getSelectRingIdByPartnerId(final int characterId, final Connection con) throws SQLException {
final PreparedStatement ps = con.prepareStatement("SELECT id FROM rings WHERE partnerChrId = ?");
ps.setInt(1, characterId);
return ps;
}
public static void removeRingFromDb(final int characterId) {
int otherId;
final Connection con = Database.getConnection();
try ( PreparedStatement ps = getSelectRingByPartnerId(characterId, con);
ResultSet rs = ps.executeQuery()) {
otherId = rs.getInt("partnerRingId");
removeRing(characterId, con);
removeRing(otherId, con);
} catch (final SQLException sex) {
return;
}
}
private static void removeRing(final int characterId, final Connection con) throws SQLException {
try (PreparedStatement ps2 = con.prepareStatement("DELETE FROM rings WHERE partnerChrId = ?")) {
ps2.setInt(1, characterId);
ps2.executeUpdate();
}
}
private static PreparedStatement getSelectRingByPartnerId(final int characterId, final Connection con) throws SQLException {
final PreparedStatement ps = con.prepareStatement("SELECT partnerRingId FROM rings WHERE partnerChrId = ?");
ps.setInt(1, characterId);
return ps;
}
}