package railo.runtime.db;
import java.sql.SQLException;
import java.util.Map;
import railo.runtime.op.Caster;
class OLDDCStack {
private Item item;
private Map transactionItem=null;
private DatasourceConnectionPool pool;
OLDDCStack(DatasourceConnectionPool pool) {
this.pool=pool;
}
public synchronized void add(int pid,DatasourceConnection dc){
if(pid==0)
item=new Item(item,dc);
else {
transactionItem.put(Caster.toInteger(pid), dc);
}
}
public synchronized DatasourceConnection get(int pid){
DatasourceConnection rtn;
if(pid!=0) {
rtn = (DatasourceConnection) transactionItem.remove(Caster.toInteger(pid));
if(rtn!=null) {
try {
if(!rtn.getConnection().isClosed())
return rtn;
}
catch (SQLException e) {}
}
}
if(item==null) return null;
rtn = item.dc;
item=item.prev;
try {
if(!rtn.getConnection().isClosed())
return rtn;
}
catch (SQLException e) {}
return null;
}
public synchronized boolean isEmpty(int pid){
return item==null&&!transactionItem.containsKey(Caster.toInteger(pid));
}
public synchronized boolean _isEmpty(int pid){
if(pid!=0) {
return transactionItem.containsKey(Caster.toInteger(pid));
}
return item==null;
}
public synchronized int size(){
int count=0;
Item i = item;
while(i!=null){
count++;
i=i.prev;
}
return count;
}
class Item {
private DatasourceConnection dc;
private Item prev;
private int count=1;
public Item(Item item,DatasourceConnection dc) {
this.prev=item;
this.dc=dc;
if(prev!=null)count=prev.count+1;
}
public String toString(){
return "("+prev+")<-"+count;
}
}
public synchronized void clear() {
try {
clear(item,null);
}
catch (SQLException e) {}
}
public synchronized void clear(int pid) {
DatasourceConnection dc = (DatasourceConnection) transactionItem.remove(Caster.toInteger(pid));
if(dc!=null)add(0, dc);
}
private void clear(Item current,Item next) throws SQLException {
if(current==null) return;
if((current.dc.isTimeout() || current.dc.getConnection().isClosed())) {
if(!current.dc.getConnection().isClosed()){
try {
current.dc.getConnection().close();
}
catch (SQLException e) {}
}
if(next==null)item=current.prev;
else {
next.prev=current.prev;
}
clear(current.prev,next);
}
else clear(current.prev,current);
}
/*public int inc() {
return ++count;
}
public boolean isWaiting() {
return count>0;
}
public int dec() {
return --count;
}*/
}