/* * Created on 12.08.2004 * */ package com.quantum.util.sql; import java.sql.SQLException; import com.quantum.adapters.DatabaseAdapter; import com.quantum.model.Bookmark; import com.quantum.model.Column; import com.quantum.model.Entity; import com.quantum.model.NotConnectedException; import com.quantum.util.StringMatrix; /** * Functions to build SQL instructions adapted to the particular database * * @author Julen */ public class SQLInstructionBuilder { /** * Generates an Insert SQL instruction for each row of data in an StrigMatrix * @param entity The entity to generate the instruction for * @param columns A StringMatrix holding the names and values of the columns to insert * @return A String with the insert sentences generated */ public static String buildInsert(Entity entity, StringMatrix columns) { if (entity == null || columns == null ) return ""; StringBuffer valuesClause = new StringBuffer(); StringBuffer namesClause = new StringBuffer(); String insertSentences = ""; // We generate an update sentence for each row in the StringMatrix for (int iRow = 0; iRow < columns.size(); iRow++) { for (int iCol = 0; iCol < columns.getNumColumns(); iCol++) { if (iCol > 0) { namesClause.append(", "); //$NON-NLS-1$ valuesClause.append(", "); //$NON-NLS-1$ } namesClause.append(columns.getHeaderColumn(iCol)); valuesClause.append(quoteValue( entity, columns.getHeaderColumn(iCol), columns.get(iCol, iRow))); } if (iRow > 0) insertSentences += ";\n"; insertSentences += "INSERT INTO " + entity.getQuotedTableName(); //$NON-NLS-1$ insertSentences += "(" + namesClause + " )"; //$NON-NLS-1$ insertSentences += " VALUES " + " ( " + valuesClause + " )" ; //$NON-NLS-1$ } return insertSentences; } /** * Generates an UPDATE SQL instruction for each row of data in an StrigMatrix * @param entity The entity to generate the instruction for * @param columns A StringMatrix holding the names and values of the columns to insert * @param key A StringMatrix holding the names and values of the columns of the key * @return A String with the insert sentences generated */ public static String buildUpdate(Entity entity, StringMatrix columns, StringMatrix key) { if (entity == null || columns == null ) return ""; StringBuffer setClause = new StringBuffer(); String whereClause = ""; String updateSentences = ""; // We generate an update sentence for each row in the StringMatrix for (int iRow = 0; iRow < columns.size(); iRow++) { for (int iCol = 0; iCol < columns.getNumColumns(); iCol++) { if (iCol > 0) setClause.append(", "); //$NON-NLS-1$ setClause.append(columns.getHeaderColumn(iCol)); setClause.append(" = "); //$NON-NLS-1$ setClause.append(quoteValue( entity, columns.getHeaderColumn(iCol), columns.get(iCol, iRow))); } if (key != null && iRow < key.size()) { whereClause = getWhereClause(entity, key, iRow); } if (iRow > 0) updateSentences += ";\n"; updateSentences += "UPDATE " + entity.getQuotedTableName(); //$NON-NLS-1$ updateSentences += " SET " + setClause.toString(); //$NON-NLS-1$ if (whereClause.length() > 0) updateSentences += " WHERE " + whereClause; //$NON-NLS-1$ } return updateSentences; } /** * @param entity * @param key * @return */ public static String buildDelete(Entity entity, StringMatrix key) { if (entity == null ) return ""; String deleteSentences = ""; String whereClause = ""; // We generate an update sentence for each row in the StringMatrix if (key == null) return "DELETE FROM " + entity.getQuotedTableName(); //$NON-NLS-1$ for (int iRow = 0; iRow < key.size(); iRow++) { if (key != null && iRow < key.size()) { whereClause = getWhereClause(entity, key, iRow); } if (iRow > 0) deleteSentences += ";\n"; deleteSentences += "DELETE FROM " + entity.getQuotedTableName(); //$NON-NLS-1$ if (whereClause.length() > 0) deleteSentences += " WHERE " + whereClause; //$NON-NLS-1$ } return deleteSentences; } /** * Builds a Select query with all columns and no rows (useful for structure querying) * @param entity * @return */ public static String buildSelectAllColumnsNoRows(Entity entity) { return "SELECT * FROM " + entity.getQuotedTableName() + " WHERE (1 = 0)"; //$NON-NLS-1$ //$NON-NLS-2$ } /** * Builds a Select query with all columns and no rows (useful for structure querying) * @param entity * @return */ public static String buildSelectAllColumnsAllRows(Entity entity) { return "SELECT * FROM " + entity.getQuotedTableName() ; //$NON-NLS-1$ //$NON-NLS-2$ } /** * Builds a Select query with the selected columns and the selected rows (useful for structure querying) * @param entity * @param columns Selected columns. * @param key Selected key and values, in row 0. Only 1 select query will be generated. * @return */ public static String buildSelect(Entity entity, Column[] columns, StringMatrix key) { if (entity == null || columns == null ) return ""; StringBuffer columnsList = new StringBuffer(); String whereClause = ""; String selectQuery = ""; for (int iCol = 0; iCol < columns.length; iCol++) { if (iCol > 0) columnsList.append(", "); //$NON-NLS-1$ columnsList.append(columns[iCol].getName()); } if (key != null) { whereClause = getWhereClause(entity, key, 0); } selectQuery += "SELECT " + columnsList; //$NON-NLS-1$ selectQuery += " FROM " + entity.getQuotedTableName(); //$NON-NLS-1$ if (whereClause.length() > 0) selectQuery += " WHERE " + whereClause; //$NON-NLS-1$ return selectQuery; } /** * @param entity The entity to get the where clause for * @param key A StringMatrix with the colums that form the key and rows with the values * @param iRow The key to the row that contains the values we are interested in * @return A String with where clause (without the 'WHERE' reserved word), adapted to the database of the entity */ public static String getWhereClause(Entity entity, StringMatrix key, int iRow) { StringBuffer whereClause = new StringBuffer(); for (int iKey = 0; iKey < key.getNumColumns(); iKey++) { if (iKey > 0) whereClause.append(" AND "); //$NON-NLS-1$ whereClause.append("("); //$NON-NLS-1$ whereClause.append(key.getHeaderColumn(iKey)); whereClause.append(" = "); //$NON-NLS-1$ whereClause.append(quoteValue( entity, key.getHeaderColumn(iKey), key.get(iKey, iRow))); whereClause.append(")"); //$NON-NLS-1$ } return whereClause.toString(); } /** * Default-value function. * Generates a whereClause adapted to the entity´s database * with the data of the first row of the StringMatrix (row 0). * @see com.quantum.util.sql.SQLInstructionBuilder#getWhereClause */ public static String getWhereClause(Entity entity, StringMatrix key) { return getWhereClause(entity, key, 0); } /** * Quotes the 'value' according with the type of the column and the database * @param entity Entity * @param columnName Name of the column in the Entity * @param value Value of the column, to be quoted */ public static String quoteValue(Entity entity, String columnName, String value) { Bookmark bookmark = entity.getBookmark(); DatabaseAdapter adapter = bookmark.getAdapter(); if (adapter != null && entity != null && getColumn(entity, columnName) != null) { Column column = getColumn(entity, columnName); return adapter.quote(value, column.getType(), column.getTypeName()); } else { return value; } } /** * Wrapper function to avoid exception handling * @param entity The entity that has the column * @param columnName The column name * @return A Column object from that entity, with the given name. null if not found or not connected. */ public static Column getColumn(Entity entity, String columnName) { try { return entity == null ? null : entity.getColumn(columnName); } catch (NotConnectedException e) { return null; } catch (SQLException e) { return null; } } }