/******************************************************************************* * Copyright © 2011, 2013 IBM Corporation 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: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.ide.ui.internal.quickfix.proposals.sql; import java.util.List; import org.eclipse.edt.ide.sql.SQLConstants; import org.eclipse.edt.ide.ui.internal.editor.sql.SQLIOStatementUtility; import org.eclipse.edt.mof.egl.Field; import org.eclipse.edt.mof.egl.Member; public class EGLSQLGetByKeyForUpdateStatementFactory extends EGLSQLDeclareStatementFactory { String forUpdateOfClause = null; String[] columnsExcludingReadOnlyAndKeys = null; public EGLSQLGetByKeyForUpdateStatementFactory( Member recordBinding, String ioObjectName, List userDefinedIntoItemNames, String[][] keyItemAndColumnNames, boolean isDynamicArrayRecord) { super(recordBinding, ioObjectName, userDefinedIntoItemNames, keyItemAndColumnNames, isDynamicArrayRecord); } public EGLSQLGetByKeyForUpdateStatementFactory(Member recordBinding, String ioObjectName) { super(recordBinding, ioObjectName, null, null, false); } @Override public String buildDefaultSQLStatement() { // Call super to build the default select, into, from and where clauses. super.buildDefaultSQLStatement(); if (sqlStatement != null) { // Add the for update of clause which consists of a list of columns that excludes readonly and key // columns. columnsExcludingReadOnlyAndKeys = getColumnsExcludingReadOnlyAndKeys(); if (columnsExcludingReadOnlyAndKeys != null) { forUpdateOfClause = EGLSQLClauseFactory.createDefaultForUpdateOfClause(columnsExcludingReadOnlyAndKeys); if (forUpdateOfClause != null) { sqlStatement = sqlStatement + forUpdateOfClause; } } } return sqlStatement; } private String[] getColumnsExcludingReadOnlyAndKeys() { String[] columns = new String[numSQLDataItems]; int numNonReadOnlyAndKeys = 0; if (structureItemBindings != null) { String columnName; boolean isReadOnly; for (Field itemBinding : structureItemBindings) { columnName = getColumnName(itemBinding); isReadOnly = getIsReadOnly(itemBinding); if (!(isReadOnly || isKey(itemBinding))) { columns[numNonReadOnlyAndKeys] = columnName; numNonReadOnlyAndKeys++; } } } if (numNonReadOnlyAndKeys != 0) { String[] readWriteColumns = new String[numNonReadOnlyAndKeys]; for (int i = 0; i < numNonReadOnlyAndKeys; i++) { readWriteColumns[i] = columns[i]; } return readWriteColumns; } return null; } public String getForUpdateOfClause() { return forUpdateOfClause; } @Override public String getIOType() { return SQLConstants.GET_FORUPDATE_IO_TYPE.toUpperCase(); } @Override protected boolean isIoObjectValid() { boolean isValid = super.isIoObjectValid(); // SQL record must NOT be defined with more than one table (join) and must be defined with at least one // column that is not a key and not read only. if (!validateSQLRecordNotJoinAndContainsOneNonReadOnlyOrNonKeyColumn()) { isValid = false; } return isValid; } private boolean isKey(Field itemBinding) { if (useRecordKeys) { return isRecordKeyItem(itemBinding); } else { return isUsingKeyColumn(itemBinding); } } private boolean isUsingKeyColumn(Field itemBinding) { return SQLIOStatementUtility.isUsingKeyColumn(itemBinding, keyItemAndColumnNames, getSQLRecordTypeBinding()); } @Override protected boolean containsOnlyKeyOrReadOnlyColumns() { if (!useRecordKeys) { return SQLIOStatementUtility.containsOnlyKeyOrReadOnlyColumns(getSQLRecordTypeBinding(), keyItemAndColumnNames); } return false; } }