MXD-Server/src/client/inventory/MapleInventoryIdentifier.java

117 lines
3.4 KiB
Java

package client.inventory;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.Connection;
import tools.FileoutputUtil;
import database.DBConPool;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.atomic.AtomicInteger;
import java.io.Serializable;
public class MapleInventoryIdentifier implements Serializable {
private static final long serialVersionUID = 21830921831301L;
private AtomicInteger runningUID;
private ReentrantReadWriteLock rwl;
private Lock readLock;
private Lock writeLock;
private static MapleInventoryIdentifier instance = new MapleInventoryIdentifier();
public MapleInventoryIdentifier() {
this.rwl = new ReentrantReadWriteLock();
this.readLock = this.rwl.readLock();
this.writeLock = this.rwl.writeLock();
this.runningUID = new AtomicInteger(0);
this.getNextUniqueId();
}
public static int getInstance() {
return MapleInventoryIdentifier.instance.getNextUniqueId();
}
public int getNextUniqueId() {
if (this.grabRunningUID() <= 0) {
this.setRunningUID(this.initUID());
}
this.incrementRunningUID();
return this.grabRunningUID();
}
public int grabRunningUID() {
this.readLock.lock();
try {
return this.runningUID.get();
} finally {
this.readLock.unlock();
}
}
public void incrementRunningUID() {
this.setRunningUID(this.grabRunningUID() + 1);
}
public void setRunningUID(final int rUID) {
if (rUID < this.grabRunningUID()) {
return;
}
this.writeLock.lock();
try {
this.runningUID.set(rUID);
} finally {
this.writeLock.unlock();
}
}
public int initUID() {
int ret = 0;
if (this.grabRunningUID() > 0) {
return this.grabRunningUID();
}
try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) {
final int[] ids = new int[4];
PreparedStatement ps = con.prepareStatement("SELECT MAX(uniqueid) FROM inventoryitems");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
ids[0] = rs.getInt(1) + 1;
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT MAX(petid) FROM pets");
rs = ps.executeQuery();
if (rs.next()) {
ids[1] = rs.getInt(1) + 1;
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT MAX(ringid) FROM rings");
rs = ps.executeQuery();
if (rs.next()) {
ids[2] = rs.getInt(1) + 1;
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT MAX(partnerringid) FROM rings");
rs = ps.executeQuery();
if (rs.next()) {
ids[3] = rs.getInt(1) + 1;
}
rs.close();
ps.close();
for (int i = 0; i < 4; ++i) {
if (ids[i] > ret) {
ret = ids[i];
}
}
con.close();
} catch (Exception e) {
e.printStackTrace();
FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e);
}
return ret;
}
}