You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/12/22 18:13:44 UTC

svn commit: r606467 - /cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java

Author: aadamchik
Date: Sat Dec 22 09:13:43 2007
New Revision: 606467

URL: http://svn.apache.org/viewvc?rev=606467&view=rev
Log:
JPA: support for drop schema property invaluable during testing

Modified:
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java?rev=606467&r1=606466&r2=606467&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java Sat Dec 22 09:13:43 2007
@@ -79,6 +79,7 @@
     public static final String NON_JTA_DATA_SOURCE_PROPERTY = "javax.persistence.nonJtaDataSource";
 
     // provider-specific properties. Must use provider namespace per ch. 7.1.3.1.
+    public static final String DROP_SCHEMA_PROPERTY = "org.apache.cayenne.schema.drop";
     public static final String CREATE_SCHEMA_PROPERTY = "org.apache.cayenne.schema.create";
     public static final String DATA_SOURCE_FACTORY_PROPERTY = "org.apache.cayenne.jpa.jpaDataSourceFactory";
 
@@ -276,6 +277,11 @@
             domain.setUsingExternalTransactions(isJTA);
 
             if ("true".equalsIgnoreCase(unit.getProperties().getProperty(
+                    DROP_SCHEMA_PROPERTY))) {
+                dropSchema(dataSource, adapter, cayenneMap);
+            }
+
+            if ("true".equalsIgnoreCase(unit.getProperties().getProperty(
                     CREATE_SCHEMA_PROPERTY))) {
                 loadSchema(dataSource, adapter, cayenneMap);
             }
@@ -326,6 +332,39 @@
     }
 
     /**
+     * Drops database schema if it exists.
+     */
+    protected void dropSchema(DataSource dataSource, DbAdapter adapter, DataMap map) {
+
+        Collection<DbEntity> tables = map.getDbEntities();
+        if (tables.isEmpty()) {
+            return;
+        }
+
+        if (!existingTablesDetected(dataSource, tables)) {
+            logger.debug("did not find at least one table; will skip dropping schema.");
+            return;
+        }
+
+        logger.debug("detected existings schema;; will continue with schema generation.");
+
+        // run generator
+        DbGenerator generator = new DbGenerator(adapter, map);
+        generator.setShouldCreateFKConstraints(false);
+        generator.setShouldCreatePKSupport(false);
+        generator.setShouldCreateTables(false);
+        generator.setShouldDropPKSupport(true);
+        generator.setShouldDropTables(true);
+
+        try {
+            generator.runGenerator(dataSource);
+        }
+        catch (Exception e) {
+
+        }
+    }
+
+    /**
      * Loads database schema if it doesn't yet exist.
      */
     protected void loadSchema(DataSource dataSource, DbAdapter adapter, DataMap map) {
@@ -335,10 +374,43 @@
             return;
         }
 
-        // sniff a first table presence
+        if (existingTablesDetected(dataSource, tables)) {
+            logger.debug("detected existings schema; will skip schema generation.");
+            return;
+        }
 
-        // TODO: andrus 9/1/2006 - should we make this check a part of DbGenerator (and
-        // query - a part of DbAdapter)?
+        logger.debug("did not find at least one table; "
+                + "will continue with schema generation.");
+
+        // run generator
+        DbGenerator generator = new DbGenerator(adapter, map);
+        generator.setShouldCreateFKConstraints(true);
+        generator.setShouldCreatePKSupport(true);
+        generator.setShouldCreateTables(true);
+        generator.setShouldDropPKSupport(false);
+        generator.setShouldDropTables(false);
+
+        try {
+            generator.runGenerator(dataSource);
+        }
+        catch (Exception e) {
+
+        }
+    }
+
+    /**
+     * Checks that at least one table in the collection of DbEntities is present in the
+     * DB. Negative or unknown outcomes result in false being returned.
+     */
+    protected boolean existingTablesDetected(
+            DataSource dataSource,
+            Collection<DbEntity> tables) {
+
+        if (tables.isEmpty()) {
+            return false;
+        }
+
+        // sniff a first table presence
         DbEntity table = tables.iterator().next();
 
         try {
@@ -358,10 +430,7 @@
                     while (rs.next()) {
                         String sqlName = rs.getString("TABLE_NAME");
                         if (tableName.equals(sqlName.toLowerCase())) {
-                            logger.debug("table "
-                                    + table.getFullyQualifiedName()
-                                    + " is present; will skip schema generation.");
-                            return;
+                            return true;
                         }
                     }
                 }
@@ -373,24 +442,12 @@
                 c.close();
             }
         }
-        catch (SQLException e1) {
+        catch (SQLException e) {
             // db exists
-            logger.debug("error generating schema, assuming schema exists.");
-            return;
-        }
-
-        logger.debug("table "
-                + table.getFullyQualifiedName()
-                + " is absent; will continue with schema generation.");
-
-        // run generator
-        DbGenerator generator = new DbGenerator(adapter, map);
-        try {
-            generator.runGenerator(dataSource);
+            logger.debug("error checking schema", e);
         }
-        catch (Exception e) {
 
-        }
+        return false;
     }
 
     protected DbAdapter createCustomAdapter(