IDEMPIERE-4180 Add DDL and Data Type methods to AdempiereDatabase interface

This commit is contained in:
hengsin 2020-03-03 17:27:53 +08:00
parent 26e764c2a2
commit 4a436c5157
6 changed files with 480 additions and 283 deletions

View File

@ -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

View File

@ -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
/** /**

View File

@ -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

View File

@ -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
/** /**

View File

@ -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

View File

@ -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