diff --git a/org.adempiere.base/src/org/adempiere/process/UUIDGenerator.java b/org.adempiere.base/src/org/adempiere/process/UUIDGenerator.java index fe9c8e4f1a..d0b3117d32 100644 --- a/org.adempiere.base/src/org/adempiere/process/UUIDGenerator.java +++ b/org.adempiere.base/src/org/adempiere/process/UUIDGenerator.java @@ -83,9 +83,7 @@ public class UUIDGenerator extends SvrProcess { while(rs.next()) { int AD_Table_ID = rs.getInt(1); String cTableName = rs.getString(2); - //skip import and translation table - if (cTableName.startsWith("I_") || cTableName.endsWith("_Trl")) - continue; + String columnName = cTableName + "_UU"; int AD_Column_ID = DB.getSQLValue(null, "SELECT AD_Column_ID FROM AD_Column Where AD_Table_ID = ? AND ColumnName = ?", AD_Table_ID, columnName); if (AD_Column_ID <= 0) { @@ -125,7 +123,7 @@ public class UUIDGenerator extends SvrProcess { return count + " table altered"; } - private void updateUUID(MColumn column) { + public static void updateUUID(MColumn column) { MTable table = (MTable) column.getAD_Table(); int AD_Column_ID = DB.getSQLValue(null, "SELECT AD_Column_ID FROM AD_Column WHERE AD_Table_ID=? AND ColumnName=?", table.getAD_Table_ID(), table.getTableName()+"_ID"); StringBuffer sql = new StringBuffer("SELECT "); @@ -138,6 +136,7 @@ public class UUIDGenerator extends SvrProcess { keyColumn = "ctid"; } sql.append(keyColumn).append(" FROM ").append(table.getTableName()); + sql.append(" WHERE ").append(column.getColumnName()).append(" IS NULL "); String updateSQL = "UPDATE "+table.getTableName()+" SET "+column.getColumnName()+"=? WHERE "+keyColumn+"="; PreparedStatement stmt = null; ResultSet rs = null; diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 75862afb2f..6b3814b69e 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -45,6 +45,7 @@ import org.adempiere.base.event.EventManager; import org.adempiere.base.event.IEventTopics; import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.DBException; +import org.adempiere.process.UUIDGenerator; import org.compiere.Adempiere; import org.compiere.acct.Doc; import org.compiere.util.CLogMgt; @@ -3180,22 +3181,42 @@ public abstract class PO String tableName = p_info.getTableName(); String keyColumn = m_KeyColumns[0]; + + //check whether db have working generate_uuid function. + boolean uuidFunction = DB.isGenerateUUIDSupported(); + + //uuid column + int uuidColumnId = DB.getSQLValue(get_TrxName(), "SELECT col.AD_Column_ID FROM AD_Column as col INNER JOIN AD_Table as tbl ON col.AD_Table_ID = tbl.AD_Table_ID WHERE tbl.TableName=? AND col.ColumnName=?", + tableName+"_Trl", tableName+"_Trl_UU"); + StringBuffer sql = new StringBuffer ("INSERT INTO ") .append(tableName).append("_Trl (AD_Language,") .append(keyColumn).append(", ") .append(iColumns) - .append(" IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy) ") - .append("SELECT l.AD_Language,t.") + .append(" IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy"); + if (uuidColumnId > 0 && uuidFunction) + sql.append(",").append(tableName).append("_Trl_UU ) "); + else + sql.append(" ) "); + sql.append("SELECT l.AD_Language,t.") .append(keyColumn).append(", ") .append(sColumns) - .append(" 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy ") - .append("FROM AD_Language l, ").append(tableName).append(" t ") + .append(" 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy"); + if (uuidColumnId > 0 && uuidFunction) + sql.append(",Generate_UUID() "); + else + sql.append(" "); + sql.append("FROM AD_Language l, ").append(tableName).append(" t ") .append("WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.") .append(keyColumn).append("=").append(get_ID()) .append(" AND NOT EXISTS (SELECT * FROM ").append(tableName) .append("_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.") .append(keyColumn).append("=t.").append(keyColumn).append(")"); int no = DB.executeUpdate(sql.toString(), m_trxName); + if (uuidColumnId > 0 && !uuidFunction) { + MColumn column = new MColumn(getCtx(), uuidColumnId, get_TrxName()); + UUIDGenerator.updateUUID(column); + } log.fine("#" + no); return no > 0; } // insertTranslations @@ -3340,12 +3361,24 @@ public abstract class PO .append("_ID, C_AcctSchema_ID, AD_Client_ID,AD_Org_ID,IsActive, Created,CreatedBy,Updated,UpdatedBy "); for (int i = 0; i < s_acctColumns.size(); i++) sb.append(",").append(s_acctColumns.get(i)); + + //check whether db have working generate_uuid function. + boolean uuidFunction = DB.isGenerateUUIDSupported(); + + //uuid column + int uuidColumnId = DB.getSQLValue(get_TrxName(), "SELECT col.AD_Column_ID FROM AD_Column as col INNER JOIN AD_Table as tbl ON col.AD_Table_ID = tbl.AD_Table_ID WHERE tbl.TableName=? AND col.ColumnName=?", + acctTable, acctTable+"_UU"); + if (uuidColumnId > 0 && uuidFunction) + sb.append(",").append(acctTable).append("_UU"); // .. SELECT sb.append(") SELECT ").append(get_ID()) .append(", p.C_AcctSchema_ID, p.AD_Client_ID,0,'Y', SysDate,") .append(getUpdatedBy()).append(",SysDate,").append(getUpdatedBy()); for (int i = 0; i < s_acctColumns.size(); i++) sb.append(",p.").append(s_acctColumns.get(i)); + //uuid column + if (uuidColumnId > 0 && uuidFunction) + sb.append(",generate_uuid()"); // .. FROM sb.append(" FROM ").append(acctBaseTable) .append(" p WHERE p.AD_Client_ID=").append(getAD_Client_ID()); @@ -3361,6 +3394,12 @@ public abstract class PO else log.warning("#" + no + " - Table=" + acctTable + " from " + acctBaseTable); + + //fall back to the slow java client update code + if (uuidColumnId > 0 && !uuidFunction) { + MColumn column = new MColumn(getCtx(), uuidColumnId, get_TrxName()); + UUIDGenerator.updateUUID(column); + } return no > 0; } // insert_Accounting @@ -3394,13 +3433,30 @@ public abstract class PO */ protected boolean insert_Tree (String treeType, int C_Element_ID) { + String tableName = MTree_Base.getNodeTableName(treeType); + + //check whether db have working generate_uuid function. + boolean uuidFunction = DB.isGenerateUUIDSupported(); + + //uuid column + int uuidColumnId = DB.getSQLValue(get_TrxName(), "SELECT col.AD_Column_ID FROM AD_Column as col INNER JOIN AD_Table as tbl ON col.AD_Table_ID = tbl.AD_Table_ID WHERE tbl.TableName=? AND col.ColumnName=?", + tableName, tableName+"_UU"); + StringBuffer sb = new StringBuffer ("INSERT INTO ") - .append(MTree_Base.getNodeTableName(treeType)) + .append(tableName) .append(" (AD_Client_ID,AD_Org_ID, IsActive,Created,CreatedBy,Updated,UpdatedBy, " - + "AD_Tree_ID, Node_ID, Parent_ID, SeqNo) " - + "SELECT t.AD_Client_ID, 0, 'Y', SysDate, "+getUpdatedBy()+", SysDate, "+getUpdatedBy()+"," - + "t.AD_Tree_ID, ").append(get_ID()).append(", 0, 999 " - + "FROM AD_Tree t " + + "AD_Tree_ID, Node_ID, Parent_ID, SeqNo"); + if (uuidColumnId > 0 && uuidFunction) + sb.append(", ").append(tableName).append("_UU) "); + else + sb.append(") "); + sb.append("SELECT t.AD_Client_ID, 0, 'Y', SysDate, "+getUpdatedBy()+", SysDate, "+getUpdatedBy()+"," + + "t.AD_Tree_ID, ").append(get_ID()).append(", 0, 999"); + if (uuidColumnId > 0 && uuidFunction) + sb.append(", Generate_UUID() "); + else + sb.append(" "); + sb.append("FROM AD_Tree t " + "WHERE t.AD_Client_ID=").append(getAD_Client_ID()).append(" AND t.IsActive='Y'"); // Account Element Value handling if (C_Element_ID != 0) @@ -3416,6 +3472,12 @@ public abstract class PO log.fine("#" + no + " - TreeType=" + treeType); else log.warning("#" + no + " - TreeType=" + treeType); + + if (uuidColumnId > 0 && !uuidFunction ) + { + MColumn column = new MColumn(getCtx(), uuidColumnId, get_TrxName()); + UUIDGenerator.updateUUID(column); + } return no > 0; } // insert_Tree diff --git a/org.adempiere.base/src/org/compiere/util/DB.java b/org.adempiere.base/src/org/compiere/util/DB.java index 5d885470a5..1cf89aef8b 100644 --- a/org.adempiere.base/src/org/compiere/util/DB.java +++ b/org.adempiere.base/src/org/compiere/util/DB.java @@ -1591,7 +1591,7 @@ public final class DB { return getKeyNamePairs(null, sql, optional, params); } - + /** * Get Array of Key Name Pairs * @param trxName @@ -2199,7 +2199,7 @@ public final class DB } return list.toArray(new KeyNamePair[list.size()]); } - + /** * Create persistent selection in T_Selection table * @param AD_PInstance_ID @@ -2221,8 +2221,8 @@ public final class DB insert.append(", "); insert.append(selectedId); insert.append(" FROM DUAL "); - - if (counter >= 1000) + + if (counter >= 1000) { DB.executeUpdateEx(insert.toString(), trxName); insert = new StringBuffer(); @@ -2235,7 +2235,19 @@ public final class DB DB.executeUpdateEx(insert.toString(), trxName); } } - + + /*** + * @return true if current db have working generate_uuid function. generate_uuid doesn't work on 64 bit postgresql + * on windows yet. + */ + public static boolean isGenerateUUIDSupported() { + String uuidTest = null; + try { + uuidTest = getSQLValueStringEx(null, "SELECT Generate_UUID() FROM Dual"); + } catch (Exception e) {} + return uuidTest != null && uuidTest.trim().length() == 36; + } + private static void verifyTrx(String trxName, String sql) { if (trxName != null && Trx.get(trxName, false) == null) { // Using a trx that was previously closed or never opened