diff options
author | Eike Stepper | 2010-10-04 07:18:04 +0000 |
---|---|---|
committer | Eike Stepper | 2010-10-04 07:18:04 +0000 |
commit | ee93a098111a57a701a0baa13c2467e559bd9908 (patch) | |
tree | aae56e9601ba197506dea080b6fd1dc662fb3db2 | |
parent | 4ec0947627e385c5f699cb00617f9dfe5074fc6d (diff) | |
download | cdo-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
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); |