Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2010-10-04 07:18:04 +0000
committerEike Stepper2010-10-04 07:18:04 +0000
commitee93a098111a57a701a0baa13c2467e559bd9908 (patch)
treeaae56e9601ba197506dea080b6fd1dc662fb3db2
parent4ec0947627e385c5f699cb00617f9dfe5074fc6d (diff)
downloadcdo-ee93a098111a57a701a0baa13c2467e559bd9908.tar.gz
cdo-ee93a098111a57a701a0baa13c2467e559bd9908.tar.xz
cdo-ee93a098111a57a701a0baa13c2467e559bd9908.zip
[284307] Add support for streaming of large byte arrays / BLOB
https://bugs.eclipse.org/bugs/show_bug.cgi?id=284307
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStore.java80
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStoreAccessor.java18
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/DBConfigs.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java1
4 files changed, 87 insertions, 14 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStore.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStore.java
index 8dd778d445..62f6720518 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStore.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStore.java
@@ -22,6 +22,8 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.model.CDOModelConstants;
+import org.eclipse.emf.cdo.common.protocol.CDODataInput;
+import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
@@ -43,13 +45,25 @@ import org.eclipse.emf.cdo.spi.common.revision.SyntheticCDORevision;
import org.eclipse.emf.cdo.spi.server.LongIDStore;
import org.eclipse.emf.cdo.spi.server.StoreAccessorPool;
+import org.eclipse.net4j.util.HexUtil;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump;
+import org.eclipse.net4j.util.io.IOUtil;
+import org.eclipse.net4j.util.om.monitor.OMMonitor;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.CharArrayReader;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
@@ -83,6 +97,8 @@ public class MEMStore extends LongIDStore implements IMEMStore, BranchLoader
private Map<CDOID, EClass> objectTypes = new HashMap<CDOID, EClass>();
+ private Map<String, Object> lobs = new HashMap<String, Object>();
+
private int listLimit;
@ExcludeFromDump
@@ -614,6 +630,70 @@ public class MEMStore extends LongIDStore implements IMEMStore, BranchLoader
return true;
}
+ public synchronized void rawExport(CDODataOutput out, int fromBranchID, int toBranchID, long fromCommitTime,
+ long toCommitTime)
+ {
+ // TODO: implement MEMStore.rawExport(out, fromBranchID, toBranchID, fromCommitTime, toCommitTime)
+ throw new UnsupportedOperationException();
+ }
+
+ public synchronized void rawImport(CDODataInput in, int fromBranchID, int toBranchID, long fromCommitTime,
+ long toCommitTime, OMMonitor monitor)
+ {
+ // TODO: implement MEMStore.rawImport(in, fromBranchID, toBranchID, fromCommitTime, toCommitTime, monitor)
+ throw new UnsupportedOperationException();
+ }
+
+ public synchronized void queryLobs(List<byte[]> ids)
+ {
+ for (Iterator<byte[]> it = ids.iterator(); it.hasNext();)
+ {
+ byte[] id = it.next();
+ String key = HexUtil.bytesToHex(id);
+ if (lobs.containsKey(key))
+ {
+ it.remove();
+ }
+ }
+ }
+
+ public synchronized void loadLob(byte[] id, OutputStream out) throws IOException
+ {
+ String key = HexUtil.bytesToHex(id);
+ Object lob = lobs.get(key);
+ if (lob == null)
+ {
+ throw new IOException("Lob not found: " + key);
+ }
+
+ if (lob instanceof byte[])
+ {
+ byte[] blob = (byte[])lob;
+ ByteArrayInputStream in = new ByteArrayInputStream(blob);
+ IOUtil.copyBinary(in, out, blob.length);
+ }
+ else
+ {
+ char[] clob = (char[])lob;
+ CharArrayReader in = new CharArrayReader(clob);
+ IOUtil.copyCharacter(in, new OutputStreamWriter(out), clob.length);
+ }
+ }
+
+ public synchronized void writeBlob(byte[] id, long size, InputStream inputStream) throws IOException
+ {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ IOUtil.copyBinary(inputStream, out, size);
+ lobs.put(HexUtil.bytesToHex(id), out.toByteArray());
+ }
+
+ public synchronized void writeClob(byte[] id, long size, Reader reader) throws IOException
+ {
+ CharArrayWriter out = new CharArrayWriter();
+ IOUtil.copyCharacter(reader, out, size);
+ lobs.put(HexUtil.bytesToHex(id), out.toCharArray());
+ }
+
@Override
public MEMStoreAccessor createReader(ISession session)
{
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStoreAccessor.java
index cd9f8d0e46..9d33e7d35f 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/mem/MEMStoreAccessor.java
@@ -345,41 +345,35 @@ public class MEMStoreAccessor extends LongIDStoreAccessor
public void rawExport(CDODataOutput out, int fromBranchID, int toBranchID, long fromCommitTime, long toCommitTime)
throws IOException
{
- // TODO: implement MEMStoreAccessor.rawExport(out, lastReplicatedBranchID, lastReplicatedCommitTime)
- throw new UnsupportedOperationException();
+ getStore().rawExport(out, fromBranchID, toBranchID, fromCommitTime, toCommitTime);
}
public void rawImport(CDODataInput in, int fromBranchID, int toBranchID, long fromCommitTime, long toCommitTime,
OMMonitor monitor) throws IOException
{
- // TODO: implement MEMStoreAccessor.rawImport(in, fromBranchID, toBranchID, fromCommitTime, toCommitTime)
- throw new UnsupportedOperationException();
+ getStore().rawImport(in, fromBranchID, toBranchID, fromCommitTime, toCommitTime, monitor);
}
public void queryLobs(List<byte[]> ids)
{
- // TODO: implement MEMStoreAccessor.queryLobs(ids)
- throw new UnsupportedOperationException();
+ getStore().queryLobs(ids);
}
public void loadLob(byte[] id, OutputStream out) throws IOException
{
- // TODO: implement MEMStoreAccessor.loadLob(id, out)
- throw new UnsupportedOperationException();
+ getStore().loadLob(id, out);
}
@Override
protected void writeBlob(byte[] id, long size, InputStream inputStream) throws IOException
{
- // TODO: implement MEMStoreAccessor.writeBlob(id, size, in)
- throw new UnsupportedOperationException();
+ getStore().writeBlob(id, size, inputStream);
}
@Override
protected void writeClob(byte[] id, long size, Reader reader) throws IOException
{
- // TODO: implement MEMStoreAccessor.writeClob(id, size, reader)
- throw new UnsupportedOperationException();
+ getStore().writeClob(id, size, reader);
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/DBConfigs.java b/plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/DBConfigs.java
index 85984fccd9..7e2f1bcdb7 100644
--- a/plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/DBConfigs.java
+++ b/plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/DBConfigs.java
@@ -19,7 +19,6 @@ import org.eclipse.emf.cdo.tests.BranchingTest;
import org.eclipse.emf.cdo.tests.BranchingTestSameSession;
import org.eclipse.emf.cdo.tests.ExternalReferenceTest;
import org.eclipse.emf.cdo.tests.FeatureMapTest;
-import org.eclipse.emf.cdo.tests.LobTest;
import org.eclipse.emf.cdo.tests.MEMStoreQueryTest;
import org.eclipse.emf.cdo.tests.MergingTest;
import org.eclipse.emf.cdo.tests.XATransactionTest;
@@ -39,7 +38,6 @@ public abstract class DBConfigs extends AllConfigs
@Override
protected void initTestClasses(List<Class<? extends ConfigTest>> testClasses)
{
- testClasses.add(LobTest.class);
testClasses.add(Net4jDBTest.class);
testClasses.add(DBAnnotationsTest.class);
testClasses.add(DBStoreTest.class);
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
index 7021421855..616dcb7ad7 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
@@ -169,6 +169,7 @@ public abstract class AllConfigs extends ConfigTestSuite
testClasses.add(LegacyTest.class);
testClasses.add(XRefTest.class);
testClasses.add(StickyViewsTest.class);
+ testClasses.add(LobTest.class);
// Specific for MEMStore
testClasses.add(MEMStoreQueryTest.class);

Back to the top