IDEMPIERE-3057 2Pack handler for SQL Statements that must not fail
This commit is contained in:
parent
e51ad389e7
commit
18e494fd12
|
@ -0,0 +1,19 @@
|
|||
SET SQLBLANKLINES ON
|
||||
SET DEFINE OFF
|
||||
|
||||
-- IDEMPIERE-3057 2Pack handler for SQL Statements that must not fail
|
||||
-- Mar 22, 2016 5:34:50 PM CET
|
||||
INSERT INTO AD_Ref_List (AD_Ref_List_ID,Name,AD_Reference_ID,Value,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,EntityType,AD_Ref_List_UU) VALUES (200356,'SQL Mandatory',50004,'SQM',0,0,'Y',TO_DATE('2016-03-22 17:34:50','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2016-03-22 17:34:50','YYYY-MM-DD HH24:MI:SS'),100,'D','63605262-3ba3-4140-b839-4e5b0f8ad23d')
|
||||
;
|
||||
|
||||
-- Mar 22, 2016 5:35:42 PM CET
|
||||
UPDATE AD_Field SET DisplayLogic='@Type@=''D''|Type@=''SQL''|Type@=''SQM''',Updated=TO_DATE('2016-03-22 17:35:42','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50105
|
||||
;
|
||||
|
||||
-- Mar 22, 2016 5:39:53 PM CET
|
||||
UPDATE AD_Field SET DisplayLogic='@Type@=''SQL''|@Type@=''SQM''',Updated=TO_DATE('2016-03-22 17:39:53','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50104
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201603221737_IDEMPIERE-3057.sql') FROM dual
|
||||
;
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
-- IDEMPIERE-3057 2Pack handler for SQL Statements that must not fail
|
||||
-- Mar 22, 2016 5:34:50 PM CET
|
||||
INSERT INTO AD_Ref_List (AD_Ref_List_ID,Name,AD_Reference_ID,Value,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,EntityType,AD_Ref_List_UU) VALUES (200356,'SQL Mandatory',50004,'SQM',0,0,'Y',TO_TIMESTAMP('2016-03-22 17:34:50','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2016-03-22 17:34:50','YYYY-MM-DD HH24:MI:SS'),100,'D','63605262-3ba3-4140-b839-4e5b0f8ad23d')
|
||||
;
|
||||
|
||||
-- Mar 22, 2016 5:35:42 PM CET
|
||||
UPDATE AD_Field SET DisplayLogic='@Type@=''D''|Type@=''SQL''|Type@=''SQM''',Updated=TO_TIMESTAMP('2016-03-22 17:35:42','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50105
|
||||
;
|
||||
|
||||
-- Mar 22, 2016 5:39:53 PM CET
|
||||
UPDATE AD_Field SET DisplayLogic='@Type@=''SQL''|@Type@=''SQM''',Updated=TO_TIMESTAMP('2016-03-22 17:39:53','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=50104
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201603221737_IDEMPIERE-3057.sql') FROM dual
|
||||
;
|
||||
|
|
@ -30,7 +30,7 @@ public class X_AD_Package_Exp_Detail extends PO implements I_AD_Package_Exp_Deta
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 20151030L;
|
||||
private static final long serialVersionUID = 20160322L;
|
||||
|
||||
/** Standard Constructor */
|
||||
public X_AD_Package_Exp_Detail (Properties ctx, int AD_Package_Exp_Detail_ID, String trxName)
|
||||
|
@ -913,6 +913,8 @@ public class X_AD_Package_Exp_Detail extends PO implements I_AD_Package_Exp_Deta
|
|||
public static final String TYPE_ModelValidator = "MV";
|
||||
/** Entity Type = ET */
|
||||
public static final String TYPE_EntityType = "ET";
|
||||
/** SQL Mandatory = SQM */
|
||||
public static final String TYPE_SQLMandatory = "SQM";
|
||||
/** Set Type.
|
||||
@param Type
|
||||
Type of Validation (SQL, Java Script, Java Language)
|
||||
|
|
|
@ -152,6 +152,10 @@
|
|||
class="org.adempiere.pipo2.handler.SQLStatementElementHandler"
|
||||
id="SQLStatement">
|
||||
</handler>
|
||||
<handler
|
||||
class="org.adempiere.pipo2.handler.SQLMandatoryElementHandler"
|
||||
id="SQLMandatory">
|
||||
</handler>
|
||||
<handler
|
||||
class="org.adempiere.pipo2.handler.ReferenceElementHandler"
|
||||
id="AD_Reference">
|
||||
|
|
|
@ -0,0 +1,142 @@
|
|||
/**********************************************************************
|
||||
* This file is part of iDempiere ERP Open Source *
|
||||
* http://www.idempiere.org *
|
||||
* *
|
||||
* Copyright (C) Contributors *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License *
|
||||
* as published by the Free Software Foundation; either version 2 *
|
||||
* of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the Free Software *
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *
|
||||
* MA 02110-1301, USA. *
|
||||
* *
|
||||
* Contributors: *
|
||||
* - Trek Global *
|
||||
* - Carlos Ruiz - globalqss *
|
||||
**********************************************************************/
|
||||
|
||||
package org.adempiere.pipo2.handler;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.Statement;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import javax.xml.transform.sax.TransformerHandler;
|
||||
|
||||
import org.adempiere.exceptions.AdempiereException;
|
||||
import org.adempiere.pipo2.AbstractElementHandler;
|
||||
import org.adempiere.pipo2.Element;
|
||||
import org.adempiere.pipo2.PIPOContext;
|
||||
import org.adempiere.pipo2.PackOut;
|
||||
import org.adempiere.pipo2.PackoutItem;
|
||||
import org.adempiere.pipo2.SQLElementParameters;
|
||||
import org.compiere.model.X_AD_Package_Imp_Detail;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.helpers.AttributesImpl;
|
||||
|
||||
public class SQLMandatoryElementHandler extends AbstractElementHandler {
|
||||
|
||||
public void startElement(PIPOContext ctx, Element element) throws SAXException {
|
||||
String elementValue = element.getElementValue();
|
||||
|
||||
log.info(elementValue);
|
||||
String DBType = getStringValue(element, "DBType");
|
||||
String sql = getStringValue(element, "statement");
|
||||
if (sql.endsWith(";") && !(sql.toLowerCase().endsWith("end;")))
|
||||
sql = sql.substring(0, sql.length() - 1);
|
||||
sql = Env.parseContext(Env.getCtx(), 0, sql, false);
|
||||
PreparedStatement pstmt = null;
|
||||
X_AD_Package_Imp_Detail impDetail = createImportDetail(ctx, element.qName, "", 0);
|
||||
try {
|
||||
pstmt = DB.prepareStatement(sql, getTrxName(ctx));
|
||||
if (DBType.equals("ALL")) {
|
||||
int n = pstmt.executeUpdate();
|
||||
if (log.isLoggable(Level.INFO)) log.info("Executed SQL Mandatory: "+ getStringValue(element, "statement") + " ReturnValue="+n);
|
||||
} else if (DB.isOracle() && DBType.equals("Oracle")) {
|
||||
int n = pstmt.executeUpdate();
|
||||
if (log.isLoggable(Level.INFO)) log.info("Executed SQL Mandatory for Oracle: "+ getStringValue(element, "statement") + " ReturnValue="+n);
|
||||
} else if (DB.isPostgreSQL()
|
||||
&& ( DBType.equals("Postgres")
|
||||
|| DBType.equals("PostgreSQL") // backward compatibility with old packages developed by hand
|
||||
)
|
||||
) {
|
||||
// Avoid convert layer - command specific for postgresql
|
||||
//
|
||||
// pstmt = DB.prepareStatement(sql, getTrxName(ctx));
|
||||
// pstmt.executeUpdate();
|
||||
//
|
||||
Statement stmt = null;
|
||||
try {
|
||||
stmt = pstmt.getConnection().createStatement();
|
||||
int n = stmt.executeUpdate (sql);
|
||||
if (log.isLoggable(Level.INFO)) log.info("Executed SQL Mandatory for PostgreSQL: "+ getStringValue(element,"statement") + " ReturnValue="+n);
|
||||
} finally {
|
||||
DB.close(stmt);
|
||||
stmt = null;
|
||||
}
|
||||
}
|
||||
logImportDetail (ctx, impDetail, 1, "SQLMandatory",1,"Execute");
|
||||
ctx.packIn.getNotifier().addSuccessLine("-> " + sql);
|
||||
} catch (Exception e) {
|
||||
ctx.packIn.getNotifier().addFailureLine("SQL Mandatory failed, error (" + e.getLocalizedMessage() + "):");
|
||||
logImportDetail (ctx, impDetail, 0, "SQLMandatory",1,"Execute");
|
||||
ctx.packIn.getNotifier().addFailureLine("-> " + sql);
|
||||
log.log(Level.SEVERE,"SQLMandatory", e);
|
||||
throw new AdempiereException(e);
|
||||
} finally {
|
||||
DB.close(pstmt);
|
||||
pstmt = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void endElement(PIPOContext ctx, Element element) throws SAXException {
|
||||
}
|
||||
|
||||
public void create(PIPOContext ctx, TransformerHandler document)
|
||||
throws SAXException {
|
||||
String SQLMandatory = Env.getContext(ctx.ctx, SQLElementParameters.SQL_STATEMENT);
|
||||
String DBType = Env.getContext(ctx.ctx, SQLElementParameters.DB_TYPE);
|
||||
AttributesImpl atts = new AttributesImpl();
|
||||
addTypeName(atts, "custom");
|
||||
document.startElement("","","SQLMandatory",atts);
|
||||
createSQLStatmentBinding(document, SQLMandatory, DBType);
|
||||
document.endElement("","","SQLMandatory");
|
||||
}
|
||||
|
||||
private void createSQLStatmentBinding( TransformerHandler document, String sqlMandatory, String DBType) throws SAXException
|
||||
{
|
||||
document.startElement("","","DBType", new AttributesImpl());
|
||||
char[] contents = DBType.toCharArray();
|
||||
document.characters(contents,0,contents.length);
|
||||
document.endElement("","","DBType");
|
||||
|
||||
document.startElement("","","statement", new AttributesImpl());
|
||||
contents = sqlMandatory.toCharArray();
|
||||
document.startCDATA();
|
||||
document.characters(contents,0,contents.length);
|
||||
document.endCDATA();
|
||||
document.endElement("","","statement");
|
||||
|
||||
}
|
||||
|
||||
public void packOut(PackOut packout, TransformerHandler packoutHandler, TransformerHandler docHandler,int field) throws Exception
|
||||
{
|
||||
PackoutItem detail = packout.getCurrentPackoutItem();
|
||||
Env.setContext(packout.getCtx().ctx, SQLElementParameters.SQL_STATEMENT, (String)detail.getProperty(SQLElementParameters.SQL_STATEMENT));
|
||||
Env.setContext(packout.getCtx().ctx, SQLElementParameters.DB_TYPE, (String)detail.getProperty(SQLElementParameters.DB_TYPE));
|
||||
this.create(packout.getCtx(), packoutHandler);
|
||||
packout.getCtx().ctx.remove(SQLElementParameters.SQL_STATEMENT);
|
||||
packout.getCtx().ctx.remove(SQLElementParameters.DB_TYPE);
|
||||
}
|
||||
}
|
|
@ -104,10 +104,10 @@ public class SQLStatementElementHandler extends AbstractElementHandler {
|
|||
}
|
||||
savepoint = null;
|
||||
}
|
||||
ctx.packIn.getNotifier().addFailureLine("SQL statement failed but ignored, error (" + e.getLocalizedMessage() + "): " + sql);
|
||||
ctx.packIn.getNotifier().addFailureLine("SQL statement failed but ignored, error (" + e.getLocalizedMessage() + "): ");
|
||||
logImportDetail (ctx, impDetail, 0, "SQLStatement",1,"Execute");
|
||||
ctx.packIn.getNotifier().addFailureLine("-> " + sql);
|
||||
log.log(Level.SEVERE,"SQLSatement", e);
|
||||
log.log(Level.SEVERE,"SQLStatement", e);
|
||||
} finally {
|
||||
DB.close(pstmt);
|
||||
pstmt = null;
|
||||
|
|
|
@ -183,6 +183,8 @@ public class PackOutProcess extends SvrProcess
|
|||
return I_AD_Role.Table_Name;
|
||||
else if (X_AD_Package_Exp_Detail.TYPE_SQLStatement.equals(type))
|
||||
return "SQLStatement";
|
||||
else if (X_AD_Package_Exp_Detail.TYPE_SQLMandatory.equals(type))
|
||||
return "SQLMandatory";
|
||||
else if (X_AD_Package_Exp_Detail.TYPE_Table.equals(type))
|
||||
return I_AD_Table.Table_Name;
|
||||
else if (X_AD_Package_Exp_Detail.TYPE_Window.equals(type))
|
||||
|
@ -202,7 +204,7 @@ public class PackOutProcess extends SvrProcess
|
|||
if (MPackageExpDetail.TYPE_Data.equals(type)) {
|
||||
properties.put(DataElementParameters.AD_TABLE_ID, dtl.getAD_Table_ID());
|
||||
properties.put(DataElementParameters.SQL_STATEMENT, dtl.getSQLStatement());
|
||||
} else if (MPackageExpDetail.TYPE_SQLStatement.equals(type)) {
|
||||
} else if (MPackageExpDetail.TYPE_SQLStatement.equals(type) || MPackageExpDetail.TYPE_SQLMandatory.equals(type)) {
|
||||
properties.put(SQLElementParameters.SQL_STATEMENT, dtl.getSQLStatement());
|
||||
properties.put(SQLElementParameters.DB_TYPE, dtl.getDBType());
|
||||
} else if (MPackageExpDetail.TYPE_File_CodeOrOther.equals(type)) {
|
||||
|
|
Loading…
Reference in New Issue