Author: aadamchik
Date: Wed Sep 13 20:25:56 2006
New Revision: 443207

URL: http://svn.apache.org/viewvc?view=rev&rev=443207
Log:
CAY-655 - 2.0 branch

Modified:
    
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java

Modified: 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java?view=diff&rev=443207&r1=443206&r2=443207
==============================================================================
--- 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java
 (original)
+++ 
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java
 Wed Sep 13 20:25:56 2006
@@ -16,8 +16,6 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-
-
 package org.apache.cayenne.dba.db2;
 
 import java.sql.Connection;
@@ -25,6 +23,7 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -36,167 +35,185 @@
 import org.apache.cayenne.map.DbEntity;
 
 /**
- * PK Generator for IBM DB2 using sequences.
+ * A sequence-based PK generator used by [EMAIL PROTECTED] DB2Adapter}.
  * 
- * @author Mario Linke, Holger Hoffstaette
+ * @author Andrus Adamchik
  */
 public class DB2PkGenerator extends JdbcPkGenerator {
 
-       public static final String SEQUENCE_PREFIX = "S_";
+    private static final String _SEQUENCE_PREFIX = "S_";
 
-       public void createAutoPk(DataNode node, List dbEntities) throws 
Exception {
-               List sequences = this.getExistingSequences(node);
-               Iterator it = dbEntities.iterator();
-
-               while (it.hasNext()) {
-                       DbEntity ent = (DbEntity) it.next();
-                       if (!sequences.contains(sequenceName(ent))) {
-                               this.runUpdate(node, 
this.createSequenceString(ent));
-                       }
-               }
-       }
-
-       public List createAutoPkStatements(List dbEntities) {
-               List list = new ArrayList();
-               Iterator it = dbEntities.iterator();
-
-               while (it.hasNext()) {
-                       DbEntity ent = (DbEntity) it.next();
-                       list.add(this.createSequenceString(ent));
-               }
-
-               return list;
-       }
-       
-       public void dropAutoPk(DataNode node, List dbEntities) throws Exception 
{
-               List sequences = this.getExistingSequences(node);
-               
-               Iterator it = dbEntities.iterator();
-               while (it.hasNext()) {
-                       DbEntity ent = (DbEntity) it.next();
-                       if (sequences.contains(this.sequenceName(ent))) {
-                               this.runUpdate(node, 
this.dropSequenceString(ent));
-                       }
-               }
-       }
-
-       public List dropAutoPkStatements(List dbEntities) {
-                List list = new ArrayList();
-                Iterator it = dbEntities.iterator();
-
-                while (it.hasNext()) {
-                        DbEntity ent = (DbEntity) it.next();
-                        list.add(this.dropSequenceString(ent));
-                }
-
-                return list;
-        }      
-       
-       /**
-        * Returns the sequence name for a given table name.
-        */
-       protected String sequenceName(DbEntity ent) {
-               String seqName = SEQUENCE_PREFIX + ent.getName();
-
-               if (ent.getSchema() != null && ent.getSchema().length() > 0) {
-                       seqName = ent.getSchema() + "." + seqName;
-               }
-
-               return seqName;
-       }       
-       
-       
-       /**
-        * Creates SQL needed for creating a sequence.
-        */
-       protected String createSequenceString(DbEntity ent) {
-               StringBuffer buf = new StringBuffer();
-               buf.append("CREATE SEQUENCE ")
-                       .append(this.sequenceName(ent))
-                       .append(" START WITH 200")
-                       .append(" INCREMENT BY ").append(getPkCacheSize())
-                       .append(" NO MAXVALUE ")
-                       .append(" NO CYCLE ")
-                       .append(" CACHE ").append(getPkCacheSize());
-               return buf.toString();
-       }       
-       
-       /**
-        * Creates SQL needed for dropping a sequence.
-        */
-       protected String dropSequenceString(DbEntity ent) {
-               return "DROP SEQUENCE " + this.sequenceName(ent) + " RESTRICT ";
-       }
-       
-       /**
-        * Creates a new PK from a sequence returned by
-        * <code>
-        * SELECT NEXTVAL FOR sequence_name FROM SYSIBM.SYSDUMMY1 
-        * </code>
-        * SYSIBM.SYSDUMMY1 corresponds to DUAL in Oracle.
-        */
-       protected int pkFromDatabase(DataNode node, DbEntity ent) throws 
Exception {
-
-               String seq_name = sequenceName (ent);
-               Connection con = node.getDataSource().getConnection();
-               try {
-                 Statement st = con.createStatement();
-                 try {
-                       String pkQueryString = "SELECT NEXTVAL FOR "
-                                                                       + 
seq_name
-                                                                       + " 
FROM SYSIBM.SYSDUMMY1";
-                       QueryLogger.logQuery(pkQueryString, 
Collections.EMPTY_LIST);
-                       ResultSet rs = st.executeQuery(pkQueryString);
-                       try {
-                         if (!rs.next()) {
-                               throw new CayenneRuntimeException(
-                                       "Error in pkFromDatabase() for table "
-                                       + ent.getName()
-                                       + " / sequence "
-                                       + seq_name);
-                         }
-                         return rs.getInt(1);
-                       } finally {
-                         rs.close();
-                       }
-                 } finally {
-                       st.close();
-                 }
-               } finally {
-                 con.close();
-               }
-       }       
-       
-       
-       /**
-        * Returns a List of all existing, accessible sequences.
-        */
-       protected List getExistingSequences(DataNode node) throws SQLException {
-               Connection con = node.getDataSource().getConnection();
-               try {
-                       Statement sel = con.createStatement();
-                       try {
-                               StringBuffer q = new StringBuffer();
-                               q.append("SELECT SEQNAME FROM SYSCAT.SEQUENCES 
WHERE SEQNAME")
-                                       .append(" LIKE '")
-                                       .append(SEQUENCE_PREFIX)
-                                       .append("%'");
-
-                               ResultSet rs = sel.executeQuery(q.toString());
-                               try {
-                                       List sequenceList = new ArrayList(32);
-                                       while (rs.next()) {
-                                               
sequenceList.add(rs.getString(1));
-                                       }
-                                       return sequenceList;
-                               } finally {
-                                       rs.close();
-                               }
-                       } finally {
-                               sel.close();
-                       }
-               } finally {
-                       con.close();
-               }
-       }       
+    /**
+     * @deprecated since 2.0 - other generators do not expose the default 
prefix.
+     */
+    public static final String SEQUENCE_PREFIX = "S_";
+
+    protected int pkFromDatabase(DataNode node, DbEntity ent) throws Exception 
{
+
+        String pkGeneratingSequenceName = sequenceName(ent);
+
+        Connection con = node.getDataSource().getConnection();
+        try {
+            Statement st = con.createStatement();
+            try {
+                String sql = "SELECT NEXTVAL FOR "
+                        + pkGeneratingSequenceName
+                        + " FROM SYSIBM.SYSDUMMY1";
+                QueryLogger.logQuery(sql, Collections.EMPTY_LIST);
+                ResultSet rs = st.executeQuery(sql);
+                try {
+                    // Object pk = null;
+                    if (!rs.next()) {
+                        throw new CayenneRuntimeException(
+                                "Error generating pk for DbEntity " + 
ent.getName());
+                    }
+                    return rs.getInt(1);
+                }
+                finally {
+                    rs.close();
+                }
+            }
+            finally {
+                st.close();
+            }
+        }
+        finally {
+            con.close();
+        }
+    }
+
+    public void createAutoPk(DataNode node, List dbEntities) throws Exception {
+        Collection sequences = getExistingSequences(node);
+        Iterator it = dbEntities.iterator();
+
+        while (it.hasNext()) {
+            DbEntity entity = (DbEntity) it.next();
+            if (!sequences.contains(sequenceName(entity))) {
+                this.runUpdate(node, createSequenceString(entity));
+            }
+        }
+    }
+
+    /**
+     * Creates a list of CREATE SEQUENCE statements for the list of DbEntities.
+     */
+    public List createAutoPkStatements(List dbEntities) {
+        List list = new ArrayList(dbEntities.size());
+        Iterator it = dbEntities.iterator();
+
+        while (it.hasNext()) {
+            DbEntity ent = (DbEntity) it.next();
+            list.add(createSequenceString(ent));
+        }
+
+        return list;
+    }
+
+    /**
+     * Drops PK sequences for all specified DbEntities.
+     */
+    public void dropAutoPk(DataNode node, List dbEntities) throws Exception {
+        Collection sequences = getExistingSequences(node);
+
+        Iterator it = dbEntities.iterator();
+        while (it.hasNext()) {
+            DbEntity ent = (DbEntity) it.next();
+            if (sequences.contains(sequenceName(ent))) {
+                runUpdate(node, dropSequenceString(ent));
+            }
+        }
+    }
+
+    /**
+     * Creates a list of DROP SEQUENCE statements for the list of DbEntities.
+     */
+    public List dropAutoPkStatements(List dbEntities) {
+
+        List list = new ArrayList(dbEntities.size());
+        Iterator it = dbEntities.iterator();
+
+        while (it.hasNext()) {
+            DbEntity entity = (DbEntity) it.next();
+            list.add(dropSequenceString(entity));
+        }
+
+        return list;
+    }
+
+    /**
+     * Fetches a list of existing sequences that might match Cayenne generated 
ones.
+     */
+    protected List getExistingSequences(DataNode node) throws SQLException {
+
+        // check existing sequences
+        Connection con = node.getDataSource().getConnection();
+
+        try {
+            Statement sel = con.createStatement();
+            try {
+                StringBuffer buffer = new StringBuffer();
+                buffer.append("SELECT SEQNAME FROM SYSCAT.SEQUENCES ").append(
+                        "WHERE SEQNAME LIKE 
'").append(_SEQUENCE_PREFIX).append("%'");
+
+                String sql = buffer.toString();
+                QueryLogger.logQuery(sql, Collections.EMPTY_LIST);
+                ResultSet rs = sel.executeQuery(sql);
+                try {
+                    List sequenceList = new ArrayList();
+                    while (rs.next()) {
+                        sequenceList.add(rs.getString(1));
+                    }
+                    return sequenceList;
+                }
+                finally {
+                    rs.close();
+                }
+            }
+            finally {
+                sel.close();
+            }
+        }
+        finally {
+            con.close();
+        }
+    }
+
+    /**
+     * Returns default sequence name for DbEntity.
+     */
+    protected String sequenceName(DbEntity entity) {
+
+        String entName = entity.getName();
+        String seqName = _SEQUENCE_PREFIX + entName.toLowerCase();
+
+        if (entity.getSchema() != null && entity.getSchema().length() > 0) {
+            seqName = entity.getSchema() + "." + seqName;
+        }
+        return seqName;
+    }
+
+    /**
+     * Returns DROP SEQUENCE statement.
+     */
+    protected String dropSequenceString(DbEntity entity) {
+        return "DROP SEQUENCE " + sequenceName(entity) + " RESTRICT ";
+    }
+
+    /**
+     * Returns CREATE SEQUENCE statement for entity.
+     */
+    protected String createSequenceString(DbEntity entity) {
+        StringBuffer buf = new StringBuffer();
+        buf
+                .append("CREATE SEQUENCE ")
+                .append(sequenceName(entity))
+                .append(" START WITH 200")
+                .append(" INCREMENT BY ")
+                .append(getPkCacheSize())
+                .append(" NO MAXVALUE ")
+                .append(" NO CYCLE ")
+                .append(" CACHE ")
+                .append(getPkCacheSize());
+        return buf.toString();
+    }
 }


Reply via email to