Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java75
1 files changed, 73 insertions, 2 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
index 80f45e7846..f2eda0e2a9 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
@@ -48,6 +48,7 @@ import org.eclipse.emf.cdo.server.db.mapping.IClassMapping;
import org.eclipse.emf.cdo.server.db.mapping.IClassMappingAuditSupport;
import org.eclipse.emf.cdo.server.db.mapping.IClassMappingDeltaSupport;
import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy;
+import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategyBulkSupport;
import org.eclipse.emf.cdo.server.internal.db.bundle.OM;
import org.eclipse.emf.cdo.server.internal.db.mapping.horizontal.AbstractHorizontalClassMapping;
import org.eclipse.emf.cdo.server.internal.db.mapping.horizontal.UnitMappingTable;
@@ -106,6 +107,7 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -166,7 +168,7 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
public IDBPreparedStatement getPreparedStatement(String sql, ReuseProbability reuseProbability)
{
org.eclipse.net4j.db.IDBPreparedStatement.ReuseProbability converted = //
- org.eclipse.net4j.db.IDBPreparedStatement.ReuseProbability.values()[reuseProbability.ordinal()];
+ org.eclipse.net4j.db.IDBPreparedStatement.ReuseProbability.values()[reuseProbability.ordinal()];
return connection.prepareStatement(sql, converted);
}
@@ -542,6 +544,7 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
}
monitor.begin(revisionDeltas.length);
+
try
{
for (InternalCDORevisionDelta delta : revisionDeltas)
@@ -557,6 +560,9 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
protected void writeRevisionDelta(InternalCDORevisionDelta delta, long created, OMMonitor monitor)
{
+ int xxx;
+ // eClass ?= delta.getEClass()
+
CDOID id = delta.getID();
EClass eClass = getObjectType(id);
IClassMappingDeltaSupport mapping = (IClassMappingDeltaSupport)getStore().getMappingStrategy()
@@ -611,6 +617,71 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
throw new UnsupportedOperationException();
}
+ @Override
+ protected void writeNewAndDirtyRevisions(InternalCommitContext context, boolean deltas, CDOBranch branch,
+ long timeStamp, OMMonitor monitor)
+ {
+ IMappingStrategy mappingStrategy = getStore().getMappingStrategy();
+ if (mappingStrategy instanceof IMappingStrategyBulkSupport
+ && !"true".equalsIgnoreCase(mappingStrategy.getProperties().get("disableBulkInserts")))
+ {
+ IMappingStrategyBulkSupport bulkSupport = (IMappingStrategyBulkSupport)mappingStrategy;
+ if (bulkSupport.hasBulkSupport())
+ {
+ Map<EClass, List<InternalCDORevision>> revisionsPerClass = new HashMap<EClass, List<InternalCDORevision>>();
+ Map<CDOID, EClass> newObjectTypes = new HashMap<CDOID, EClass>();
+
+ InternalCDORevision[] newObjects = context.getNewObjects();
+ classifyRevisions(newObjects, revisionsPerClass, newObjectTypes);
+ int count = newObjects.length;
+
+ if (!deltas)
+ {
+ InternalCDORevision[] dirtyObjects = context.getDirtyObjects();
+ classifyRevisions(dirtyObjects, revisionsPerClass, null);
+ count += dirtyObjects.length;
+ }
+
+ bulkSupport.writeBulkRevisions(this, revisionsPerClass, newObjectTypes, branch, timeStamp, monitor.fork(count));
+
+ if (deltas)
+ {
+ InternalCDORevisionDelta[] dirtyObjectDeltas = context.getDirtyObjectDeltas();
+ if (dirtyObjectDeltas.length != 0)
+ {
+ writeRevisionDeltas(dirtyObjectDeltas, branch, timeStamp, monitor.fork(dirtyObjectDeltas.length));
+ }
+ }
+
+ return;
+ }
+ }
+
+ super.writeNewAndDirtyRevisions(context, deltas, branch, timeStamp, monitor);
+ }
+
+ private void classifyRevisions(InternalCDORevision[] revisions,
+ Map<EClass, List<InternalCDORevision>> revisionsPerClass, Map<CDOID, EClass> newObjectTypes)
+ {
+ for (InternalCDORevision revision : revisions)
+ {
+ EClass eClass = revision.getEClass();
+ if (newObjectTypes != null)
+ {
+ newObjectTypes.put(revision.getID(), eClass);
+ }
+
+ List<InternalCDORevision> list = revisionsPerClass.get(eClass);
+ if (list == null)
+ {
+ list = new ArrayList<InternalCDORevision>();
+ revisionsPerClass.put(eClass, list);
+ }
+
+ list.add(revision);
+ }
+ }
+
protected void writeRevision(InternalCDORevision revision, boolean mapType, boolean revise, OMMonitor monitor)
{
if (TRACER.isEnabled())
@@ -1308,7 +1379,7 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
Connection connection = getConnection();
Collection<InternalCDOPackageUnit> imported = //
- metaDataManager.rawImport(connection, in, fromCommitTime, toCommitTime, monitor.fork());
+ metaDataManager.rawImport(connection, in, fromCommitTime, toCommitTime, monitor.fork());
packageUnits.addAll(imported);
if (!packageUnits.isEmpty())

Back to the top