You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2010/06/02 00:01:24 UTC

svn commit: r950280 - /ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java

Author: doogie
Date: Tue Jun  1 22:01:23 2010
New Revision: 950280

URL: http://svn.apache.org/viewvc?rev=950280&view=rev
Log:
Revert wrongly committed 950255

Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java?rev=950280&r1=950279&r2=950280&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java Tue Jun  1 22:01:23 2010
@@ -31,15 +31,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.SortedSet;
 import java.util.TreeSet;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentSkipListSet;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import javolution.util.FastList;
 import javolution.util.FastMap;
@@ -63,7 +55,6 @@ import org.ofbiz.entity.model.ModelKeyMa
 import org.ofbiz.entity.model.ModelRelation;
 import org.ofbiz.entity.model.ModelViewEntity;
 import org.ofbiz.entity.transaction.TransactionUtil;
-import org.ofbiz.base.concurrent.ExecutionPool;
 
 /**
  * Utilities for Entity Database Maintenance
@@ -151,58 +142,62 @@ public class DatabaseUtil {
         checkDb(modelEntities, null, messages, datasourceInfo.checkPrimaryKeysOnStart, (datasourceInfo.useFks && datasourceInfo.checkForeignKeysOnStart), (datasourceInfo.useFkIndices && datasourceInfo.checkFkIndicesOnStart), addMissing);
     }
 
-    private abstract class DBFuture<F extends DBFuture> implements Callable<F> {
-        protected final Map<String, ModelEntity> modelEntities;
-        protected final Set<String> tableNames;
-        protected final UtilTimer timer;
-        protected final Map<String, Map<String, ColumnCheckInfo>> colInfo;
-        protected final List<String> messages = FastList.newInstance();
-
-        protected DBFuture(Map<String, ModelEntity> modelEntities, UtilTimer timer, Set<String> tableNames, Map<String, Map<String, ColumnCheckInfo>> colInfo) {
-            this.modelEntities = modelEntities;
-            this.timer = timer;
-            this.tableNames = tableNames;
-            this.colInfo = colInfo;
+    public void checkDb(Map<String, ModelEntity> modelEntities, List<String> colWrongSize, List<String> messages, boolean checkPks, boolean checkFks, boolean checkFkIdx, boolean addMissing) {
+        if (isLegacy) {
+            throw new RuntimeException("Cannot run checkDb on a legacy database connection; configure a database helper (entityengine.xml)");
         }
+        UtilTimer timer = new UtilTimer();
+        timer.timerString("Start - Before Get Database Meta Data");
+
+        // get ALL tables from this database
+        TreeSet<String> tableNames = this.getTableNames(messages);
+        TreeSet<String> fkTableNames = tableNames == null ? null : new TreeSet<String>(tableNames);
+        TreeSet<String> indexTableNames = tableNames == null ? null : new TreeSet<String>(tableNames);
 
-        protected void updateData(List<String> messages) {
-            if (messages != null) messages.addAll(this.messages);
+        if (tableNames == null) {
+            String message = "Could not get table name information from the database, aborting.";
+            if (messages != null) messages.add(message);
+            Debug.logError(message, module);
+            return;
         }
-    }
+        timer.timerString("After Get All Table Names");
 
-    private static <F> Collection<F> getAllFutures(Collection<Future<F>> futureList) {
-        List<F> result = FastList.newInstance();
-        for (Future<F> future: futureList) {
-            try {
-                result.add(future.get());
-            } catch (ExecutionException e) {
-                Debug.logError(e, module);
-            } catch (InterruptedException e) {
-                Debug.logError(e, module);
-            }
+        // get ALL column info, put into hashmap by table name
+        Map<String, Map<String, ColumnCheckInfo>> colInfo = this.getColumnInfo(tableNames, checkPks, messages);
+        if (colInfo == null) {
+            String message = "Could not get column information from the database, aborting.";
+            if (messages != null) messages.add(message);
+            Debug.logError(message, module);
+            return;
         }
-        return result;
-    }
+        timer.timerString("After Get All Column Info");
+
+        // -make sure all entities have a corresponding table
+        // -list all tables that do not have a corresponding entity
+        // -display message if number of table columns does not match number of entity fields
+        // -list all columns that do not have a corresponding field
+        // -make sure each corresponding column is of the correct type
+        // -list all fields that do not have a corresponding column
 
-    private class TableFuture extends DBFuture<TableFuture> {
-        private final int curEnt;
-        private final int totalEnt;
-        private final ModelEntity entity;
-        private final boolean checkPks;
-        private final boolean addMissing;
-        private final List<String> colWrongSize = FastList.newInstance();
-        private boolean entityAdded = false;
+        timer.timerString("Before Individual Table/Column Check");
 
-        protected TableFuture(Map<String, ModelEntity> modelEntities, UtilTimer timer, Set<String> tableNames, Map<String, Map<String, ColumnCheckInfo>> colInfo, int curEnt, int totalEnt, ModelEntity entity, boolean checkPks, boolean addMissing) {
-            super(modelEntities, timer, tableNames, colInfo);
-            this.curEnt = curEnt;
-            this.totalEnt = totalEnt;
-            this.entity = entity;
-            this.checkPks = checkPks;
-            this.addMissing = addMissing;
-        }
+        ArrayList<ModelEntity> modelEntityList = new ArrayList<ModelEntity>(modelEntities.values());
+        // sort using compareTo method on ModelEntity
+        Collections.sort(modelEntityList);
+        int curEnt = 0;
+        int totalEnt = modelEntityList.size();
+        List<ModelEntity> entitiesAdded = FastList.newInstance();
+        for (ModelEntity entity: modelEntityList) {
+            curEnt++;
+
+            // if this is a view entity, do not check it...
+            if (entity instanceof ModelViewEntity) {
+                String entMessage = "(" + timer.timeSinceLast() + "ms) NOT Checking #" + curEnt + "/" + totalEnt + " View Entity " + entity.getEntityName();
+                Debug.logVerbose(entMessage, module);
+                if (messages != null) messages.add(entMessage);
+                continue;
+            }
 
-        public TableFuture call() {
             String entMessage = "(" + timer.timeSinceLast() + "ms) Checking #" + curEnt + "/" + totalEnt +
                 " Entity " + entity.getEntityName() + " with table " + entity.getTableName(datasourceInfo);
 
@@ -241,6 +236,7 @@ public class DatabaseUtil {
                                     int openParen = fullTypeStr.indexOf('(');
                                     int closeParen = fullTypeStr.indexOf(')');
                                     int comma = fullTypeStr.indexOf(',');
+
                                     if (openParen > 0 && closeParen > 0 && closeParen > openParen) {
                                         typeName = fullTypeStr.substring(0, openParen);
                                         if (comma > 0 && comma > openParen && comma < closeParen) {
@@ -268,6 +264,7 @@ public class DatabaseUtil {
                                     } else {
                                         typeName = fullTypeStr;
                                     }
+
                                     // override the default typeName with the sqlTypeAlias if it is specified
                                     if (UtilValidate.isNotEmpty(modelFieldType.getSqlTypeAlias())) {
                                         typeName = modelFieldType.getSqlTypeAlias();
@@ -371,132 +368,15 @@ public class DatabaseUtil {
                         Debug.logError(message, module);
                         if (messages != null) messages.add(message);
                     } else {
-                        entityAdded = true;
+                        entitiesAdded.add(entity);
                         message = "Created table [" + entity.getTableName(datasourceInfo) + "]";
                         Debug.logImportant(message, module);
                         if (messages != null) messages.add(message);
                     }
                 }
             }
-            return this;
-        }
-
-        protected void updateData(List<String> messages, List<ModelEntity> entitiesAdded) {
-            updateData(messages);
-            if (entityAdded) {
-                entitiesAdded.add(entity);
-            }
-        }
-    }
-
-    private abstract class CountingFuture<F extends CountingFuture<F>> implements Callable<F> {
-        protected final AtomicInteger count;
-        protected final List<String> messages = FastList.newInstance();
-
-        protected CountingFuture(AtomicInteger count) {
-            this.count = count;
-        }
-
-        protected void updateData(List<String> messages) {
-            if (messages != null) messages.addAll(this.messages);
-        }
-    }
-
-    private class ForeignKeyIndexFuture extends CountingFuture<ForeignKeyIndexFuture> {
-        private final ModelEntity entity;
-        private final int constraintNameClipLength;
-
-        protected ForeignKeyIndexFuture(AtomicInteger count, ModelEntity entity, int constraintNameClipLength) {
-            super(count);
-            this.entity = entity;
-            this.constraintNameClipLength = constraintNameClipLength;
-        }
-
-        public ForeignKeyIndexFuture call() {
-            count.addAndGet(createForeignKeyIndices(entity, constraintNameClipLength, messages));
-            return this;
-        }
-    }
-
-    private class DeclaredIndexFuture extends CountingFuture<DeclaredIndexFuture> {
-        private final ModelEntity entity;
-
-        protected DeclaredIndexFuture(AtomicInteger count, ModelEntity entity) {
-            super(count);
-            this.entity = entity;
-        }
-
-        public DeclaredIndexFuture call() {
-            count.addAndGet(createDeclaredIndices(entity, messages));
-            return this;
-        }
-    }
-
-    public void checkDb(Map<String, ModelEntity> modelEntities, List<String> colWrongSize, List<String> messages, boolean checkPks, boolean checkFks, boolean checkFkIdx, boolean addMissing) {
-        if (isLegacy) {
-            throw new RuntimeException("Cannot run checkDb on a legacy database connection; configure a database helper (entityengine.xml)");
-        }
-        UtilTimer timer = new UtilTimer();
-        timer.timerString("Start - Before Get Database Meta Data");
-
-        // get ALL tables from this database
-        SortedSet<String> tableNames = this.getTableNames(messages);
-        TreeSet<String> fkTableNames = tableNames == null ? null : new TreeSet<String>(tableNames);
-        TreeSet<String> indexTableNames = tableNames == null ? null : new TreeSet<String>(tableNames);
-
-        if (tableNames == null) {
-            String message = "Could not get table name information from the database, aborting.";
-            if (messages != null) messages.add(message);
-            Debug.logError(message, module);
-            return;
-        }
-        timer.timerString("After Get All Table Names");
-
-        // get ALL column info, put into hashmap by table name
-        Map<String, Map<String, ColumnCheckInfo>> colInfo = this.getColumnInfo(tableNames, checkPks, messages);
-        if (colInfo == null) {
-            String message = "Could not get column information from the database, aborting.";
-            if (messages != null) messages.add(message);
-            Debug.logError(message, module);
-            return;
-        }
-        timer.timerString("After Get All Column Info");
-
-        // -make sure all entities have a corresponding table
-        // -list all tables that do not have a corresponding entity
-        // -display message if number of table columns does not match number of entity fields
-        // -list all columns that do not have a corresponding field
-        // -make sure each corresponding column is of the correct type
-        // -list all fields that do not have a corresponding column
-
-        timer.timerString("Before Individual Table/Column Check");
-
-        ArrayList<ModelEntity> modelEntityList = new ArrayList<ModelEntity>(modelEntities.values());
-        // sort using compareTo method on ModelEntity
-        Collections.sort(modelEntityList);
-        int curEnt = 0;
-        int totalEnt = modelEntityList.size();
-        List<ModelEntity> entitiesAdded = FastList.newInstance();
-        List<Future<TableFuture>> tableFutureFutures = FastList.newInstance();
-        ScheduledExecutorService threadPool = ExecutionPool.getNewOptimalExecutor("Databaseutil");
-
-        for (ModelEntity entity: modelEntityList) {
-            curEnt++;
-
-            // if this is a view entity, do not check it...
-            if (entity instanceof ModelViewEntity) {
-                String entMessage = "(" + timer.timeSinceLast() + "ms) NOT Checking #" + curEnt + "/" + totalEnt + " View Entity " + entity.getEntityName();
-                Debug.logVerbose(entMessage, module);
-                if (messages != null) messages.add(entMessage);
-                continue;
-            }
-
-            tableFutureFutures.add(threadPool.submit(new TableFuture(modelEntities, timer, tableNames, colInfo, curEnt, totalEnt, entity, checkPks, addMissing)));
         }
 
-        for (TableFuture tableFuture: getAllFutures(tableFutureFutures)) {
-            tableFuture.updateData(messages, entitiesAdded);
-        }
         timer.timerString("After Individual Table/Column Check");
 
         // -list all tables that do not have a corresponding entity
@@ -508,17 +388,13 @@ public class DatabaseUtil {
 
         // for each newly added table, add fk indices
         if (datasourceInfo.useFkIndices) {
-            List<Future<ForeignKeyIndexFuture>> fkIndicesFutureFutures = FastList.newInstance();
-            AtomicInteger totalFkIndices = new AtomicInteger();
+            int totalFkIndices = 0;
             for (ModelEntity curEntity: entitiesAdded) {
                 if (curEntity.getRelationsOneSize() > 0) {
-                    fkIndicesFutureFutures.add(threadPool.submit(new ForeignKeyIndexFuture(totalFkIndices, curEntity, datasourceInfo.constraintNameClipLength)));
+                    totalFkIndices += this.createForeignKeyIndices(curEntity, datasourceInfo.constraintNameClipLength, messages);
                 }
             }
-            for (ForeignKeyIndexFuture fkIndicesFuture: getAllFutures(fkIndicesFutureFutures)) {
-                fkIndicesFuture.updateData(messages);
-            }
-            if (totalFkIndices.get() > 0) Debug.logImportant("==== TOTAL Foreign Key Indices Created: " + totalFkIndices.get(), module);
+            if (totalFkIndices > 0) Debug.logImportant("==== TOTAL Foreign Key Indices Created: " + totalFkIndices, module);
         }
 
         // for each newly added table, add fks
@@ -532,17 +408,13 @@ public class DatabaseUtil {
 
         // for each newly added table, add declared indexes
         if (datasourceInfo.useIndices) {
-            List<Future<DeclaredIndexFuture>> disFutureFutures = FastList.newInstance();
-            AtomicInteger totalDis = new AtomicInteger();
+            int totalDis = 0;
             for (ModelEntity curEntity: entitiesAdded) {
                 if (curEntity.getIndexesSize() > 0) {
-                    disFutureFutures.add(threadPool.submit(new DeclaredIndexFuture(totalDis, curEntity)));
+                    totalDis += this.createDeclaredIndices(curEntity, messages);
                 }
             }
-            for (DeclaredIndexFuture disFuture: getAllFutures(disFutureFutures)) {
-                disFuture.updateData(messages);
-            }
-            if (totalDis.get() > 0) Debug.logImportant("==== TOTAL Declared Indices Created: " + totalDis.get(), module);
+            if (totalDis > 0) Debug.logImportant("==== TOTAL Declared Indices Created: " + totalDis, module);
         }
 
         // make sure each one-relation has an FK
@@ -785,7 +657,7 @@ public class DatabaseUtil {
     /** Creates a list of ModelEntity objects based on meta data from the database */
     public List<ModelEntity> induceModelFromDb(Collection<String> messages) {
         // get ALL tables from this database
-        SortedSet<String> tableNames = this.getTableNames(messages);
+        TreeSet<String> tableNames = this.getTableNames(messages);
 
         // get ALL column info, put into hashmap by table name
         Map<String, Map<String, ColumnCheckInfo>> colInfo = this.getColumnInfo(tableNames, true, messages);
@@ -828,7 +700,7 @@ public class DatabaseUtil {
         List<String> messages = new ArrayList<String>();
 
         // get ALL tables from this database
-        SortedSet<String> tableNames = this.getTableNames(messages);
+        TreeSet<String> tableNames = this.getTableNames(messages);
 
         // get ALL column info, put into hashmap by table name
         Map<String, Map<String, ColumnCheckInfo>> colInfo = this.getColumnInfo(tableNames, true, messages);
@@ -1147,7 +1019,7 @@ public class DatabaseUtil {
         }
     }
 
-    public SortedSet<String> getTableNames(Collection<String> messages) {
+    public TreeSet<String> getTableNames(Collection<String> messages) {
         Connection connection = getConnectionLogged(messages);
 
         if (connection == null) {
@@ -1166,7 +1038,7 @@ public class DatabaseUtil {
         if (Debug.infoOn()) Debug.logInfo("Getting Table Info From Database", module);
 
         // get ALL tables from this database
-        SortedSet<String> tableNames = new ConcurrentSkipListSet<String>();
+        TreeSet<String> tableNames = new TreeSet<String>();
         ResultSet tableSet = null;
 
         String lookupSchemaName = null;
@@ -1291,7 +1163,7 @@ public class DatabaseUtil {
 
             if (Debug.infoOn()) Debug.logInfo("Getting Column Info From Database", module);
 
-            Map<String, Map<String, ColumnCheckInfo>> colInfo = new ConcurrentHashMap<String, Map<String, ColumnCheckInfo>>();
+            Map<String, Map<String, ColumnCheckInfo>> colInfo = FastMap.newInstance();
             String lookupSchemaName = null;
             try {
                 if (dbData.supportsSchemasInTableDefinitions()) {