/******************************************************************************* * 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.sql.Connection; import java.sql.SQLException; import java.util.List; import org.apache.log4j.Logger; import at.bestsolution.persistence.java.DatabaseSupport; import at.bestsolution.persistence.java.DatabaseSupport.UpdateStatement; public class PreparedUpdateStatement extends PreparedStatement implements UpdateStatement { private final String tableName; private final String pkColumn; private final String lockColumn; static final Logger LOGGER = Logger.getLogger(PreparedStatement.class); public PreparedUpdateStatement(DatabaseSupport db, String tableName, String pkColumn, String lockColumn) { super(db); this.tableName = tableName; this.pkColumn = pkColumn; this.lockColumn = lockColumn; } protected String createSQL(String tableName, String pkColumn, String lockColumn, List<Column> columnList) { StringBuilder b = new StringBuilder(); if( lockColumn != null ) { b.append( '"' + correctCase(lockColumn) + '"' + " = " + '"' + correctCase(lockColumn) + '"' + " + 1"); } for (Column c : columnList) { if (b.length() != 0) { b.append("\n,"); } b.append('"' + correctCase(c.column) + '"' + " = ?"); } if( lockColumn != null ) { return "UPDATE " + '"' + correctCase(tableName) + '"' + " SET " + b + " WHERE " + '"' + correctCase(pkColumn) + '"' + " = ? AND " + '"' + correctCase(lockColumn) + '"'+ " = ?"; } return "UPDATE " + '"' + correctCase(tableName) + '"' + " SET " + b + " WHERE " + '"' + correctCase(pkColumn) + '"' + " = ?"; } @Override public boolean execute(Connection connection, long primaryKeyValue, long version) throws SQLException { String sql = createSQL(tableName, pkColumn, lockColumn, columnList); if (LOGGER.isDebugEnabled()) LOGGER.debug("Executing statement \n'"+sql+"'"); java.sql.PreparedStatement pstmt = connection.prepareStatement(sql); for( Column c : columnList ) { c.apply(pstmt); } pstmt.setLong(columnList.size()+1, primaryKeyValue); if( lockColumn != null ) { pstmt.setLong(columnList.size()+2, version); } return pstmt.executeUpdate() != 0; } }