From d2d8553156c33775d900e918708ec61c306b5f0d Mon Sep 17 00:00:00 2001 From: Elaine Tan Date: Thu, 11 Jul 2013 15:26:26 +0800 Subject: [PATCH] IDEMPIERE-1132 Improve AD_Index; AD_View; foreign keys management - Validation using unique AD_TableIndex --- .../src/org/compiere/model/MTableIndex.java | 2 +- .../src/org/compiere/model/PO.java | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/model/MTableIndex.java b/org.adempiere.base/src/org/compiere/model/MTableIndex.java index b1d3b52cda..e36c310e0b 100644 --- a/org.adempiere.base/src/org/compiere/model/MTableIndex.java +++ b/org.adempiere.base/src/org/compiere/model/MTableIndex.java @@ -37,7 +37,7 @@ public class MTableIndex extends X_AD_TableIndex { */ public static MTableIndex[] get(MTable table) { - Query query = new Query(table.getCtx(), table, MTableIndex.COLUMNNAME_AD_Table_ID + "=?", table.get_TrxName()); + Query query = new Query(table.getCtx(), MTableIndex.Table_Name, MTableIndex.COLUMNNAME_AD_Table_ID + "=?", table.get_TrxName()); query.setParameters(table.getAD_Table_ID()); query.setOnlyActiveRecords(true); List list = query.list(); diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 8f89a4aa14..641254b8f8 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -2112,6 +2112,7 @@ public abstract class PO } else { + validateUniqueIndex(); if (localTrx != null) localTrx.rollback(); else @@ -2131,6 +2132,7 @@ public abstract class PO } else { + validateUniqueIndex(); if (localTrx != null) localTrx.rollback(); else @@ -4410,4 +4412,45 @@ public abstract class PO ois.defaultReadObject(); log = CLogger.getCLogger(getClass()); } + + private void validateUniqueIndex() + { + ValueNamePair ppE = CLogger.retrieveError(); + if (ppE != null) + { + String msg = ppE.getValue(); + String info = ppE.getName(); + if ("DBExecuteError".equals(msg)) + info = "DBExecuteError:" + info; + // Unique Constraint + if (DBException.isUniqueContraintError(CLogger.retrieveException())) + { + boolean found = false; + MTableIndex[] indexes = MTableIndex.get(MTable.get(getCtx(), get_Table_ID())); + for (MTableIndex index : indexes) + { + String indexName = index.getName().toLowerCase(); + if (DB.isPostgreSQL()) + indexName = "\"" + indexName + "\""; + else + indexName = "." + indexName + ")"; + if (info.toLowerCase().contains(indexName)) + { + if (index.getAD_Message_ID() > 0) + { + MMessage message = MMessage.get(getCtx(), index.getAD_Message_ID()); + log.saveError("SaveError", message.getMsgText()); + found = true; + break; + } + } + } + + if (!found) + log.saveError(msg, info); + } + else + log.saveError(msg, info); + } + } } // PO