package railo.runtime.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import railo.runtime.op.Caster;
/**
* wrap for datasorce and connection from it
*/
public final class DatasourceConnectionImpl implements DatasourceConnection {
//private static final int MAX_PS = 100;
private Connection connection;
private DataSource datasource;
private long time;
private String username;
private String password;
private int transactionIsolationLevel=-1;
private int requestId=-1;
private Boolean supportsGetGeneratedKeys;
/**
* @param connection
* @param datasource
* @param pass
* @param user
*/
public DatasourceConnectionImpl(Connection connection, DataSource datasource, String username, String password) {
this.connection = connection;
this.datasource = datasource;
this.time=System.currentTimeMillis();
this.username = username;
this.password = password;
if(username==null) {
this.username=datasource.getUsername();
this.password=datasource.getPassword();
}
if(this.password==null)this.password="";
}
@Override
public Connection getConnection() {
return connection;
}
@Override
public DataSource getDatasource() {
return datasource;
}
@Override
public boolean isTimeout() {
int timeout=datasource.getConnectionTimeout();
if(timeout <= 0) return false;
timeout*=60000;
return (time+timeout)<System.currentTimeMillis();
}
public DatasourceConnection using() {
time=System.currentTimeMillis();
return this;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
@Override
public boolean equals(Object obj) {
if(this==obj) return true;
if(!(obj instanceof DatasourceConnectionImpl)) return false;
return equals(this, (DatasourceConnection) obj);
/*if(!(obj instanceof DatasourceConnectionImpl)) return false;
DatasourceConnectionImpl other=(DatasourceConnectionImpl) obj;
if(!datasource.equals(other.datasource)) return false;
//print.out(username+".equals("+other.username+") && "+password+".equals("+other.password+")");
return username.equals(other.username) && password.equals(other.password);*/
}
public static boolean equals(DatasourceConnection left,DatasourceConnection right) {
if(!left.getDatasource().equals(right.getDatasource())) return false;
return left.getUsername().equals(right.getUsername()) && left.getPassword().equals(right.getPassword());
}
/**
* @return the transactionIsolationLevel
*/
public int getTransactionIsolationLevel() {
return transactionIsolationLevel;
}
public int getRequestId() {
return requestId;
}
public void setRequestId(int requestId) {
this.requestId=requestId;
}
@Override
public boolean supportsGetGeneratedKeys() {
if(supportsGetGeneratedKeys==null){
try {
supportsGetGeneratedKeys=Caster.toBoolean(getConnection().getMetaData().supportsGetGeneratedKeys());
} catch (Throwable t) {
return false;
}
}
return supportsGetGeneratedKeys.booleanValue();
}
//private Map<String,PreparedStatement> preparedStatements=new HashMap<String, PreparedStatement>();
@Override
public PreparedStatement getPreparedStatement(SQL sql, boolean createGeneratedKeys,boolean allowCaching) throws SQLException {
if(createGeneratedKeys) return getConnection().prepareStatement(sql.getSQLString(),Statement.RETURN_GENERATED_KEYS);
return getConnection().prepareStatement(sql.getSQLString());
}
/*public PreparedStatement getPreparedStatement(SQL sql, boolean createGeneratedKeys,boolean allowCaching) throws SQLException {
// create key
String strSQL=sql.getSQLString();
String key=strSQL.trim()+":"+createGeneratedKeys;
try {
key = MD5.getDigestAsString(key);
} catch (IOException e) {}
PreparedStatement ps = allowCaching?preparedStatements.get(key):null;
if(ps!=null) {
if(DataSourceUtil.isClosed(ps,true))
preparedStatements.remove(key);
else return ps;
}
if(createGeneratedKeys) ps= getConnection().prepareStatement(strSQL,Statement.RETURN_GENERATED_KEYS);
else ps=getConnection().prepareStatement(strSQL);
if(preparedStatements.size()>MAX_PS)
closePreparedStatements((preparedStatements.size()-MAX_PS)+1);
if(allowCaching)preparedStatements.put(key,ps);
return ps;
}*/
@Override
public PreparedStatement getPreparedStatement(SQL sql, int resultSetType,int resultSetConcurrency) throws SQLException {
return getConnection().prepareStatement(sql.getSQLString(),resultSetType,resultSetConcurrency);
}
/*
public PreparedStatement getPreparedStatement(SQL sql, int resultSetType,int resultSetConcurrency) throws SQLException {
boolean allowCaching=false;
// create key
String strSQL=sql.getSQLString();
String key=strSQL.trim()+":"+resultSetType+":"+resultSetConcurrency;
try {
key = MD5.getDigestAsString(key);
} catch (IOException e) {}
PreparedStatement ps = allowCaching?preparedStatements.get(key):null;
if(ps!=null) {
if(DataSourceUtil.isClosed(ps,true))
preparedStatements.remove(key);
else return ps;
}
ps=getConnection().prepareStatement(strSQL,resultSetType,resultSetConcurrency);
if(preparedStatements.size()>MAX_PS)
closePreparedStatements((preparedStatements.size()-MAX_PS)+1);
if(allowCaching)preparedStatements.put(key,ps);
return ps;
}
*/
@Override
public void close() throws SQLException {
//closePreparedStatements(-1);
getConnection().close();
}
/*public void closePreparedStatements(int maxDelete) throws SQLException {
Iterator<Entry<String, PreparedStatement>> it = preparedStatements.entrySet().iterator();
int count=0;
while(it.hasNext()){
try {
Entry<String, PreparedStatement> entry = it.next();
entry.getValue().close();
it.remove();
if(maxDelete!=0 && ++count>=maxDelete) break;
}
catch (SQLException e) {}
}
}*/
/*protected void finalize() throws Throwable {
try {
close(); // close open files
} finally {
super.finalize();
}
}*/
}