IDEMPIERE-4180 Add DDL and Data Type methods to AdempiereDatabase interface
This commit is contained in:
parent
26e764c2a2
commit
4a436c5157
|
@ -25,6 +25,8 @@ import java.sql.Timestamp;
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
import org.compiere.dbPort.Convert;
|
import org.compiere.dbPort.Convert;
|
||||||
|
import org.compiere.model.MColumn;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
|
|
||||||
//import org.compiere.util.CPreparedStatement;
|
//import org.compiere.util.CPreparedStatement;
|
||||||
|
@ -301,14 +303,6 @@ public interface AdempiereDatabase
|
||||||
*/
|
*/
|
||||||
public boolean isQueryTimeoutSupported();
|
public boolean isQueryTimeoutSupported();
|
||||||
|
|
||||||
/**
|
|
||||||
* Get Data Type
|
|
||||||
* @param DisplayType display type
|
|
||||||
* @return data type
|
|
||||||
*/
|
|
||||||
// public String getDataType (int displayType, int precision,
|
|
||||||
// boolean defaultValue)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default sql use to test whether a connection is still valid
|
* Default sql use to test whether a connection is still valid
|
||||||
*/
|
*/
|
||||||
|
@ -369,5 +363,103 @@ public interface AdempiereDatabase
|
||||||
public default boolean isNativeMode() {
|
public default boolean isNativeMode() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return numeric data type name
|
||||||
|
*/
|
||||||
|
public String getNumericDataType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return fixed lenght character data type name
|
||||||
|
*/
|
||||||
|
public String getCharacterDataType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return variable length character data type name
|
||||||
|
*/
|
||||||
|
public String getVarcharDataType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return binary large object data type name
|
||||||
|
*/
|
||||||
|
public String getBlobDataType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return character large object data type name
|
||||||
|
*/
|
||||||
|
public String getClobDataType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return time stamp data type name
|
||||||
|
*/
|
||||||
|
public String getTimestampDataType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get SQL Create
|
||||||
|
* @param table
|
||||||
|
* @return create table DDL
|
||||||
|
*/
|
||||||
|
public default String getSQLCreate(MTable table)
|
||||||
|
{
|
||||||
|
StringBuffer sb = new StringBuffer("CREATE TABLE ")
|
||||||
|
.append(table.getTableName()).append(" (");
|
||||||
|
//
|
||||||
|
StringBuffer constraints = new StringBuffer();
|
||||||
|
MColumn[] columns = table.getColumns(true);
|
||||||
|
boolean columnAdded = false;
|
||||||
|
for (int i = 0; i < columns.length; i++)
|
||||||
|
{
|
||||||
|
MColumn column = columns[i];
|
||||||
|
String colSQL = column.getSQLDDL();
|
||||||
|
if ( colSQL != null )
|
||||||
|
{
|
||||||
|
if (columnAdded)
|
||||||
|
sb.append(", ");
|
||||||
|
else
|
||||||
|
columnAdded = true;
|
||||||
|
sb.append(column.getSQLDDL());
|
||||||
|
}
|
||||||
|
else // virtual column
|
||||||
|
continue;
|
||||||
|
//
|
||||||
|
String constraint = column.getConstraint(table.getTableName());
|
||||||
|
if (constraint != null && constraint.length() > 0)
|
||||||
|
constraints.append(", ").append(constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.append(constraints)
|
||||||
|
.append(")");
|
||||||
|
return sb.toString();
|
||||||
|
} // getSQLCreate
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param column
|
||||||
|
* @return ddl sql for column
|
||||||
|
*/
|
||||||
|
public String getSQLDDL(MColumn column);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param table
|
||||||
|
* @param column
|
||||||
|
* @return add column sql
|
||||||
|
*/
|
||||||
|
public String getSQLAdd(MTable table, MColumn column);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param table
|
||||||
|
* @param column
|
||||||
|
* @param setNullOption
|
||||||
|
* @return alter column sql
|
||||||
|
*/
|
||||||
|
public String getSQLModify (MTable table, MColumn column, boolean setNullOption);
|
||||||
|
|
||||||
} // AdempiereDatabase
|
} // AdempiereDatabase
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import org.adempiere.exceptions.DBException;
|
import org.adempiere.exceptions.DBException;
|
||||||
|
import org.compiere.db.AdempiereDatabase;
|
||||||
import org.compiere.db.Database;
|
import org.compiere.db.Database;
|
||||||
import org.compiere.util.CCache;
|
import org.compiere.util.CCache;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
|
@ -507,16 +508,11 @@ public class MColumn extends X_AD_Column
|
||||||
*/
|
*/
|
||||||
public String getSQLAdd (MTable table)
|
public String getSQLAdd (MTable table)
|
||||||
{
|
{
|
||||||
StringBuilder sql = new StringBuilder ("ALTER TABLE ")
|
AdempiereDatabase db = DB.getDatabase();
|
||||||
.append(table.getTableName())
|
if (db.isNativeMode())
|
||||||
.append(" ADD ").append(getSQLDDL());
|
return db.getSQLAdd(table, this);
|
||||||
String constraint = getConstraint(table.getTableName());
|
else
|
||||||
if (constraint != null && constraint.length() > 0) {
|
return Database.getDatabase(Database.DB_ORACLE).getSQLAdd(table, this);
|
||||||
sql.append(DB.SQLSTATEMENT_SEPARATOR).append("ALTER TABLE ")
|
|
||||||
.append(table.getTableName())
|
|
||||||
.append(" ADD ").append(constraint);
|
|
||||||
}
|
|
||||||
return sql.toString();
|
|
||||||
} // getSQLAdd
|
} // getSQLAdd
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -528,44 +524,11 @@ public class MColumn extends X_AD_Column
|
||||||
if (isVirtualColumn())
|
if (isVirtualColumn())
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
StringBuilder sql = new StringBuilder ().append(getColumnName())
|
AdempiereDatabase db = DB.getDatabase();
|
||||||
.append(" ").append(getSQLDataType());
|
if (db.isNativeMode())
|
||||||
|
return db.getSQLDDL(this);
|
||||||
// Default
|
|
||||||
String defaultValue = getDefaultValue();
|
|
||||||
if (defaultValue != null
|
|
||||||
&& defaultValue.length() > 0
|
|
||||||
&& defaultValue.indexOf('@') == -1 // no variables
|
|
||||||
&& ( ! (DisplayType.isID(getAD_Reference_ID()) && defaultValue.equals("-1") ) ) ) // not for ID's with default -1
|
|
||||||
{
|
|
||||||
if (DisplayType.isText(getAD_Reference_ID())
|
|
||||||
|| getAD_Reference_ID() == DisplayType.List
|
|
||||||
|| getAD_Reference_ID() == DisplayType.YesNo
|
|
||||||
// Two special columns: Defined as Table but DB Type is String
|
|
||||||
|| getColumnName().equals("EntityType") || getColumnName().equals("AD_Language")
|
|
||||||
|| (getAD_Reference_ID() == DisplayType.Button &&
|
|
||||||
!(getColumnName().endsWith("_ID"))))
|
|
||||||
{
|
|
||||||
if (!defaultValue.startsWith("'") && !defaultValue.endsWith("'"))
|
|
||||||
defaultValue = DB.TO_STRING(defaultValue);
|
|
||||||
}
|
|
||||||
sql.append(" DEFAULT ").append(defaultValue);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
return Database.getDatabase(Database.DB_ORACLE).getSQLDDL(this);
|
||||||
if (! isMandatory())
|
|
||||||
sql.append(" DEFAULT NULL ");
|
|
||||||
defaultValue = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inline Constraint
|
|
||||||
if (getAD_Reference_ID() == DisplayType.YesNo)
|
|
||||||
sql.append(" CHECK (").append(getColumnName()).append(" IN ('Y','N'))");
|
|
||||||
|
|
||||||
// Null
|
|
||||||
if (isMandatory())
|
|
||||||
sql.append(" NOT NULL");
|
|
||||||
return sql.toString();
|
|
||||||
} // getSQLDDL
|
} // getSQLDDL
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -576,66 +539,11 @@ public class MColumn extends X_AD_Column
|
||||||
*/
|
*/
|
||||||
public String getSQLModify (MTable table, boolean setNullOption)
|
public String getSQLModify (MTable table, boolean setNullOption)
|
||||||
{
|
{
|
||||||
StringBuilder sql = new StringBuilder();
|
AdempiereDatabase db = DB.getDatabase();
|
||||||
StringBuilder sqlBase = new StringBuilder ("ALTER TABLE ")
|
if (db.isNativeMode())
|
||||||
.append(table.getTableName())
|
return db.getSQLModify(table, this, setNullOption);
|
||||||
.append(" MODIFY ").append(getColumnName());
|
|
||||||
|
|
||||||
// Default
|
|
||||||
StringBuilder sqlDefault = new StringBuilder(sqlBase)
|
|
||||||
.append(" ").append(getSQLDataType());
|
|
||||||
String defaultValue = getDefaultValue();
|
|
||||||
if (defaultValue != null
|
|
||||||
&& defaultValue.length() > 0
|
|
||||||
&& defaultValue.indexOf('@') == -1 // no variables
|
|
||||||
&& ( ! (DisplayType.isID(getAD_Reference_ID()) && defaultValue.equals("-1") ) ) ) // not for ID's with default -1
|
|
||||||
{
|
|
||||||
if (DisplayType.isText(getAD_Reference_ID())
|
|
||||||
|| getAD_Reference_ID() == DisplayType.List
|
|
||||||
|| getAD_Reference_ID() == DisplayType.YesNo
|
|
||||||
// Two special columns: Defined as Table but DB Type is String
|
|
||||||
|| getColumnName().equals("EntityType") || getColumnName().equals("AD_Language")
|
|
||||||
|| (getAD_Reference_ID() == DisplayType.Button &&
|
|
||||||
!(getColumnName().endsWith("_ID"))))
|
|
||||||
{
|
|
||||||
if (!defaultValue.startsWith("'") && !defaultValue.endsWith("'"))
|
|
||||||
defaultValue = DB.TO_STRING(defaultValue);
|
|
||||||
}
|
|
||||||
sqlDefault.append(" DEFAULT ").append(defaultValue);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
return Database.getDatabase(Database.DB_ORACLE).getSQLModify(table, this, setNullOption);
|
||||||
if (! isMandatory())
|
|
||||||
sqlDefault.append(" DEFAULT NULL ");
|
|
||||||
defaultValue = null;
|
|
||||||
}
|
|
||||||
sql.append(sqlDefault);
|
|
||||||
|
|
||||||
// Constraint
|
|
||||||
|
|
||||||
// Null Values
|
|
||||||
if (isMandatory() && defaultValue != null && defaultValue.length() > 0)
|
|
||||||
{
|
|
||||||
StringBuilder sqlSet = new StringBuilder("UPDATE ")
|
|
||||||
.append(table.getTableName())
|
|
||||||
.append(" SET ").append(getColumnName())
|
|
||||||
.append("=").append(defaultValue)
|
|
||||||
.append(" WHERE ").append(getColumnName()).append(" IS NULL");
|
|
||||||
sql.append(DB.SQLSTATEMENT_SEPARATOR).append(sqlSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Null
|
|
||||||
if (setNullOption)
|
|
||||||
{
|
|
||||||
StringBuilder sqlNull = new StringBuilder(sqlBase);
|
|
||||||
if (isMandatory())
|
|
||||||
sqlNull.append(" NOT NULL");
|
|
||||||
else
|
|
||||||
sqlNull.append(" NULL");
|
|
||||||
sql.append(DB.SQLSTATEMENT_SEPARATOR).append(sqlNull);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
return sql.toString();
|
|
||||||
} // getSQLModify
|
} // getSQLModify
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -32,6 +32,7 @@ import java.util.logging.Level;
|
||||||
import org.adempiere.base.IModelFactory;
|
import org.adempiere.base.IModelFactory;
|
||||||
import org.adempiere.base.Service;
|
import org.adempiere.base.Service;
|
||||||
import org.adempiere.model.GenericPO;
|
import org.adempiere.model.GenericPO;
|
||||||
|
import org.compiere.db.AdempiereDatabase;
|
||||||
import org.compiere.db.Database;
|
import org.compiere.db.Database;
|
||||||
import org.compiere.util.CCache;
|
import org.compiere.util.CCache;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
|
@ -577,60 +578,11 @@ public class MTable extends X_AD_Table
|
||||||
*/
|
*/
|
||||||
public String getSQLCreate()
|
public String getSQLCreate()
|
||||||
{
|
{
|
||||||
StringBuffer sb = new StringBuffer("CREATE TABLE ")
|
AdempiereDatabase db = DB.getDatabase();
|
||||||
.append(getTableName()).append(" (");
|
if (db.isNativeMode())
|
||||||
//
|
return db.getSQLCreate(this);
|
||||||
// boolean hasPK = false;
|
else
|
||||||
// boolean hasParents = false;
|
return Database.getDatabase(Database.DB_ORACLE).getSQLCreate(this);
|
||||||
StringBuffer constraints = new StringBuffer();
|
|
||||||
getColumns(true);
|
|
||||||
boolean columnAdded = false;
|
|
||||||
for (int i = 0; i < m_columns.length; i++)
|
|
||||||
{
|
|
||||||
MColumn column = m_columns[i];
|
|
||||||
String colSQL = column.getSQLDDL();
|
|
||||||
if ( colSQL != null )
|
|
||||||
{
|
|
||||||
if (columnAdded)
|
|
||||||
sb.append(", ");
|
|
||||||
else
|
|
||||||
columnAdded = true;
|
|
||||||
sb.append(column.getSQLDDL());
|
|
||||||
}
|
|
||||||
else // virtual column
|
|
||||||
continue;
|
|
||||||
//
|
|
||||||
// if (column.isKey())
|
|
||||||
// hasPK = true;
|
|
||||||
// if (column.isParent())
|
|
||||||
// hasParents = true;
|
|
||||||
String constraint = column.getConstraint(getTableName());
|
|
||||||
if (constraint != null && constraint.length() > 0)
|
|
||||||
constraints.append(", ").append(constraint);
|
|
||||||
}
|
|
||||||
/* IDEMPIERE-1901 - deprecate code that create composite primary key
|
|
||||||
// Multi Column PK
|
|
||||||
if (!hasPK && hasParents)
|
|
||||||
{
|
|
||||||
StringBuffer cols = new StringBuffer();
|
|
||||||
for (int i = 0; i < m_columns.length; i++)
|
|
||||||
{
|
|
||||||
MColumn column = m_columns[i];
|
|
||||||
if (!column.isParent())
|
|
||||||
continue;
|
|
||||||
if (cols.length() > 0)
|
|
||||||
cols.append(", ");
|
|
||||||
cols.append(column.getColumnName());
|
|
||||||
}
|
|
||||||
sb.append(", CONSTRAINT ")
|
|
||||||
.append(getTableName()).append("_Key PRIMARY KEY (")
|
|
||||||
.append(cols).append(")");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
sb.append(constraints)
|
|
||||||
.append(")");
|
|
||||||
return sb.toString();
|
|
||||||
} // getSQLCreate
|
} // getSQLCreate
|
||||||
|
|
||||||
// globalqss
|
// globalqss
|
||||||
|
|
|
@ -68,6 +68,8 @@ import java.util.logging.Level;
|
||||||
|
|
||||||
import org.adempiere.base.IDisplayTypeFactory;
|
import org.adempiere.base.IDisplayTypeFactory;
|
||||||
import org.adempiere.base.Service;
|
import org.adempiere.base.Service;
|
||||||
|
import org.compiere.db.AdempiereDatabase;
|
||||||
|
import org.compiere.db.Database;
|
||||||
import org.compiere.model.MLanguage;
|
import org.compiere.model.MLanguage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -602,6 +604,15 @@ public final class DisplayType
|
||||||
return Object.class;
|
return Object.class;
|
||||||
} // getClass
|
} // getClass
|
||||||
|
|
||||||
|
private static final AdempiereDatabase getDatabase()
|
||||||
|
{
|
||||||
|
AdempiereDatabase db = DB.getDatabase();
|
||||||
|
if (db.isNativeMode())
|
||||||
|
return db;
|
||||||
|
else
|
||||||
|
return Database.getDatabase(Database.DB_ORACLE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get SQL DataType
|
* Get SQL DataType
|
||||||
* @param displayType AD_Reference_ID
|
* @param displayType AD_Reference_ID
|
||||||
|
@ -613,51 +624,51 @@ public final class DisplayType
|
||||||
{
|
{
|
||||||
if (columnName.equals("EntityType")
|
if (columnName.equals("EntityType")
|
||||||
|| columnName.equals ("AD_Language"))
|
|| columnName.equals ("AD_Language"))
|
||||||
return "VARCHAR2(" + fieldLength + ")";
|
return getDatabase().getVarcharDataType() + "(" + fieldLength + ")";
|
||||||
// ID
|
// ID
|
||||||
if (DisplayType.isID(displayType))
|
if (DisplayType.isID(displayType))
|
||||||
{
|
{
|
||||||
if (displayType == DisplayType.Image // FIXTHIS
|
if (displayType == DisplayType.Image // FIXTHIS
|
||||||
&& columnName.equals("BinaryData"))
|
&& columnName.equals("BinaryData"))
|
||||||
return "BLOB";
|
return getDatabase().getBlobDataType();
|
||||||
// ID, CreatedBy/UpdatedBy, Acct
|
// ID, CreatedBy/UpdatedBy, Acct
|
||||||
else if (columnName.endsWith("_ID")
|
else if (columnName.endsWith("_ID")
|
||||||
|| columnName.endsWith("tedBy")
|
|| columnName.endsWith("tedBy")
|
||||||
|| columnName.endsWith("_Acct") )
|
|| columnName.endsWith("_Acct") )
|
||||||
return "NUMBER(10)";
|
return getDatabase().getNumericDataType()+"(10)";
|
||||||
else if (fieldLength < 4)
|
else if (fieldLength < 4)
|
||||||
return "CHAR(" + fieldLength + ")";
|
return getDatabase().getCharacterDataType()+"(" + fieldLength + ")";
|
||||||
else // EntityType, AD_Language fallback
|
else // EntityType, AD_Language fallback
|
||||||
return "VARCHAR2(" + fieldLength + ")";
|
return getDatabase().getVarcharDataType()+"(" + fieldLength + ")";
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
if (displayType == DisplayType.Integer)
|
if (displayType == DisplayType.Integer)
|
||||||
return "NUMBER(10)";
|
return getDatabase().getNumericDataType()+"(10)";
|
||||||
if (DisplayType.isDate(displayType))
|
if (DisplayType.isDate(displayType))
|
||||||
return "DATE";
|
return getDatabase().getTimestampDataType();
|
||||||
if (DisplayType.isNumeric(displayType))
|
if (DisplayType.isNumeric(displayType))
|
||||||
return "NUMBER";
|
return getDatabase().getNumericDataType();
|
||||||
if (displayType == DisplayType.Binary)
|
if (displayType == DisplayType.Binary)
|
||||||
return "BLOB";
|
return getDatabase().getBlobDataType();
|
||||||
if (displayType == DisplayType.TextLong
|
if (displayType == DisplayType.TextLong
|
||||||
|| (displayType == DisplayType.Text && fieldLength >= 4000))
|
|| (displayType == DisplayType.Text && fieldLength >= 4000))
|
||||||
return "CLOB";
|
return getDatabase().getClobDataType();
|
||||||
if (displayType == DisplayType.YesNo)
|
if (displayType == DisplayType.YesNo)
|
||||||
return "CHAR(1)";
|
return getDatabase().getCharacterDataType()+"(1)";
|
||||||
if (displayType == DisplayType.List || displayType == DisplayType.Payment) {
|
if (displayType == DisplayType.List || displayType == DisplayType.Payment) {
|
||||||
if (fieldLength == 1)
|
if (fieldLength == 1)
|
||||||
return "CHAR(" + fieldLength + ")";
|
return getDatabase().getCharacterDataType()+"(" + fieldLength + ")";
|
||||||
else
|
else
|
||||||
return "VARCHAR2(" + fieldLength + ")";
|
return getDatabase().getVarcharDataType()+"(" + fieldLength + ")";
|
||||||
}
|
}
|
||||||
if (displayType == DisplayType.Color)
|
if (displayType == DisplayType.Color)
|
||||||
return "VARCHAR2(" + fieldLength + ")";
|
return getDatabase().getVarcharDataType()+"(" + fieldLength + ")";
|
||||||
if (displayType == DisplayType.Button)
|
if (displayType == DisplayType.Button)
|
||||||
{
|
{
|
||||||
if (columnName.endsWith("_ID"))
|
if (columnName.endsWith("_ID"))
|
||||||
return "NUMBER(10)";
|
return getDatabase().getNumericDataType()+"(10)";
|
||||||
else
|
else
|
||||||
return "CHAR(" + fieldLength + ")";
|
return getDatabase().getCharacterDataType()+"(" + fieldLength + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
|
List<IDisplayTypeFactory> factoryList = Service.locator().list(IDisplayTypeFactory.class).getServices();
|
||||||
|
@ -671,9 +682,9 @@ public final class DisplayType
|
||||||
s_log.severe("Unhandled Data Type = " + displayType);
|
s_log.severe("Unhandled Data Type = " + displayType);
|
||||||
|
|
||||||
if (columnName.endsWith("_ID"))
|
if (columnName.endsWith("_ID"))
|
||||||
return "NUMBER(10)";
|
return getDatabase().getNumericDataType()+"(10)";
|
||||||
|
|
||||||
return "VARCHAR2(" + fieldLength + ")";
|
return getDatabase().getVarcharDataType()+"(" + fieldLength + ")";
|
||||||
} // getSQLDataType
|
} // getSQLDataType
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -46,6 +46,8 @@ import org.adempiere.exceptions.DBException;
|
||||||
import org.compiere.Adempiere;
|
import org.compiere.Adempiere;
|
||||||
import org.compiere.dbPort.Convert;
|
import org.compiere.dbPort.Convert;
|
||||||
import org.compiere.dbPort.Convert_Oracle;
|
import org.compiere.dbPort.Convert_Oracle;
|
||||||
|
import org.compiere.model.MColumn;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
|
@ -909,106 +911,12 @@ public class DB_Oracle implements AdempiereDatabase
|
||||||
* @param precision precision
|
* @param precision precision
|
||||||
* @param defaultValue if true adds default value
|
* @param defaultValue if true adds default value
|
||||||
* @return data type
|
* @return data type
|
||||||
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
public String getDataType (String columnName, int displayType, int precision,
|
public String getDataType (String columnName, int displayType, int precision,
|
||||||
boolean defaultValue)
|
boolean defaultValue)
|
||||||
{
|
{
|
||||||
String retValue = null;
|
return DisplayType.getSQLDataType(displayType, columnName, precision);
|
||||||
//handle special case, bug [ 1618423 ]
|
|
||||||
if (columnName != null)
|
|
||||||
{
|
|
||||||
if (displayType == DisplayType.Button
|
|
||||||
&& columnName.endsWith("_ID"))
|
|
||||||
{
|
|
||||||
retValue = "NUMBER(10)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (retValue == null)
|
|
||||||
{
|
|
||||||
switch (displayType)
|
|
||||||
{
|
|
||||||
// IDs
|
|
||||||
case DisplayType.Account:
|
|
||||||
case DisplayType.Assignment:
|
|
||||||
case DisplayType.ID:
|
|
||||||
case DisplayType.Location:
|
|
||||||
case DisplayType.Locator:
|
|
||||||
case DisplayType.PAttribute:
|
|
||||||
case DisplayType.Search:
|
|
||||||
case DisplayType.Table:
|
|
||||||
case DisplayType.TableDir:
|
|
||||||
case DisplayType.Image:
|
|
||||||
case DisplayType.Chart:
|
|
||||||
retValue = "NUMBER(10)";
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Dynamic Precision
|
|
||||||
case DisplayType.Amount:
|
|
||||||
retValue = "NUMBER";
|
|
||||||
if (defaultValue)
|
|
||||||
retValue += " DEFAULT 0";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DisplayType.Binary:
|
|
||||||
retValue = "BLOB";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DisplayType.Button:
|
|
||||||
retValue = "CHAR(1)";
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Number Dynamic Precision
|
|
||||||
case DisplayType.CostPrice:
|
|
||||||
retValue = "NUMBER";
|
|
||||||
if (defaultValue)
|
|
||||||
retValue += " DEFAULT 0";
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Date
|
|
||||||
case DisplayType.Date:
|
|
||||||
case DisplayType.DateTime:
|
|
||||||
case DisplayType.Time:
|
|
||||||
retValue = "DATE";
|
|
||||||
if (defaultValue)
|
|
||||||
retValue += " DEFAULT getDate()";
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Number(10)
|
|
||||||
case DisplayType.Integer:
|
|
||||||
retValue = "NUMBER(10)";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DisplayType.List:
|
|
||||||
retValue = "CHAR(" + precision + ")";
|
|
||||||
break;
|
|
||||||
|
|
||||||
// NVARCHAR
|
|
||||||
case DisplayType.Color:
|
|
||||||
case DisplayType.Memo:
|
|
||||||
case DisplayType.String:
|
|
||||||
case DisplayType.Text:
|
|
||||||
retValue = "NVARCHAR(" + precision + ")";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DisplayType.TextLong:
|
|
||||||
retValue = "CLOB";
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Dyn Prec
|
|
||||||
case DisplayType.Quantity:
|
|
||||||
retValue = "NUMBER";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DisplayType.YesNo:
|
|
||||||
retValue = "CHAR(1)";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
log.severe("Unknown: " + displayType);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return retValue;
|
|
||||||
} // getDataType
|
} // getDataType
|
||||||
|
|
||||||
|
|
||||||
|
@ -1447,4 +1355,167 @@ public class DB_Oracle implements AdempiereDatabase
|
||||||
|
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNumericDataType() {
|
||||||
|
return "NUMBER";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCharacterDataType() {
|
||||||
|
return "CHAR";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getVarcharDataType() {
|
||||||
|
return "VARCHAR2";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getBlobDataType() {
|
||||||
|
return "BLOB";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClobDataType() {
|
||||||
|
return "CLOB";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTimestampDataType() {
|
||||||
|
return "DATE";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSQLDDL(MColumn column) {
|
||||||
|
StringBuilder sql = new StringBuilder ().append(column.getColumnName())
|
||||||
|
.append(" ").append(column.getSQLDataType());
|
||||||
|
|
||||||
|
// Default
|
||||||
|
String defaultValue = column.getDefaultValue();
|
||||||
|
if (defaultValue != null
|
||||||
|
&& defaultValue.length() > 0
|
||||||
|
&& defaultValue.indexOf('@') == -1 // no variables
|
||||||
|
&& ( ! (DisplayType.isID(column.getAD_Reference_ID()) && defaultValue.equals("-1") ) ) ) // not for ID's with default -1
|
||||||
|
{
|
||||||
|
if (DisplayType.isText(column.getAD_Reference_ID())
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.List
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.YesNo
|
||||||
|
// Two special columns: Defined as Table but DB Type is String
|
||||||
|
|| column.getColumnName().equals("EntityType") || column.getColumnName().equals("AD_Language")
|
||||||
|
|| (column.getAD_Reference_ID() == DisplayType.Button &&
|
||||||
|
!(column.getColumnName().endsWith("_ID"))))
|
||||||
|
{
|
||||||
|
if (!defaultValue.startsWith("'") && !defaultValue.endsWith("'"))
|
||||||
|
defaultValue = DB.TO_STRING(defaultValue);
|
||||||
|
}
|
||||||
|
sql.append(" DEFAULT ").append(defaultValue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (! column.isMandatory())
|
||||||
|
sql.append(" DEFAULT NULL ");
|
||||||
|
defaultValue = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inline Constraint
|
||||||
|
if (column.getAD_Reference_ID() == DisplayType.YesNo)
|
||||||
|
sql.append(" CHECK (").append(column.getColumnName()).append(" IN ('Y','N'))");
|
||||||
|
|
||||||
|
// Null
|
||||||
|
if (column.isMandatory())
|
||||||
|
sql.append(" NOT NULL");
|
||||||
|
return sql.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get SQL Add command
|
||||||
|
* @param table table
|
||||||
|
* @return sql
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getSQLAdd (MTable table, MColumn column)
|
||||||
|
{
|
||||||
|
StringBuilder sql = new StringBuilder ("ALTER TABLE ")
|
||||||
|
.append(table.getTableName())
|
||||||
|
.append(" ADD ").append(column.getSQLDDL());
|
||||||
|
String constraint = column.getConstraint(table.getTableName());
|
||||||
|
if (constraint != null && constraint.length() > 0) {
|
||||||
|
sql.append(DB.SQLSTATEMENT_SEPARATOR).append("ALTER TABLE ")
|
||||||
|
.append(table.getTableName())
|
||||||
|
.append(" ADD ").append(constraint);
|
||||||
|
}
|
||||||
|
return sql.toString();
|
||||||
|
} // getSQLAdd
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get SQL Modify command
|
||||||
|
* @param table table
|
||||||
|
* @param setNullOption generate null / not null statement
|
||||||
|
* @return sql separated by ;
|
||||||
|
*/
|
||||||
|
public String getSQLModify (MTable table, MColumn column, boolean setNullOption)
|
||||||
|
{
|
||||||
|
StringBuilder sql = new StringBuilder();
|
||||||
|
StringBuilder sqlBase = new StringBuilder ("ALTER TABLE ")
|
||||||
|
.append(table.getTableName())
|
||||||
|
.append(" MODIFY ").append(column.getColumnName());
|
||||||
|
|
||||||
|
// Default
|
||||||
|
StringBuilder sqlDefault = new StringBuilder(sqlBase)
|
||||||
|
.append(" ").append(column.getSQLDataType());
|
||||||
|
String defaultValue = column.getDefaultValue();
|
||||||
|
if (defaultValue != null
|
||||||
|
&& defaultValue.length() > 0
|
||||||
|
&& defaultValue.indexOf('@') == -1 // no variables
|
||||||
|
&& ( ! (DisplayType.isID(column.getAD_Reference_ID()) && defaultValue.equals("-1") ) ) ) // not for ID's with default -1
|
||||||
|
{
|
||||||
|
if (DisplayType.isText(column.getAD_Reference_ID())
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.List
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.YesNo
|
||||||
|
// Two special columns: Defined as Table but DB Type is String
|
||||||
|
|| column.getColumnName().equals("EntityType") || column.getColumnName().equals("AD_Language")
|
||||||
|
|| (column.getAD_Reference_ID() == DisplayType.Button &&
|
||||||
|
!(column.getColumnName().endsWith("_ID"))))
|
||||||
|
{
|
||||||
|
if (!defaultValue.startsWith("'") && !defaultValue.endsWith("'"))
|
||||||
|
defaultValue = DB.TO_STRING(defaultValue);
|
||||||
|
}
|
||||||
|
sqlDefault.append(" DEFAULT ").append(defaultValue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (! column.isMandatory())
|
||||||
|
sqlDefault.append(" DEFAULT NULL ");
|
||||||
|
defaultValue = null;
|
||||||
|
}
|
||||||
|
sql.append(sqlDefault);
|
||||||
|
|
||||||
|
// Constraint
|
||||||
|
|
||||||
|
// Null Values
|
||||||
|
if (column.isMandatory() && defaultValue != null && defaultValue.length() > 0)
|
||||||
|
{
|
||||||
|
StringBuilder sqlSet = new StringBuilder("UPDATE ")
|
||||||
|
.append(table.getTableName())
|
||||||
|
.append(" SET ").append(column.getColumnName())
|
||||||
|
.append("=").append(defaultValue)
|
||||||
|
.append(" WHERE ").append(column.getColumnName()).append(" IS NULL");
|
||||||
|
sql.append(DB.SQLSTATEMENT_SEPARATOR).append(sqlSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Null
|
||||||
|
if (setNullOption)
|
||||||
|
{
|
||||||
|
StringBuilder sqlNull = new StringBuilder(sqlBase);
|
||||||
|
if (column.isMandatory())
|
||||||
|
sqlNull.append(" NOT NULL");
|
||||||
|
else
|
||||||
|
sqlNull.append(" NULL");
|
||||||
|
sql.append(DB.SQLSTATEMENT_SEPARATOR).append(sqlNull);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return sql.toString();
|
||||||
|
} // getSQLModify
|
||||||
} // DB_Oracle
|
} // DB_Oracle
|
||||||
|
|
|
@ -49,6 +49,8 @@ import org.adempiere.db.postgresql.PostgreSQLBundleActivator;
|
||||||
import org.adempiere.exceptions.DBException;
|
import org.adempiere.exceptions.DBException;
|
||||||
import org.compiere.dbPort.Convert;
|
import org.compiere.dbPort.Convert;
|
||||||
import org.compiere.dbPort.Convert_PostgreSQL;
|
import org.compiere.dbPort.Convert_PostgreSQL;
|
||||||
|
import org.compiere.model.MColumn;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
import org.compiere.model.PO;
|
import org.compiere.model.PO;
|
||||||
import org.compiere.util.CCache;
|
import org.compiere.util.CCache;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
|
@ -1247,4 +1249,165 @@ public class DB_PostgreSQL implements AdempiereDatabase
|
||||||
return statement.replace(DB_PostgreSQL.NATIVE_MARKER, "");
|
return statement.replace(DB_PostgreSQL.NATIVE_MARKER, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNumericDataType() {
|
||||||
|
return "NUMERIC";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCharacterDataType() {
|
||||||
|
return "CHAR";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getVarcharDataType() {
|
||||||
|
return "VARCHAR";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getBlobDataType() {
|
||||||
|
return "BYTEA";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClobDataType() {
|
||||||
|
return "TEXT";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTimestampDataType() {
|
||||||
|
return "TIMESTAMP";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSQLDDL(MColumn column) {
|
||||||
|
StringBuilder sql = new StringBuilder ().append(column.getColumnName())
|
||||||
|
.append(" ").append(column.getSQLDataType());
|
||||||
|
|
||||||
|
// Null
|
||||||
|
if (column.isMandatory())
|
||||||
|
sql.append(" NOT NULL");
|
||||||
|
|
||||||
|
// Inline Constraint
|
||||||
|
if (column.getAD_Reference_ID() == DisplayType.YesNo)
|
||||||
|
sql.append(" CHECK (").append(column.getColumnName()).append(" IN ('Y','N'))");
|
||||||
|
|
||||||
|
// Default
|
||||||
|
String defaultValue = column.getDefaultValue();
|
||||||
|
if (defaultValue != null
|
||||||
|
&& defaultValue.length() > 0
|
||||||
|
&& defaultValue.indexOf('@') == -1 // no variables
|
||||||
|
&& ( ! (DisplayType.isID(column.getAD_Reference_ID()) && defaultValue.equals("-1") ) ) ) // not for ID's with default -1
|
||||||
|
{
|
||||||
|
if (DisplayType.isText(column.getAD_Reference_ID())
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.List
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.YesNo
|
||||||
|
// Two special columns: Defined as Table but DB Type is String
|
||||||
|
|| column.getColumnName().equals("EntityType") || column.getColumnName().equals("AD_Language")
|
||||||
|
|| (column.getAD_Reference_ID() == DisplayType.Button &&
|
||||||
|
!(column.getColumnName().endsWith("_ID"))))
|
||||||
|
{
|
||||||
|
if (!defaultValue.startsWith("'") && !defaultValue.endsWith("'"))
|
||||||
|
defaultValue = DB.TO_STRING(defaultValue);
|
||||||
|
}
|
||||||
|
if (defaultValue.equalsIgnoreCase("sysdate"))
|
||||||
|
defaultValue = "getDate()";
|
||||||
|
sql.append(" DEFAULT ").append(defaultValue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (! column.isMandatory())
|
||||||
|
sql.append(" DEFAULT NULL ");
|
||||||
|
defaultValue = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sql.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get SQL Add command
|
||||||
|
* @param table table
|
||||||
|
* @return sql
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getSQLAdd (MTable table, MColumn column)
|
||||||
|
{
|
||||||
|
StringBuilder sql = new StringBuilder ("ALTER TABLE ")
|
||||||
|
.append(table.getTableName())
|
||||||
|
.append(" ADD COLUMN ").append(column.getSQLDDL());
|
||||||
|
String constraint = column.getConstraint(table.getTableName());
|
||||||
|
if (constraint != null && constraint.length() > 0) {
|
||||||
|
sql.append(DB.SQLSTATEMENT_SEPARATOR).append("ALTER TABLE ")
|
||||||
|
.append(table.getTableName())
|
||||||
|
.append(" ADD ").append(constraint);
|
||||||
|
}
|
||||||
|
return sql.toString();
|
||||||
|
} // getSQLAdd
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get SQL Modify command
|
||||||
|
* @param table table
|
||||||
|
* @param setNullOption generate null / not null statement
|
||||||
|
* @return sql separated by ;
|
||||||
|
*/
|
||||||
|
public String getSQLModify (MTable table, MColumn column, boolean setNullOption)
|
||||||
|
{
|
||||||
|
StringBuilder sql = new StringBuilder ("INSERT INTO t_alter_column values('")
|
||||||
|
.append(table.getTableName())
|
||||||
|
.append("','").append(quoteColumnName(column.getColumnName()))
|
||||||
|
.append("','")
|
||||||
|
.append(column.getSQLDataType())
|
||||||
|
.append("',");
|
||||||
|
|
||||||
|
// Null
|
||||||
|
if (setNullOption)
|
||||||
|
{
|
||||||
|
if (column.isMandatory())
|
||||||
|
sql.append("'NOT NULL',");
|
||||||
|
else
|
||||||
|
sql.append("'NULL',");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sql.append("null,");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default
|
||||||
|
String defaultValue = column.getDefaultValue();
|
||||||
|
if (defaultValue != null
|
||||||
|
&& defaultValue.length() > 0
|
||||||
|
&& defaultValue.indexOf('@') == -1 // no variables
|
||||||
|
&& ( ! (DisplayType.isID(column.getAD_Reference_ID()) && defaultValue.equals("-1") ) ) ) // not for ID's with default -1
|
||||||
|
{
|
||||||
|
if (defaultValue.equalsIgnoreCase("sysdate"))
|
||||||
|
defaultValue = "getDate()";
|
||||||
|
if (!defaultValue.startsWith("'") && !defaultValue.endsWith("'"))
|
||||||
|
defaultValue = "'" + defaultValue + "'";
|
||||||
|
sql.append(defaultValue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sql.append("null");
|
||||||
|
}
|
||||||
|
sql.append(")");
|
||||||
|
|
||||||
|
|
||||||
|
// Null Values
|
||||||
|
if (column.isMandatory() && defaultValue != null && defaultValue.length() > 0)
|
||||||
|
{
|
||||||
|
StringBuilder sqlSet = new StringBuilder("UPDATE ")
|
||||||
|
.append(table.getTableName())
|
||||||
|
.append(" SET ").append(quoteColumnName(column.getColumnName()))
|
||||||
|
.append("=").append(defaultValue)
|
||||||
|
.append(" WHERE ").append(quoteColumnName(column.getColumnName())).append(" IS NULL");
|
||||||
|
sql.append(DB.SQLSTATEMENT_SEPARATOR).append(sqlSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
return sql.toString();
|
||||||
|
} // getSQLModify
|
||||||
|
|
||||||
} // DB_PostgreSQL
|
} // DB_PostgreSQL
|
||||||
|
|
Loading…
Reference in New Issue