package org.nutz.dao.test.normal;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.sql.SQLException;
import org.junit.Test;
import org.nutz.dao.test.DaoCase;
import org.nutz.dao.test.meta.BinObject;
import org.nutz.dao.test.meta.TheGoods;
import org.nutz.dao.util.blob.SimpleClob;
import org.nutz.lang.Files;
import org.nutz.lang.Lang;
import org.nutz.lang.Streams;
public class BinaryDaoTest extends DaoCase {
/**
* @see Issue #119 为何从数据库里面取出二进制数据时会被转成String类型?
*/
@Test
public void test_simple_byte_array() throws IOException {
String path = "org/nutz/dao/test/meta/goods.png";
dao.create(TheGoods.class, true);
TheGoods tg = TheGoods.create("AAA", path);
dao.insert(tg);
// 读取
TheGoods tg2 = dao.fetch(TheGoods.class, tg.getId());
// 比较字节流
byte[] olds = Files.readBytes(path);
byte[] dbs = tg2.getThumbnail();
assertEquals(olds.length, dbs.length);
for (int i = 0; i < olds.length; i++) {
assertEquals(olds[i], dbs[i]);
}
}
@Test
// 如果报错且mysql的话,设置数据库的max_allowed_packet属性哦
public void test_big_blob() throws IOException {
String path = "~/tmp/big.blob";
Files.createFileIfNoExists(path);
OutputStream fos = Streams.fileOut(path);
for (int i = 0; i < 10240; i++) {
fos.write(new byte[1024]);
}
fos.close();
dao.create(TheGoods.class, true);
TheGoods tg = TheGoods.create("AAA", path);
dao.insert(tg);
new File(path).delete();
}
@Test
public void test_blob() throws IOException {
// For mysql only
if (dao.meta().isMySql()) {
dao.create(BinObject.class, true);
BinObject obj = new BinObject();
obj.setXblob(new ByteArrayInputStream("中文".getBytes()));
obj.setXclob(new StringReader("不是英文"));
dao.insert(obj);
BinObject db_obj = dao.fetch(BinObject.class);
assertTrue(Streams.equals(new ByteArrayInputStream("中文".getBytes()), db_obj.getXblob()));
assertEquals("不是英文", Lang.readAll(db_obj.getXclob()));
}
}
//for issue 278
@Test
public void test_clob() throws IOException, SQLException {
dao.create(BinObject.class, true);
BinObject bin = new BinObject();
File f = File.createTempFile("clob", "data");
Files.write(f, "中文");
bin.setMyClob(new SimpleClob(f));
dao.insert(bin);
bin = dao.fetch(BinObject.class);
String str = Lang.readAll(bin.getMyClob().getCharacterStream());
assertEquals("中文", str);
}
}