package com.enioka.jqm.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbImplOracle implements DbAdapter
{
private final static String[] IDS = new String[] { "ID" };
private Map<String, String> queries = new HashMap<String, String>();
@Override
public boolean compatibleWith(String product)
{
return product.contains("oracle");
}
@Override
public void prepare(Connection cnx)
{
queries.putAll(DbImplBase.queries);
for (Map.Entry<String, String> entry : DbImplBase.queries.entrySet())
{
queries.put(entry.getKey(), this.adaptSql(entry.getValue()));
}
queries.put("ji_update_poll",
"UPDATE tmpjqm.JOB_INSTANCE j1 SET NODE=?, STATUS='ATTRIBUTED', DATE_ATTRIBUTION=CURRENT_TIMESTAMP WHERE rowid IN (SELECT rid FROM (SELECT rowid as rid FROM tmpjqm.JOB_INSTANCE j2 WHERE j2.STATUS='SUBMITTED' AND j2.QUEUE=? AND (j2.HIGHLANDER=0 OR (j2.HIGHLANDER=1 AND (SELECT COUNT(1) FROM tmpjqm.JOB_INSTANCE j3 WHERE j3.STATUS IN('ATTRIBUTED', 'RUNNING') AND j3.JOBDEF=j2.JOBDEF)=0)) ORDER BY INTERNAL_POSITION) WHERE rownum < ?)");
}
@Override
public String adaptSql(String sql)
{
return sql.replace("MEMORY TABLE", "TABLE").replace(" INTEGER", " NUMBER(10, 0)").replace(" DOUBLE", " DOUBLE PRECISION")
.replace("UNIX_MILLIS()", "JQM_PK.currval").replace("IN(UNNEST(?))", "IN(?)")
.replace("CURRENT_TIMESTAMP - 1 MINUTE", "(SYSDATE - 1/1440)").replace("FROM (VALUES(0))", "FROM DUAL")
.replace("BOOLEAN", "NUMBER(1)").replace("true", "1").replace("false", "0");
}
@Override
public String getSqlText(String key)
{
return queries.get(key);
}
@Override
public String[] keyRetrievalColumn()
{
return IDS;
}
@Override
public List<String> preSchemaCreationScripts()
{
return new ArrayList<String>();
}
@Override
public void beforeUpdate(Connection cnx, QueryPreparation q)
{
return;
}
@Override
public void setNullParameter(int position, PreparedStatement s) throws SQLException
{
// Absolutely stupid: set to null regardless of type.
s.setObject(position, null);
}
@Override
public String paginateQuery(String sql, int start, int stopBefore, List<Object> prms)
{
int pageSize = stopBefore - start;
sql = String.format("SELECT * FROM ( SELECT /*+ FIRST_ROWS(?) */ a.*, ROWNUM rnum FROM (%s) a WHERE ROWNUM < ?) WHERE RNUM >= ?",
sql);
prms.add(0, pageSize);
prms.add(stopBefore);
prms.add(start + 1);
return sql;
}
}