OPENJPA-130. Merge from ../branches/1.1.x. svn merge -c 653008 ../branches/1.1.x

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@666905 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Patrick Linskey 2008-06-11 23:46:28 +00:00
parent f17afddbd6
commit 97a94847f6
5 changed files with 85 additions and 27 deletions

View File

@ -80,18 +80,12 @@ public class LobFieldStrategy extends AbstractFieldStrategy {
(field.getIndex()), store);
Row row = field.getRow(sm, store, rm, Row.ACTION_INSERT);
if (field.getColumnIO().isInsertable(0, ob == null)) {
if (ob != null) {
if (isBlob()) {
store.getDBDictionary().insertBlobForStreamingLoad
(row, field.getColumns()[0]);
(row, field.getColumns()[0], ob);
} else {
store.getDBDictionary().insertClobForStreamingLoad
(row, field.getColumns()[0]);
}
} else {
Column col = field.getColumns()[0];
col.setType(Types.OTHER);
row.setNull(col);
(row, field.getColumns()[0], ob);
}
}
}
@ -114,7 +108,27 @@ public class LobFieldStrategy extends AbstractFieldStrategy {
}
}
public Boolean isCustomUpdate(OpenJPAStateManager sm, JDBCStore store) {
return null;
}
public void update(OpenJPAStateManager sm, JDBCStore store, RowManager rm)
throws SQLException {
Object ob = toDataStoreValue(sm.fetchObjectField
(field.getIndex()), store);
if (field.getColumnIO().isUpdatable(0, ob == null)) {
Row row = field.getRow(sm, store, rm, Row.ACTION_UPDATE);
if (isBlob()) {
store.getDBDictionary().insertBlobForStreamingLoad
(row, field.getColumns()[0], ob);
} else {
store.getDBDictionary().insertClobForStreamingLoad
(row, field.getColumns()[0], ob);
}
}
}
public void customUpdate(OpenJPAStateManager sm, JDBCStore store)
throws SQLException {
Object ob = toDataStoreValue(sm.fetchObjectField
(field.getIndex()), store);
@ -128,11 +142,6 @@ public class LobFieldStrategy extends AbstractFieldStrategy {
store.getDBDictionary().updateClob
(sel, store, (Reader)ob);
}
} else {
Row row = field.getRow(sm, store, rm, Row.ACTION_UPDATE);
Column col = field.getColumns()[0];
col.setType(Types.OTHER);
row.setNull(col);
}
}
}
@ -191,4 +200,5 @@ public class LobFieldStrategy extends AbstractFieldStrategy {
sel.setLob(true);
return sel;
}
}

View File

@ -127,8 +127,8 @@ public class DBDictionary
public static final String CONS_NAME_MID = "mid";
public static final String CONS_NAME_AFTER = "after";
public int blobBufferSize = 50;
public int clobBufferSize = 50;
public int blobBufferSize = 50000;
public int clobBufferSize = 50000;
protected static final int RANGE_POST_SELECT = 0;
protected static final int RANGE_PRE_DISTINCT = 1;
@ -4189,16 +4189,24 @@ public class DBDictionary
return column.toString();
}
public void insertBlobForStreamingLoad(Row row, Column col)
public void insertBlobForStreamingLoad(Row row, Column col, Object ob)
throws SQLException {
if (ob != null) {
row.setBinaryStream(col,
new ByteArrayInputStream(new byte[0]), 0);
} else {
row.setNull(col);
}
}
public void insertClobForStreamingLoad(Row row, Column col)
public void insertClobForStreamingLoad(Row row, Column col, Object ob)
throws SQLException {
if (ob != null) {
row.setCharacterStream(col,
new CharArrayReader(new char[0]), 0);
} else {
row.setNull(col);
}
}
public void updateBlob(Select sel, JDBCStore store, InputStream is)

View File

@ -1096,13 +1096,17 @@ public class OracleDictionary
buf.append("')");
}
public void insertBlobForStreamingLoad(Row row, Column col)
public void insertBlobForStreamingLoad(Row row, Column col, Object ob)
throws SQLException {
if (ob == null)
col.setType(Types.OTHER);
row.setNull(col);
}
public void insertClobForStreamingLoad(Row row, Column col)
public void insertClobForStreamingLoad(Row row, Column col, Object ob)
throws SQLException {
if (ob == null)
col.setType(Types.OTHER);
row.setNull(col);
}

View File

@ -20,6 +20,7 @@
package org.apache.openjpa.jdbc.meta.strats;
import java.io.IOException;
import javax.persistence.EntityManager;
import javax.persistence.Query;
@ -117,6 +118,41 @@ public abstract class AbstractLobTest extends SingleEMFTestCase {
em.close();
}
public void testUpdateWithNull() {
if (!isDatabaseSupported()) return;
insert(newLobEntity("oOOOOOo", 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
entity.setStream(null);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
entity = (LobEntity) em.find(getLobEntityClass(), 1);
assertNull(entity.getStream());
em.getTransaction().commit();
em.close();
}
public void testUpdateANullObjectWithoutNull() throws IOException {
if (!isDatabaseSupported()) return;
insert(newLobEntity(null, 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
String string = "iIIIIIi";
changeStream(entity, string);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
entity = (LobEntity) em.find(getLobEntityClass(), 1);
assertEquals(string, getStreamContentAsString(entity.getStream()));
em.getTransaction().commit();
em.close();
}
public void testDelete() {
if (!isDatabaseSupported()) return;
insert(newLobEntity("oOOOOOo", 1));

View File

@ -35,10 +35,10 @@ import org.apache.openjpa.persistence.Persistent;
public class ReaderLobEntity implements LobEntity {
@Id
int id;
private int id;
@Persistent
Reader stream;
private Reader stream;
public int getId() {
return id;