From a8731ef4a519a3eced03ffe18fe5f46bcf1e00f3 Mon Sep 17 00:00:00 2001 From: Elaine Tan Date: Tue, 16 Jul 2013 19:08:06 +0800 Subject: [PATCH] IDEMPIERE-1132 Improve AD_Index; AD_View; foreign keys management - Validation using unique AD_TableIndex --- .../src/org/compiere/db/AdempiereDatabase.java | 2 ++ .../src/org/compiere/model/PO.java | 16 +++++++--------- .../src/org/compiere/db/DB_Oracle.java | 12 ++++++++++++ .../src/org/compiere/db/DB_PostgreSQL.java | 12 ++++++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java index a0b37e4f00..81fb77ba6b 100644 --- a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java +++ b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java @@ -338,6 +338,8 @@ public interface AdempiereDatabase * @return true if lock is granted */ public boolean forUpdate(PO po, int timeout); + + public String getNameOfUniqueConstraintError(Exception e); } // AdempiereDatabase diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 641254b8f8..64f62400b2 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -4423,26 +4423,24 @@ public abstract class PO if ("DBExecuteError".equals(msg)) info = "DBExecuteError:" + info; // Unique Constraint - if (DBException.isUniqueContraintError(CLogger.retrieveException())) + Exception e = CLogger.retrieveException(); + if (DBException.isUniqueContraintError(e)) { boolean found = false; + String dbIndexName = DB.getDatabase().getNameOfUniqueConstraintError(e); + if (log.isLoggable(Level.FINE)) log.fine("dbIndexName=" + dbIndexName); 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 (dbIndexName.equalsIgnoreCase(index.getName())) { if (index.getAD_Message_ID() > 0) { MMessage message = MMessage.get(getCtx(), index.getAD_Message_ID()); - log.saveError("SaveError", message.getMsgText()); + log.saveError("SaveError", Msg.getMsg(getCtx(), message.getValue())); found = true; - break; } + break; } } diff --git a/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java b/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java index af18b339f0..a2fdfebfa6 100644 --- a/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java +++ b/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java @@ -1380,4 +1380,16 @@ public class DB_Oracle implements AdempiereDatabase } return false; } + + @Override + public String getNameOfUniqueConstraintError(Exception e) { + String info = e.getMessage(); + int fromIndex = info.indexOf("."); + if (fromIndex == -1) + return info; + int toIndex = info.indexOf(")", fromIndex + 1); + if (toIndex == -1) + return info; + return info.substring(fromIndex + 1, toIndex); + } } // DB_Oracle diff --git a/org.compiere.db.postgresql.provider/src/org/compiere/db/DB_PostgreSQL.java b/org.compiere.db.postgresql.provider/src/org/compiere/db/DB_PostgreSQL.java index 9f9e39dbd8..faf3653ff4 100755 --- a/org.compiere.db.postgresql.provider/src/org/compiere/db/DB_PostgreSQL.java +++ b/org.compiere.db.postgresql.provider/src/org/compiere/db/DB_PostgreSQL.java @@ -1138,4 +1138,16 @@ public class DB_PostgreSQL implements AdempiereDatabase } return false; } + + @Override + public String getNameOfUniqueConstraintError(Exception e) { + String info = e.getMessage(); + int fromIndex = info.indexOf("\""); + if (fromIndex == -1) + return info; + int toIndex = info.indexOf("\"", fromIndex + 1); + if (toIndex == -1) + return info; + return info.substring(fromIndex + 1, toIndex); + } } // DB_PostgreSQL