package nebula.data.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import nebula.lang.RawTypes;
import nebula.lang.RawTypes;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public abstract class DbConfiguration2 {
private static final Log log = LogFactory.getLog(DbConfiguration2.class);
protected final String driverClass;
protected final String dbURL;
protected final String userName;
protected final String userPassword;
protected Connection conn = null;
protected RealDBTypeDefineBuilder realDBTypeBuilder = new RealDBTypeDefineBuilder();
protected DbConfiguration2(String driverClass, String dbUrl, String userName, String password) {
this.driverClass = driverClass;
this.dbURL = dbUrl;
this.userName = userName;
this.userPassword = password;
}
public void init() {
try {
Class.forName(driverClass).newInstance();
if (log.isTraceEnabled()) {
log.trace("\tload driverClass - " + driverClass);
}
conn = DriverManager.getConnection(this.dbURL, this.userName, this.userPassword);
log.info("== open database - " + this.dbURL);
conn.setAutoCommit(true);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static DbConfiguration2 getEngine(String driverClass, String url, String userName, String password) {
String dbms = url.split(":")[1].toUpperCase();
DbConfiguration2 dbEngine = null;
// if ("DERBY".equals(dbms)) {
// dbEngine = new DerbyConfiguration(driverClass, url, userName,
// password);
// } else if ("ORACLE".equals(dbms)) {
// dbEngine = new OracleConfiguration(driverClass, url, userName,
// password);
// } else if ("POSTGRESQL".equals(dbms)) {
// dbEngine = new OracleConfiguration(driverClass, url, userName,
// password);
// } else {
throw new UnsupportedOperationException();
// }
// dbEngine.init();
// return dbEngine;
}
protected void registerColumnType(RawTypes jdbcType, String columnTypeName) {
realDBTypeBuilder.register(jdbcType, columnTypeName);
}
protected String toColumnDefine(DbColumn column) {
if (column.array) {
return realDBTypeBuilder.build(RawTypes.Text).replaceFirst("\\$l", String.valueOf(column.size));
} else {
String typeName = realDBTypeBuilder.build(column.bizType);
switch (column.bizType) {
case Decimal:
typeName = typeName.replaceFirst("\\$p", String.valueOf(column.precision));
typeName = typeName.replaceFirst("\\$s", String.valueOf(column.scale));
break;
case String:
typeName = typeName.replaceFirst("\\$l", String.valueOf(column.size));
break;
case Text:
typeName = typeName.replaceFirst("\\$l", String.valueOf(column.size));
break;
default:
break;
}
return typeName;
}
}
// public abstract <T extends HasID> Persistence<T> getPersister(Class<T> t,
// Type type);
//
// @SuppressWarnings("unchecked")
// public <T> DbPersister<T> getPersister(Type type, Class<T> clz) {
// if (log.isTraceEnabled()) {
// log.trace("\tload persister [" + type.getName() + "] from connection - " + conn);
// }
// DbPersister<T> executor = null;
//
// DbSqlHelper helper = builderSQLHelper(type);
// BO2DBSerializer<T> serializer = null;
// if (clz == Entity.class) {
// BO2DBSerializer<Entity> entitySerializer = helper.getEntitySerializer();
// serializer = (BO2DBSerializer<T>) entitySerializer;
// }
//
// switch (type.getStandalone()) {
// case Transaction:
// case Relation:
// executor = new DbDefaultPersister<T>(conn, type, helper, serializer);
// break;
//
// default:
// executor = new DbDefaultPersister<T>(conn, type, helper, serializer);
// break;
// }
//
// return executor;
// }
//
// public DbSqlHelper builderSQLHelper(Type type) {
// return new DbSqlHelper(this, type);
// }
public void shutdown() {
try {
if (conn != null) {
conn.commit();
conn.close();
}
log.debug("== database disconnect");
} catch (SQLException e) {
log.debug("Exception When disconnect db");
log.debug(e);
}
}
public Connection getConnection() {
return this.conn;
}
@Override
protected void finalize() throws Throwable {
this.shutdown();
}
}