Repository: cayenne
Updated Branches:
  refs/heads/master 27fb5716a -> 72aa17ac8


CAY-2186 rewrite DerbyPkGenerator to use sequences instead of AUTO_PK_SUPPORT 
table


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/72aa17ac
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/72aa17ac
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/72aa17ac

Branch: refs/heads/master
Commit: 72aa17ac8f5381c18e94d3414eb2e19683857ebd
Parents: 27fb571
Author: Nikita Timofeev <stari...@gmail.com>
Authored: Wed Feb 8 17:25:49 2017 +0300
Committer: Nikita Timofeev <stari...@gmail.com>
Committed: Wed Feb 8 17:25:49 2017 +0300

----------------------------------------------------------------------
 .../cayenne/dba/derby/DerbyPkGenerator.java     | 68 +++++++-------------
 1 file changed, 23 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/72aa17ac/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java
index e2595ce..00a7fbf 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java
@@ -19,66 +19,44 @@
 
 package org.apache.cayenne.dba.derby;
 
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.Collections;
-
-import org.apache.cayenne.CayenneException;
-import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcAdapter;
-import org.apache.cayenne.dba.JdbcPkGenerator;
-import org.apache.cayenne.log.JdbcEventLogger;
+import org.apache.cayenne.dba.oracle.OraclePkGenerator;
 import org.apache.cayenne.map.DbEntity;
 
 /**
- * Default PK generator for Derby that uses updateable ResultSet to get the 
next
- * id from the lookup table.
+ * PK generator for Derby that uses sequences.
  * 
- * @since 1.2
+ * @since 4.0 (old one used AUTO_PK_SUPPORT table)
  */
-public class DerbyPkGenerator extends JdbcPkGenerator {
+public class DerbyPkGenerator extends OraclePkGenerator {
 
        DerbyPkGenerator(JdbcAdapter adapter) {
                super(adapter);
        }
 
-       static final String SELECT_QUERY = "SELECT NEXT_ID FROM AUTO_PK_SUPPORT 
WHERE TABLE_NAME = ? FOR UPDATE";
-
-       /**
-        * @since 3.0
-        */
        @Override
-       protected long longPkFromDatabase(DataNode node, DbEntity entity) 
throws Exception {
-
-               JdbcEventLogger logger = adapter.getJdbcEventLogger();
-               if (logger.isLoggable()) {
-                       logger.logQuery(SELECT_QUERY, 
Collections.singletonList(entity.getName()));
-               }
-
-               try (Connection c = node.getDataSource().getConnection()) {
-                       try (PreparedStatement select =
-                                                
c.prepareStatement(SELECT_QUERY, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_UPDATABLE)) {
-                               select.setString(1, entity.getName());
-                               try (ResultSet rs = select.executeQuery()) {
-                                       if (!rs.next()) {
-                                               throw new CayenneException("PK 
lookup failed for table: " + entity.getName());
-                                       }
-
-                                       long nextId = rs.getLong(1);
+       protected String sequenceName(DbEntity entity) {
+               return super.sequenceName(entity).toUpperCase();
+       }
 
-                                       rs.updateLong(1, nextId + pkCacheSize);
-                                       rs.updateRow();
+       @Override
+       protected String selectNextValQuery(String pkGeneratingSequenceName) {
+               return "VALUES (NEXT VALUE FOR " + pkGeneratingSequenceName + 
")";
+       }
 
-                                       if (rs.next()) {
-                                               throw new 
CayenneException("More than one PK record for table: " + entity.getName());
-                                       }
+       @Override
+       protected String selectAllSequencesQuery() {
+               return "SELECT SEQUENCENAME FROM SYS.SYSSEQUENCES";
+       }
 
-                                       c.commit();
+       @Override
+       protected String dropSequenceString(DbEntity entity) {
+               return "DROP SEQUENCE " + sequenceName(entity) + " RESTRICT";
+       }
 
-                                       return nextId;
-                               }
-                       }
-               }
+       @Override
+       protected String createSequenceString(DbEntity entity) {
+               return "CREATE SEQUENCE " + sequenceName(entity) + " AS BIGINT 
START WITH " + pkStartValue +
+                               " INCREMENT BY " + getPkCacheSize() + " NO 
MAXVALUE NO CYCLE";
        }
 }

Reply via email to