/*******************************************************************************
* Copyright (c) 2014 BestSolution.at and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
*******************************************************************************/
package at.bestsolution.persistence.java.spi;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import at.bestsolution.persistence.DynamicSelectQuery;
import at.bestsolution.persistence.MappedQuery;
import at.bestsolution.persistence.MappedUpdateQuery;
import at.bestsolution.persistence.PersistanceException;
import at.bestsolution.persistence.java.DatabaseSupport;
import at.bestsolution.persistence.java.JavaObjectMapper;
import at.bestsolution.persistence.java.internal.PreparedExtendsInsertStatement;
import at.bestsolution.persistence.java.internal.PreparedInsertStatement;
import at.bestsolution.persistence.java.internal.PreparedUpdateStatement;
import at.bestsolution.persistence.java.query.DynamicListDelegate;
import at.bestsolution.persistence.java.query.DynamicSelectQueryImpl;
import at.bestsolution.persistence.java.query.ListDelegate;
import at.bestsolution.persistence.java.query.MappedQueryImpl;
import at.bestsolution.persistence.java.query.MappedUpdateQueryImpl;
import at.bestsolution.persistence.java.query.UpdateDelegate;
public class H2DatabaseSupport implements DatabaseSupport {
@Override
public Timestamp getServerTime(Connection connection) {
PreparedStatement prepareStatement = null;
ResultSet set = null;
try {
prepareStatement = connection.prepareStatement("SELECT CURRENT_TIMESTAMP");
set = prepareStatement.executeQuery();
if( set.next() ) {
return set.getTimestamp(1);
}
} catch (SQLException e) {
throw new PersistanceException(e);
} finally {
if( set != null ) {
try {
set.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if( prepareStatement != null ) {
try {
prepareStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
@Override
public String getDatabaseType() {
return "h2";
}
@Override
public QueryBuilder createQueryBuilder(JavaObjectMapper<?> rootMapper, String tableName) {
return null;
}
@Override
public PrimaryKeyGenType getPrimaryKeyType() {
return PrimaryKeyGenType.AUTO;
}
@Override
public boolean isArrayStoreSupported(Class<?> type) {
return false;
}
public boolean isNestedResultSetsSupported() {
return false;
}
@Override
public boolean isDefaultLowerCase() {
return false;
}
@Override
public <O> MappedQuery<O> createMappedQuery(JavaObjectMapper<?> rootMapper, String rootPrefix, ListDelegate<O> listDelegate) {
return new H2MappedQueryImpl<O>(this,rootMapper, rootPrefix, listDelegate);
}
@Override
public <T, O> DynamicSelectQuery<T, O> createMappedSelectQuery(
JavaObjectMapper<?> rootMapper, String rootPrefix,
DynamicListDelegate<T, O> listDelegate) {
return new H2SelectQueryImpl<T,O>(this,rootMapper,rootPrefix,listDelegate);
}
@Override
public <O> MappedUpdateQuery<O> createMappedUpdateQuery(JavaObjectMapper<O> rootMapper, String rootPrefix, UpdateDelegate<O> updateDelegate) {
return new H2MappedUpdateQueryImpl<O>(this,rootMapper, rootPrefix, updateDelegate);
}
static class H2MappedUpdateQueryImpl<O> extends MappedUpdateQueryImpl<O> {
public H2MappedUpdateQueryImpl(DatabaseSupport db,JavaObjectMapper<O> rootMapper, String rootPrefix, UpdateDelegate<O> updateDelegate) {
super(db,rootMapper, rootPrefix, updateDelegate);
}
@Override
public String processSQL(String sql) {
return sql;
}
}
static class H2MappedQueryImpl<O> extends MappedQueryImpl<O> {
public H2MappedQueryImpl(DatabaseSupport db,JavaObjectMapper<?> rootMapper,
String rootPrefix, ListDelegate<O> listDelegate) {
super(db,rootMapper, rootPrefix, listDelegate);
}
@Override
public String processSQL(String sql) {
if( getMaxRows() != -1 ) {
sql = sql + " LIMIT " + getMaxRows();
}
return sql;
}
}
static class H2SelectQueryImpl<T,O> extends DynamicSelectQueryImpl<T,O> {
public H2SelectQueryImpl(DatabaseSupport db,JavaObjectMapper<?> rootMapper,
String rootPrefix, DynamicListDelegate<T,O> listDelegate) {
super(db,rootMapper, rootPrefix, listDelegate);
}
@Override
public String processSQL(String sql) {
if( getMaxRows() != -1 ) {
sql = sql + " LIMIT " + getMaxRows();
}
return sql;
}
}
static class H2QueryBuilder implements QueryBuilder {
private final String tableName;
private final DatabaseSupport db;
public H2QueryBuilder(DatabaseSupport db, String tableName) {
this.db = db;
this.tableName = tableName;
}
@Override
public UpdateStatement createUpdateStatement(String pkColumn, String lockColumn) {
return new PreparedUpdateStatement(db, tableName, pkColumn, lockColumn);
}
@Override
public InsertStatement createInsertStatement(String pkColumn,
String primaryKeyExpression, String lockColumn) {
return new PreparedInsertStatement(db, tableName, pkColumn, primaryKeyExpression, lockColumn);
}
@Override
public ExtendsInsertStatement createExtendsInsertStatement(String pkColumn) {
return new PreparedExtendsInsertStatement(db,pkColumn, pkColumn);
}
}
}