From be0f3bfdc5771eb8bec46eb5af969b27de40e1dc Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Thu, 22 Aug 2013 16:49:37 +0800 Subject: [PATCH] IDEMPIERE-497 2Pack SQL Statement Handler improvements for Postgresql. Handle scenario where savepoint become invalid because there's commit or rollback clause in the sql statement. --- .../src/org/compiere/model/PO.java | 4 +- .../handler/SQLStatementElementHandler.java | 49 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index daa6810f66..33fac330ef 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -2644,10 +2644,10 @@ public abstract class PO else { if (m_trxName == null) - log.log(Level.WARNING, "#" + no + log.log(Level.WARNING, "Update return " + no + " instead of 1" + " - " + p_info.getTableName() + "." + where); else - log.log(Level.WARNING, "#" + no + log.log(Level.WARNING, "Update return " + no + " instead of 1" + " - [" + m_trxName + "] - " + p_info.getTableName() + "." + where); } return ok; diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java index 4ba2cf0a1c..519c16932f 100644 --- a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java +++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/SQLStatementElementHandler.java @@ -49,15 +49,13 @@ public class SQLStatementElementHandler extends AbstractElementHandler { sql = sql.substring(0, sql.length() - 1); Savepoint savepoint = null; PreparedStatement pstmt = null; + X_AD_Package_Imp_Detail impDetail = null; try { // NOTE Postgres needs to commit DDL statements // add a SQL command just with COMMIT if you want to simulate the Oracle behavior (commit on DDL) // Use savepoint here so that SQL exception would not rollback the whole process - if (DB.isPostgreSQL()) - { - Trx trx = Trx.get(getTrxName(ctx), true); - savepoint = trx.setSavepoint(null); - } + Trx trx = Trx.get(getTrxName(ctx), true); + savepoint = trx.setSavepoint(null); pstmt = DB.prepareStatement(sql, getTrxName(ctx)); if (DBType.equals("ALL")) { @@ -86,27 +84,23 @@ public class SQLStatementElementHandler extends AbstractElementHandler { DB.close(stmt); stmt = null; } - } - - X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, "", - 0); - logImportDetail (ctx, impDetail, 1, "SQLStatement",1,"Execute"); + } } catch (Exception e) { - if (DB.isPostgreSQL()) { - // rollback immediately postgres on exception to avoid a wrong SQL stop the whole process - if (savepoint != null) - { - Trx trx = Trx.get(getTrxName(ctx), false); - try { - trx.rollback(savepoint); - } catch (SQLException e1) {} - savepoint = null; + // rollback immediately on exception to avoid a wrong SQL stop the whole process + if (savepoint != null) + { + Trx trx = Trx.get(getTrxName(ctx), false); + try { + if (trx.getConnection() != null) + trx.getConnection().rollback(savepoint); + } catch (SQLException e1) { + //a rollback or commit have happens making the savepoint becomes invalid. + //rollback trx to continue + trx.rollback(); } + savepoint = null; } log.log(Level.SEVERE,"SQLSatement", e); - X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, "", - 0); - logImportDetail (ctx, impDetail, 0, "SQLStatement",1,"Execute"); } finally { DB.close(pstmt); pstmt = null; @@ -114,9 +108,18 @@ public class SQLStatementElementHandler extends AbstractElementHandler { Trx trx = Trx.get(getTrxName(ctx), false); try { trx.releaseSavepoint(savepoint); - } catch (SQLException e) {} + } catch (SQLException e) { + if (DB.isPostgreSQL()) { + //a commit or rollback have happens that make the savepoint invalid. + //need to call rollback to continue + trx.commit(); + } + } } } + impDetail = createImportDetail(ctx, element.qName, "", + 0); + logImportDetail (ctx, impDetail, 1, "SQLStatement",1,"Execute"); } public void endElement(PIPOContext ctx, Element element) throws SAXException {