@Test public void testLobHandling() throws Exception { ElementSymbol x = new ElementSymbol("x"); // $NON-NLS-1$ x.setType(DataTypeManager.DefaultDataClasses.CLOB); List<ElementSymbol> schema = Arrays.asList(x); TupleBuffer tb = BufferManagerFactory.getStandaloneBufferManager() .createTupleBuffer(schema, "x", TupleSourceType.PROCESSOR); // $NON-NLS-1$ tb.setInlineLobs(false); ClobType c = new ClobType(new SerialClob(new char[0])); TupleBatch batch = new TupleBatch(1, new List[] {Arrays.asList(c)}); tb.addTupleBatch(batch, false); assertNotNull(tb.getLobReference(c.getReferenceStreamId())); }
static OProperty<?> buildPropery( String propName, EdmType type, Object value, String invalidCharacterReplacement) throws TransformationException, SQLException, IOException { if (!(type instanceof EdmSimpleType)) { if (type instanceof EdmCollectionType) { EdmCollectionType collectionType = (EdmCollectionType) type; EdmType componentType = collectionType.getItemType(); Builder<OObject> b = OCollections.newBuilder(componentType); if (value instanceof Array) { value = ((Array) value).getArray(); } int length = java.lang.reflect.Array.getLength(value); for (int i = 0; i < length; i++) { Object o = java.lang.reflect.Array.get(value, i); OProperty p = buildPropery("x", componentType, o, invalidCharacterReplacement); if (componentType instanceof EdmSimpleType) { b.add(OSimpleObjects.create((EdmSimpleType) componentType, p.getValue())); } else { throw new AssertionError("Multi-dimensional arrays are not yet supported."); // b.add((OCollection)p.getValue()); } } return OProperties.collection(propName, collectionType, b.build()); } throw new AssertionError("non-simple types are not yet supported"); } EdmSimpleType expectedType = (EdmSimpleType) type; if (value == null) { return OProperties.null_(propName, expectedType); } Class<?> sourceType = DataTypeManager.getRuntimeType(value.getClass()); Class<?> targetType = DataTypeManager.getDataTypeClass( ODataTypeManager.teiidType(expectedType.getFullyQualifiedTypeName())); if (sourceType != targetType) { Transform t = DataTypeManager.getTransform(sourceType, targetType); if (t == null && BlobType.class == targetType) { if (sourceType == ClobType.class) { return OProperties.binary(propName, ClobType.getString((Clob) value).getBytes()); } if (sourceType == SQLXML.class) { return OProperties.binary(propName, ((SQLXML) value).getString().getBytes()); } } value = DataTypeManager.convertToRuntimeType(value, true); value = t != null ? t.transform(value, targetType) : value; value = replaceInvalidCharacters(expectedType, value, invalidCharacterReplacement); if (value instanceof BinaryType) { value = ((BinaryType) value).getBytesDirect(); } return OProperties.simple(propName, expectedType, value); } value = replaceInvalidCharacters(expectedType, value, invalidCharacterReplacement); return OProperties.simple(propName, expectedType, value); }
@Test public void testLobPeristence() throws Exception { BufferManager buffMgr = BufferManagerFactory.getStandaloneBufferManager(); FileStore fs = buffMgr.createFileStore("temp"); ClobType clob = new ClobType( new ClobImpl( new InputStreamFactory() { @Override public InputStream getInputStream() throws IOException { return new ReaderInputStream( new StringReader("Clob contents One"), Charset.forName(Streamable.ENCODING)); } }, -1)); BlobType blob = new BlobType( new BlobImpl( new InputStreamFactory() { @Override public InputStream getInputStream() throws IOException { return new ReaderInputStream( new StringReader("Blob contents Two"), Charset.forName(Streamable.ENCODING)); } })); BlobType blobEmpty = new BlobType( new BlobImpl( new InputStreamFactory() { @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(new byte[0]); } })); FileStore fs1 = buffMgr.createFileStore("blob"); FileStoreInputStreamFactory fsisf = new FileStoreInputStreamFactory(fs1, Streamable.ENCODING); FileStoreOutputStream fsos = fsisf.getOuputStream(); byte[] b = new byte[DataTypeManager.MAX_LOB_MEMORY_BYTES + 1]; fsos.write(b); fsos.close(); BlobType blob1 = new BlobType(new BlobImpl(fsisf)); assertNotNull(blob1.getReferenceStreamId()); LobManager lobManager = new LobManager(new int[] {0, 1, 2, 3}, fs); lobManager.setMaxMemoryBytes(4); List<?> tuple = Arrays.asList(clob, blob, blob1, blobEmpty); lobManager.updateReferences(tuple, ReferenceMode.CREATE); assertNotNull(blob1.getReferenceStreamId()); lobManager.persist(); Streamable<?> lob = lobManager.getLobReference(clob.getReferenceStreamId()); assertTrue(lob.getClass().isAssignableFrom(ClobType.class)); ClobType clobRead = (ClobType) lob; assertEquals(ClobType.getString(clob), ClobType.getString(clobRead)); assertTrue(clobRead.length() != -1); lob = lobManager.getLobReference(blob.getReferenceStreamId()); assertTrue(lob.getClass().isAssignableFrom(BlobType.class)); BlobType blobRead = (BlobType) lob; assertTrue( Arrays.equals( ObjectConverterUtil.convertToByteArray(blob.getBinaryStream()), ObjectConverterUtil.convertToByteArray(blobRead.getBinaryStream()))); lobManager.updateReferences(tuple, ReferenceMode.REMOVE); assertEquals(0, lobManager.getLobCount()); }
@Override protected Object readObject(ObjectInput in) throws IOException, ClassNotFoundException { ClobType ct = new ClobType(); ct.readExternal(in); return ct; }