117 lines
3.4 KiB
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;
|
|
}
|
|
|
|
}
|