preparing new release
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / util / sql / SQLInstructionBuilder.java
diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/util/sql/SQLInstructionBuilder.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/util/sql/SQLInstructionBuilder.java
new file mode 100644 (file)
index 0000000..63ae94e
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * 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;
+               }
+       }
+
+}