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 DbImplPg implements DbAdapter
{
private final static String[] IDS = new String[] { "id" };
private Map<String, String> queries = new HashMap<String, String>();
@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()));
}
}
@Override
public String getSqlText(String key)
{
return queries.get(key);
}
@Override
public String adaptSql(String sql)
{
return sql.replace("MEMORY TABLE", "TABLE").replace("JQM_PK.nextval", "nextval('JQM_PK')").replace(" DOUBLE", " DOUBLE PRECISION")
.replace("UNIX_MILLIS()", "extract('epoch' from current_timestamp)*1000").replace("IN(UNNEST(?))", "=ANY(?)")
.replace("CURRENT_TIMESTAMP - 1 MINUTE", "NOW() - INTERVAL '1 MINUTES'").replace("FROM (VALUES(0))", "");
}
@Override
public boolean compatibleWith(String product)
{
return product.contains("postgresql");
}
@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
{
s.setNull(position, s.getParameterMetaData().getParameterType(position));
}
@Override
public String paginateQuery(String sql, int start, int stopBefore, List<Object> prms)
{
int pageSize = stopBefore - start;
sql = String.format("%s LIMIT ? OFFSET ?", sql);
prms.add(pageSize);
prms.add(start);
return sql;
}
}