package jef.database.dialect;
import java.sql.SQLException;
import javax.persistence.PersistenceException;
import jef.common.log.LogUtil;
import jef.database.ConnectInfo;
import jef.database.DbMetaData;
/**
* 自动检查和适配SQLServer不同版本的方言
*
* @author jiyi
*
*/
public class SQLServerDialect extends AbstractDelegatingDialect {
@Override
public String generateUrl(String host, int port, String pathOrName) {
if (this.dialect == null) {
createDefaultDialect();
}
return dialect.generateUrl(host, port, pathOrName);
}
private void createDefaultDialect() {
DatabaseDialect dialect = new SQLServer2005Dialect();
try {
Class.forName(dialect.getDriverClass(""));
this.dialect = dialect; // 暂时先作为2005处理,后续根据版本号再升级为2012和2014
} catch (ClassNotFoundException e) {
dialect = new SQLServer2000Dialect();
}
}
@Override
public void parseDbInfo(ConnectInfo connectInfo) {
if (dialect == null) {
if (connectInfo.getUrl().startsWith("jdbc:microsoft:")) {
dialect = new SQLServer2000Dialect();
} else {
dialect = new SQLServer2005Dialect();
dialect.parseDbInfo(connectInfo);
return;
}
}
super.parseDbInfo(connectInfo);
}
@Override
public String getDriverClass(String url) {
if (this.dialect == null) {
createDefaultDialect();
}
return super.getDriverClass(url);
}
/**
* 根据数据库版本信息判断当前数据库实际应该用哪个方言
*/
@Override
public void accept(DbMetaData meta) {
try{
String version=meta.getDatabaseVersion();
int index=version.indexOf('.');
if(index==-1){
return;
}
int ver=Integer.parseInt(version.substring(0,index));
switch(ver){
case 9:
if(!(dialect instanceof SQLServer2005Dialect)){
this.dialect=new SQLServer2005Dialect();
LogUtil.info("Determin SQL-Server Dialect to [{}]",dialect.getClass());
}
break;
case 10:
//10.0=2008, 10.5=2008 R2
this.dialect=new SQLServer2008Dialect();
LogUtil.info("Determin SQL-Server Dialect to [{}]",dialect.getClass());
break;
case 11:
//version 11= SQLServer 2012
case 12:
//version 12= SQLServer 2014
case 13:
//???
case 14:
//???
case 15:
//???
case 16:
//???
case 17:
this.dialect=new SQLServer2012Dialect();
LogUtil.info("Determin SQL-Server Dialect to [{}]",dialect.getClass());
break;
}
}catch(SQLException e){
throw new PersistenceException(e);
}
super.accept(meta);
}
}