/******************************************************************************* * 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.internal; import java.math.BigDecimal; import java.sql.Blob; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.log4j.Logger; import at.bestsolution.persistence.java.DatabaseSupport; import at.bestsolution.persistence.java.DatabaseSupport.Statement; import at.bestsolution.persistence.java.query.JDBCType; public class PreparedStatement implements Statement { static final Logger LOGGER = Logger.getLogger(PreparedStatement.class); protected final List<Column> columnList = new ArrayList<Column>(); private final DatabaseSupport db; /** * */ public PreparedStatement(DatabaseSupport db) { this.db = db; } @Override public void addInt(String column, int value) { columnList.add(new IntColumn(columnList.size(), column, value)); } @Override public void addInt(String column, Integer value) { if( value == null ) { addNull(column, JDBCType.INT); } else { addInt(column, value.intValue()); } } @Override public void addDouble(String column, double value) { columnList.add(new DoubleColumn(columnList.size(), column, value)); } @Override public void addDouble(String column, Double value) { if( value == null ) { addNull(column, JDBCType.DOUBLE); } else { addDouble(column, value.doubleValue()); } } @Override public void addString(String column, String value) { columnList.add(new StringColumn(columnList.size(), column, value)); } @Override public void addNull(String column, JDBCType type) { columnList.add(new NullColumn(columnList.size(), column, type)); } @Override public void addBoolean(String column, boolean value) { columnList.add(new BooleanColumn(columnList.size(), column, value)); } @Override public void addBoolean(String column, Boolean value) { if( value == null ) { addNull(column, JDBCType.BOOLEAN); } else { addBoolean(column, value.booleanValue()); } } @Override public void addTimestamp(String column, Date value) { if( value == null ) { columnList.add(new NullColumn(columnList.size(), column, JDBCType.TIMESTAMP)); } else { columnList.add(new TimestampColumn(columnList.size(), column, value)); } } @Override public void addBigDecimal(String column, BigDecimal value) { if( value == null ) { columnList.add(new NullColumn(columnList.size(), column, JDBCType.DOUBLE)); } else { columnList.add(new BigDecimalColumn(columnList.size(), column, value)); } } @Override public void addLong(String column, long value) { columnList.add(new LongColumn(columnList.size(), column, value)); } @Override public void addLong(String column, Long value) { if( value == null ) { addNull(column, JDBCType.LONG); } else { addLong(column, value.longValue()); } } @Override public void addEnum(String column, Enum<?> value) { columnList.add(new StringColumn(columnList.size(), column, value.name())); } @Override public void addBlob(String column, Blob value) { columnList.add(new BlobColumn(columnList.size(), column, value)); } public static abstract class Column { protected final String column; protected final int index; public Column(int index, String column) { this.index = index; this.column = column; } public abstract void apply(java.sql.PreparedStatement pstmt) throws SQLException; } static class BigDecimalColumn extends Column { private final BigDecimal value; public BigDecimalColumn(int index, String column, BigDecimal value) { super(index, column); this.value = value; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => " + value); pstmt.setBigDecimal(index+1, value); } } static class DoubleColumn extends Column { private final double value; public DoubleColumn(int index, String column, double value) { super(index, column); this.value = value; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => " + value); pstmt.setDouble(index+1, value); } } static class IntColumn extends Column { private final int value; public IntColumn(int index, String column, int value) { super(index, column); this.value = value; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => " + value); pstmt.setInt(index+1, value); } } static class LongColumn extends Column { private final long value; public LongColumn(int index, String column, long value) { super(index, column); this.value = value; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => " + value); pstmt.setLong(index+1, value); } } static class BooleanColumn extends Column { private final boolean value; public BooleanColumn(int index, String column, boolean value) { super(index, column); this.value = value; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => " + value); pstmt.setBoolean(index+1, value); } } static class TimestampColumn extends Column { private final Date value; public TimestampColumn(int index, String column, Date value) { super(index, column); this.value = value; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => " + value); pstmt.setTimestamp(index+1, new Timestamp(value.getTime())); } } static class StringColumn extends Column { private final String value; public StringColumn(int index, String column, String value) { super(index, column); this.value = value; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => " + value); pstmt.setString(index+1, value); } } static class NullColumn extends Column { private final JDBCType type; public NullColumn(int index, String column, JDBCType type) { super(index, column); this.type = type; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => null"); pstmt.setObject(index+1, null); } } static class BlobColumn extends Column { private final Blob blob; public BlobColumn(int index, String column, Blob blob) { super(index, column); this.blob = blob; } @Override public void apply(java.sql.PreparedStatement pstmt) throws SQLException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Parameter " + (index+1) + " => Blob(" + blob.length() + ")"); pstmt.setBlob(index+1, blob); } } protected final String correctCase(String value) { return db.isDefaultLowerCase() ? value.toLowerCase() : value.toUpperCase(); } }