package jef.database;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import jef.common.log.LogUtil;
import jef.database.dialect.DatabaseDialect;
import jef.database.innerpool.IUserManagedPool;
import jef.database.innerpool.PartitionSupport;
import jef.database.meta.ITableMetadata;
import jef.database.routing.PartitionResult;
/**
* 描述分表后的实际存在表的情况
*
* @author Administrator
*
*/
public class PartitionMetadata implements PartitionSupport{
private IUserManagedPool parent;
public PartitionMetadata(IUserManagedPool parent){
this.parent=parent;
}
public Collection<String> getSubTableNames(String dbkey, ITableMetadata pTable) throws SQLException {
return parent.getMetadata(dbkey).getSubTableNames(pTable);
}
public Collection<String> getDdcNames() {
return parent.getAllDatasourceNames();
}
public DatabaseDialect getProfile(String dbkey) {
return parent.getProfile(dbkey);
}
public void ensureTableExists(String db,String table,ITableMetadata tmeta) throws SQLException {
DbMetaData meta=parent.getMetadata(db);
Collection<String> tables=meta.getSubTableNames(tmeta);
if(tables.contains(table.toUpperCase())){
return;
}
LogUtil.info("Creating table:" + table);
if(meta.createTable(tmeta, table)){
tables.add(table.toUpperCase());
}
}
public boolean isExist(String db, String table,ITableMetadata tmeta) {
DbMetaData meta=parent.getMetadata(db);
Collection<String> tables;
try {
tables = meta.getSubTableNames(tmeta);
return tables.contains(table.toUpperCase());
} catch (SQLException e) {
throw DbUtils.toRuntimeException(e);
}
}
//FIXME 将子表缓存移到这个类来
public PartitionResult[] getSubTableNames(ITableMetadata meta) {
List<PartitionResult> ps = new ArrayList<PartitionResult>();
Collection<String> dbs = getDdcNames();
if (dbs.isEmpty()) {
try {
Collection<String> result = parent.getMetadata(null).getSubTableNames(meta);
if (!result.isEmpty()) {
PartitionResult p = new PartitionResult(result.toArray(new String[result.size()])).setDatabase(null);
ps.add(p);
}
} catch (SQLException e) {
LogUtil.exception(e);
}
} else {
for (String s : dbs) {
try {
Collection<String> result = parent.getMetadata(s).getSubTableNames(meta);
if (!result.isEmpty()) {
PartitionResult p = new PartitionResult(result.toArray(new String[result.size()])).setDatabase(s);
ps.add(p);
}
} catch (SQLException e) {
LogUtil.exception(e);
}
}
}
return ps.toArray(new PartitionResult[ps.size()]);
}
}