package jef.database.meta;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import jef.database.DbClient;
import jef.database.DbMetaData;
import jef.database.DbMetaData.ObjectType;
import jef.database.Session;
import jef.database.test.DataSource;
import jef.database.test.DataSourceContext;
import jef.database.test.IgnoreOn;
import jef.database.test.JefJUnit4DatabaseTestRunner;
import jef.tools.StringUtils;
import org.apache.commons.lang.ArrayUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(JefJUnit4DatabaseTestRunner.class)
@DataSourceContext({
@DataSource(name="oracle",url="${oracle.url}",user="${oracle.user}",password="${oracle.password}"),
@DataSource(name = "mysql", url = "${mysql.url}", user = "${mysql.user}", password = "${mysql.password}"),
@DataSource(name="postgresql",url="${postgresql.url}",user="${postgresql.user}",password="${postgresql.password}"),
@DataSource(name="derby",url="jdbc:derby:./db;create=true"),
@DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = ""),
@DataSource(name = "sqlite", url = "jdbc:sqlite:test.db?date_string_format=yyyy-MM-dd HH:mm:ss"),
@DataSource(name = "sqlserver", url = "${sqlserver.url}",user="${sqlserver.user}",password="${sqlserver.password}")
})
public class MetadataTest extends org.junit.Assert{
private DbClient db;
private static final String[] SQLS={"CREATE TABLE t1 (c1 int PRIMARY KEY,c2 int not null)",
"ALTER TABLE t1 add CONSTRAINT test_111 UNIQUE (c2)",
"CREATE TABLE t2 (c1 int PRIMARY KEY,c2 int REFERENCES t1(c2) on delete set null)",
"CREATE TABLE t3 (c1 int, c2 int, CONSTRAINT t1_fk FOREIGN KEY (c1) REFERENCES t1)"
};
@Test
public void testMetaData() throws Exception{
DbMetaData meta=db.getMetaData(null);
int i=0;
for(TableInfo e:meta.getTables()){
i++;
System.out.println(e.getName()+":"+e.getRemarks());
List<Column> columns=meta.getColumns(e.getName());
for(Column c:columns){
if(StringUtils.isNotEmpty(c.getColumnDef())){
System.out.println("["+c.getColumnDef()+"]");
}
}
if(i>5)
break;
}
}
@Test
public void initSchema() throws SQLException{
db.dropTable("t1");
db.dropTable("t2");
db.dropTable("t3");
for(String s: SQLS){
try{
db.executeSql(s);
}catch(SQLException e){
System.out.println(e.getSQLState());
}
}
}
@Test
@IgnoreOn("sqlite")
public void testMeta() throws SQLException {
List<ForeignKey> fk=db.getMetaData(null).getForeignKey("T3");
for(ForeignKey k: fk){
System.out.println("===============");
System.out.println(k.toString());
System.out.println(k.toCreateSql(db.getProfile()));
System.out.println(k.getPkName());
}
}
/**
* Schema测试
* @throws SQLException
*/
@Test
@IgnoreOn({"mysql","sqlite"})
public void testSchema() throws SQLException {
Session s=db;
DbMetaData meta=s.getNoTransactionSession().getMetaData(null);
String[] schemas=meta.getSchemas();
assertTrue(schemas.length>0);
if(meta.getCurrentSchema()!=null){
assertTrue(ArrayUtils.contains(schemas, meta.getCurrentSchema()));
}
List<TableInfo> tables=meta.getTables();
if(!tables.isEmpty()){
String name=tables.get(0).getName();
for(Index indexInfo:meta.getIndexes(name)){
System.out.println(indexInfo.toString());
System.out.println("索引名称:"+indexInfo.getIndexName());
System.out.println("索引字段:"+Arrays.toString(indexInfo.getColumnNames()));
System.out.println("是否唯一:"+indexInfo.isUnique());
}
}
meta.getFunctions(null);
}
/**
* 测试目的:当{@code schema}不为{@code null}时,判断SEQUENCE存在与否是否正确。<br/>
* 预期结果:{@code schema}应是不区分大小写的。
*
* @throws SQLException
*/
@Test
@IgnoreOn("hsqldb")
public void testExistSequenceWithSchema() throws SQLException {
DbMetaData meta = db.getMetaData(null);
if(meta.supportsSequence()){
String schema = meta.getCurrentSchema();
String seqName = "seq_test_for_exist";
createSequence(schema, seqName);
boolean exist = meta.existsInSchema(ObjectType.SEQUENCE, StringUtils.upperCase(schema), seqName);
Assert.assertTrue(exist);
exist = meta.existsInSchema(ObjectType.SEQUENCE,StringUtils.lowerCase(schema), seqName);
Assert.assertTrue(exist);
dropSequence(schema + "." + seqName);
Assert.assertFalse(meta.existsInSchema(ObjectType.SEQUENCE, schema, seqName));
}
}
private void createSequence(String schema, String seqName) throws SQLException {
db.getMetaData(null).createSequence(schema, seqName, 1, 999999999L);
}
private void dropSequence(String seqName) throws SQLException {
db.executeSql("drop sequence " + seqName);
}
/**
* 测试目的:当{@code schema}为{@code null}时,判断SEQUENCE存在与否是否正确。<br/>
*
* @throws SQLException
*/
@Test
@IgnoreOn("hsqldb")
public void testExistSequenceWithoutSchema() throws SQLException {
DbMetaData meta = db.getMetaData(null);
if(meta.supportsSequence()){
String seqName = "seq_test_for_exist";
createSequence(null, seqName);
Assert.assertTrue(meta.exists(ObjectType.SEQUENCE, seqName));
dropSequence(seqName);
Assert.assertFalse(meta.exists(ObjectType.SEQUENCE, seqName));
}
}
@Test
public void testFunctionTest() throws SQLException{
DbMetaData meta = db.getMetaData(null);
meta.getFunctions("");
}
}