提交 8f55701b authored 作者: Thomas Mueller's avatar Thomas Mueller

Issue 277: JaQu didn't correctly convert a CLOB column to a String.

上级 4277bfae
......@@ -65,6 +65,7 @@ import org.h2.test.db.TestView;
import org.h2.test.db.TestViewAlterTable;
import org.h2.test.db.TestViewDropView;
import org.h2.test.jaqu.AliasMapTest;
import org.h2.test.jaqu.ClobTest;
import org.h2.test.jaqu.SamplesTest;
import org.h2.test.jaqu.UpdateTest;
import org.h2.test.jdbc.TestBatchUpdates;
......@@ -579,6 +580,7 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
// jaqu
new AliasMapTest().runTest(this);
new ClobTest().runTest(this);
new SamplesTest().runTest(this);
new UpdateTest().runTest(this);
......
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: James Moger
*/
package org.h2.test.jaqu;
import static org.h2.jaqu.Define.primaryKey;
import static org.h2.jaqu.Define.tableName;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import org.h2.jaqu.Db;
import org.h2.jaqu.Table;
import org.h2.test.TestBase;
/**
* Tests if converting a CLOB to a String works.
*/
public class ClobTest extends TestBase {
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String... args) throws Exception {
new ClobTest().test();
}
public void test() throws Exception {
String create = "CREATE TABLE CLOB_TEST(ID INT PRIMARY KEY, WORDS {0})";
Db db = Db.open("jdbc:h2:mem:", "sa", "sa");
db.executeUpdate(MessageFormat.format(create, "VARCHAR(255)"));
db.insertAll(StringRecord.getList());
testSimpleUpdate(db, "VARCHARs fail");
db.close();
db = Db.open("jdbc:h2:mem:", "sa", "sa");
db.executeUpdate(MessageFormat.format(create, "TEXT"));
db.insertAll(StringRecord.getList());
testSimpleUpdate(db, "CLOBs fail because of single quote artifacts");
db.close();
}
private void testSimpleUpdate(Db db, String failureMsg) {
String newWords = "I changed the words";
StringRecord r = new StringRecord();
StringRecord originalRecord = db.from(r).where(r.id).is(2).selectFirst();
String oldWords = originalRecord.words;
originalRecord.words = newWords;
db.update(originalRecord);
StringRecord r2 = new StringRecord();
StringRecord revisedRecord = db.from(r2).where(r2.id).is(2).selectFirst();
assertEquals(failureMsg, newWords, revisedRecord.words);
// undo update
originalRecord.words = oldWords;
db.update(originalRecord);
}
/**
* A simple class used in this test.
*/
public static class StringRecord implements Table {
public Integer id;
public String words;
public StringRecord() {
// public constructor
}
private StringRecord(int id, String words) {
this.id = id;
this.words = words;
}
public void define() {
tableName("CLOB_TEST");
primaryKey(id);
}
private static StringRecord create(int id, String words) {
return new StringRecord(id, words);
}
public static List<StringRecord> getList() {
StringRecord[] list = {
create(1, "Once upon a midnight dreary, while I pondered weak and weary,"),
create(2, "Over many a quaint and curious volume of forgotten lore,"),
create(3, "While I nodded, nearly napping, suddenly there came a tapping,"),
create(4, "As of some one gently rapping, rapping at my chamber door."),
create(5, "`'Tis some visitor,' I muttered, `tapping at my chamber door -"),
create(6, "Only this, and nothing more.'") };
return Arrays.asList(list);
}
public String toString() {
return id + ": " + words;
}
}
}
......@@ -7,15 +7,18 @@
package org.h2.jaqu.util;
//## Java 1.5 begin ##
import java.io.Reader;
import java.lang.reflect.Constructor;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Clob;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import org.h2.util.IOUtils;
//## Java 1.5 end ##
/**
......@@ -134,6 +137,15 @@ public class Utils {
return o;
}
if (targetType == String.class) {
if (Clob.class.isAssignableFrom(currentType)) {
Clob c = (Clob) o;
try {
Reader r = c.getCharacterStream();
return IOUtils.readStringAndClose(r, -1);
} catch (Exception e) {
throw new RuntimeException("Error converting CLOB to String: " + e.toString(), e);
}
}
return o.toString();
}
if (Number.class.isAssignableFrom(currentType)) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论