package com.idega.util.dbschema;
import java.sql.Connection;
import java.sql.Statement;
import com.idega.util.IWTimestamp;
/**
*
*
* Last modified: $Date: 2007/01/12 19:31:31 $ by $Author: idegaweb $
*
* @author <a href="mailto:aron@idega.com">aron</a>
* @version $Revision: 1.1.2.1 $
*/
public class InformixSchemaAdapter extends SQLSchemaAdapter {
InformixSchemaAdapter() {
this.useTransactionsInSchemaCreation = false;
IWTimestamp.CUT_MILLISECONDS_OFF_IN_TOSTRING=false;
}
public String getSQLType(String javaClassName, int maxlength) {
String theReturn;
if (javaClassName.equals("java.lang.Integer")) {
theReturn = "INTEGER";
}
else if (javaClassName.equals("java.lang.String")) {
if (maxlength < 0) {
theReturn = "VARCHAR(255)";
}
else if (maxlength <= 255) {
theReturn = "VARCHAR(" + maxlength + ")";
}
else if (maxlength <= 2000) {
theReturn = "LVARCHAR";
}
else {
theReturn = "TEXT";
}
}
else if (javaClassName.equals("java.lang.Boolean")) {
theReturn = "CHAR(1)";
}
else if (javaClassName.equals("java.lang.Float")) {
theReturn = "FLOAT";
}
else if (javaClassName.equals("java.lang.Double")) {
theReturn = "FLOAT(15)";
}
else if (javaClassName.equals("java.sql.Timestamp")) {
theReturn = "DATETIME YEAR TO FRACTION";
}
else if (javaClassName.equals("java.sql.Date") || javaClassName.equals("java.util.Date")) {
theReturn = "DATE";
}
else if (javaClassName.equals("java.sql.Blob")) {
theReturn = "BYTE";
}
else if (javaClassName.equals("java.sql.Time")) {
theReturn = "DATETIME HOUR TO FRACTION";
}
else if (javaClassName.equals("com.idega.util.Gender")) {
theReturn = "VARCHAR(1)";
}
else if (javaClassName.equals("com.idega.data.BlobWrapper")) {
theReturn = "BYTE";
}
else {
theReturn = "";
}
return theReturn;
}
public String getIDColumnType(Schema entity) {
return "SERIAL";
}
/**
* On Informix the generated ID column is implemented as a serial column and no Trigger not used yet
*/
public void createTrigger(Schema entity) throws Exception {
createSequence(entity);
}
public void createSequence(Schema entity) throws Exception {
String sql = "create table " + this.getInformixSequenceTableName(entity) + "(" + entity.getPrimaryKey().getColumn().getSQLName() + " serial)";
executeUpdate(sql);
}
public void removeSchema( Schema entity) throws Exception {
/**
* @todo change
*/
//deleteTrigger(entity);
deleteSequence(entity);
super.removeSchema(entity);
}
protected void deleteSequence(Schema entity) throws Exception {
executeUpdate("drop table " + this.getInformixSequenceTableName(entity));
}
/**
**Creates a unique ID for the ID column
**/
public int createUniqueID(Schema entity) throws Exception {
int returnInt = -1;
//String query = "insert into " + this.getInformixSequenceTableName(entity) + "(" + entity.getIDColumnName() + ") values (0)";
String query = "insert into " + this.getInformixSequenceTableName(entity) + "(" + entity.getPrimaryKey().getColumn().getSQLName()+ ") values (0)";
Connection conn = null;
Statement stmt = null;
try {
conn = getConnection();
stmt = conn.createStatement();
stmt.executeUpdate(query);
com.informix.jdbc.IfxStatement ifxStatement = (com.informix.jdbc.IfxStatement) stmt;
returnInt = ifxStatement.getSerial();
}
finally {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
freeConnection(conn);
}
}
return returnInt;
}
private String getInformixSequenceTableName(Schema entity) {
String entityName = entity.getSQLName();
return entityName + "_seq";
}
/*protected void insertBlob(IDOLegacyEntity entity)throws Exception{
checkBlobTable();
int id = insertIntoBlobTable(entity);
System.out.print("id from blob = "+id);
//this.updateRealTable(id,entity);
}*/
protected void createForeignKey(
String baseTableName,
String columnName,
String refrencingTableName,
String referencingColumnName)
throws Exception {
String SQLCommand =
"ALTER TABLE "
+ baseTableName
+ " ADD CONSTRAINT FOREIGN KEY ("
+ columnName
+ ") REFERENCES "
+ refrencingTableName
+ "("
+ referencingColumnName
+ ")";
executeUpdate( SQLCommand);
}
protected String getCreatePrimaryKeyStatementBeginning(String tableName) {
return "alter table " + tableName + " add constraint primary key (";
}
}