From 801df9ef449e2013c7b03dbd0810f074febd0af3 Mon Sep 17 00:00:00 2001 From: zuhriutama Date: Tue, 30 Apr 2024 19:34:55 +0700 Subject: [PATCH 1/7] IDEMPIERE-6133 : Support Export Blob Column for Export SQL Insert Scripts --- org.adempiere.base/META-INF/MANIFEST.MF | 1 + org.adempiere.base/src/org/compiere/model/PO.java | 14 ++++---------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/org.adempiere.base/META-INF/MANIFEST.MF b/org.adempiere.base/META-INF/MANIFEST.MF index 0eb2bfbf9b..6f9852ebe6 100644 --- a/org.adempiere.base/META-INF/MANIFEST.MF +++ b/org.adempiere.base/META-INF/MANIFEST.MF @@ -115,6 +115,7 @@ Import-Package: com.github.benmanes.caffeine;version="3.1.8", org.antlr.v4.runtime.tree.pattern;version="4.9.2", org.antlr.v4.runtime.tree.xpath;version="4.9.2", org.apache.activemq;version="5.3.0", + org.apache.commons.codec.binary;version="1.16.1", org.apache.commons.collections;version="3.2.2", org.apache.commons.collections.keyvalue;version="3.2.2", org.apache.commons.collections4;version="4.4.0", diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 33399a8826..2e4c54b433 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -20,6 +20,7 @@ import java.io.ObjectInputStream; import java.io.Serializable; import java.io.StringWriter; +import org.apache.commons.codec.binary.Hex; import java.math.BigDecimal; import java.sql.Blob; import java.sql.Clob; @@ -3572,8 +3573,8 @@ protected int buildInsertSQL(StringBuilder sqlInsert, boolean withValues, List Date: Mon, 6 May 2024 08:26:03 +0700 Subject: [PATCH 2/7] add support for oracle database --- .../impexp/GridTabSQLInsertExporter.java | 5 ++-- .../org/compiere/db/AdempiereDatabase.java | 7 +++++ .../src/org/compiere/model/PO.java | 29 ++++++++++++++----- .../src/org/compiere/db/DB_Oracle.java | 7 +++++ .../src/org/compiere/db/DB_PostgreSQL.java | 6 ++++ 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java b/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java index 402ac04bb0..00c8540571 100644 --- a/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java +++ b/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java @@ -137,9 +137,8 @@ public void export(GridTab gridTab, List childs, boolean isCurrentRowOn * @param pgs list to add postgresql insert script */ protected void addSQLInsert(PO po, List oracles, List pgs) { - String sql = po.toInsertSQL(); - String oracle = Database.getDatabase(Database.DB_ORACLE).convertStatement(sql); - String pg = Database.getDatabase(Database.DB_POSTGRESQL).convertStatement(sql); + String oracle = Database.getDatabase(Database.DB_ORACLE).getSQLInsert(po); + String pg = Database.getDatabase(Database.DB_POSTGRESQL).getSQLInsert(po); oracles.add(oracle); pgs.add(pg); } diff --git a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java index 966f233e29..12b3c5f8ed 100644 --- a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java +++ b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java @@ -488,6 +488,13 @@ public default String getSQLCreate(MTable table) return sb.toString(); } // getSQLCreate + /** + * Get insert SQL statement + * @param po + * @return insert SQL statement + */ + public String getSQLInsert(PO po); + /** * @param column * @return DDL SQL statement for column diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 2e4c54b433..7562051b4a 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -60,6 +60,7 @@ import org.compiere.Adempiere; import org.compiere.acct.Doc; import org.compiere.db.AdempiereDatabase; +import org.compiere.db.Database; import org.compiere.util.AdempiereUserError; import org.compiere.util.CCache; import org.compiere.util.CLogMgt; @@ -3465,7 +3466,7 @@ private boolean doInsert(boolean withValues) { // SQL StringBuilder sqlInsert = new StringBuilder(); - AD_ChangeLog_ID = buildInsertSQL(sqlInsert, withValues, params, session, AD_ChangeLog_ID, false); + AD_ChangeLog_ID = buildInsertSQL(sqlInsert, withValues, params, session, AD_ChangeLog_ID, false, null); // int no = withValues ? DB.executeUpdate(sqlInsert.toString(), m_trxName) : DB.executeUpdate(sqlInsert.toString(), params.toArray(), false, m_trxName); @@ -3534,12 +3535,13 @@ private boolean doInsert(boolean withValues) { /** * Export data as insert SQL statement + * @param database * @return SQL insert statement */ - public String toInsertSQL() + public String toInsertSQL(String database) { StringBuilder sqlInsert = new StringBuilder(); - buildInsertSQL(sqlInsert, true, null, null, 0, true); + buildInsertSQL(sqlInsert, true, null, null, 0, true, database); return sqlInsert.toString(); } @@ -3554,7 +3556,7 @@ public String toInsertSQL() * @return last AD_ChangeLog_ID */ protected int buildInsertSQL(StringBuilder sqlInsert, boolean withValues, List params, MSession session, - int AD_ChangeLog_ID, boolean generateScriptOnly) { + int AD_ChangeLog_ID, boolean generateScriptOnly, String database) { sqlInsert.append("INSERT INTO "); sqlInsert.append(p_info.getTableName()).append(" ("); StringBuilder sqlValues = new StringBuilder(") VALUES ("); @@ -3573,8 +3575,6 @@ protected int buildInsertSQL(StringBuilder sqlInsert, boolean withValues, List Date: Mon, 6 May 2024 21:32:25 +0700 Subject: [PATCH 3/7] recode based on hengsin hint --- .../org/adempiere/impexp/GridTabSQLInsertExporter.java | 4 ++-- .../src/org/compiere/db/AdempiereDatabase.java | 8 ++++---- org.adempiere.base/src/org/compiere/model/PO.java | 8 ++------ .../src/org/compiere/db/DB_Oracle.java | 5 ++--- .../src/org/compiere/db/DB_PostgreSQL.java | 5 ++--- 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java b/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java index 00c8540571..1089c09208 100644 --- a/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java +++ b/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java @@ -137,8 +137,8 @@ public void export(GridTab gridTab, List childs, boolean isCurrentRowOn * @param pgs list to add postgresql insert script */ protected void addSQLInsert(PO po, List oracles, List pgs) { - String oracle = Database.getDatabase(Database.DB_ORACLE).getSQLInsert(po); - String pg = Database.getDatabase(Database.DB_POSTGRESQL).getSQLInsert(po); + String oracle = Database.getDatabase(Database.DB_ORACLE).convertStatement(po.toInsertSQL(Database.DB_ORACLE)); + String pg = Database.getDatabase(Database.DB_POSTGRESQL).convertStatement(po.toInsertSQL(Database.DB_POSTGRESQL)); oracles.add(oracle); pgs.add(pg); } diff --git a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java index 12b3c5f8ed..6a470d07a6 100644 --- a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java +++ b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java @@ -489,11 +489,11 @@ public default String getSQLCreate(MTable table) } // getSQLCreate /** - * Get insert SQL statement - * @param po - * @return insert SQL statement + * Get SQL Statement to store Blob + * @param hexString + * @return SQL statement */ - public String getSQLInsert(PO po); + public String TO_Blob(String hexString); /** * @param column diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 7562051b4a..c06f878ba6 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -3683,13 +3683,9 @@ else if (c == String.class) sqlValues.append (encrypt(i,DB.TO_STRING ((String)value))); else if (DisplayType.isLOB(dt)) { - if(database.equals(Database.DB_POSTGRESQL)) + if(database!=null) { - sqlValues.append ("decode('"+Hex.encodeHexString((byte[]) value)+"','hex')"); - } - else if(database.equals(Database.DB_ORACLE)) - { - sqlValues.append ("hextoraw('"+Hex.encodeHexString((byte[]) value)+"')"); + sqlValues.append (Database.getDatabase(database).TO_Blob(Hex.encodeHexString((byte[]) value))); } else if (p_info.isColumnMandatory(i)) { 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 3e8d394a0e..01e7aad1c7 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 @@ -1219,8 +1219,7 @@ public ITablePartitionService getTablePartitionService() { } @Override - public String getSQLInsert(PO po) { - String sql = po.toInsertSQL(Database.DB_ORACLE); - return convertStatement(sql); + public String TO_Blob(String hexString) { + return "HEXTORAW('"+hexString+"')"; } } // 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 60340e45b4..ddfafc81cf 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 @@ -1407,8 +1407,7 @@ public ITablePartitionService getTablePartitionService() { } @Override - public String getSQLInsert(PO po) { - String sql = po.toInsertSQL(Database.DB_POSTGRESQL); - return convertStatement(sql); + public String TO_Blob(String hexString) { + return "decode('"+hexString+"','hex')"; } } // DB_PostgreSQL From a5ee7ebdaea19ea1a3d21d56b7c9f92e468a80d0 Mon Sep 17 00:00:00 2001 From: zuhriutama Date: Wed, 8 May 2024 09:24:31 +0700 Subject: [PATCH 4/7] - added sysconfig for export blob column option - use java17 hex string format --- migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql | 9 +++++++++ .../iD12/postgresql/202405080546_IDEMPIERE-6133.sql | 6 ++++++ org.adempiere.base/META-INF/MANIFEST.MF | 1 - .../src/org/compiere/db/AdempiereDatabase.java | 4 ++-- .../src/org/compiere/model/MSysConfig.java | 1 + org.adempiere.base/src/org/compiere/model/PO.java | 5 ++--- .../src/org/compiere/db/DB_Oracle.java | 5 +++-- .../src/org/compiere/db/DB_PostgreSQL.java | 5 +++-- 8 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql create mode 100644 migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql diff --git a/migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql b/migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql new file mode 100644 index 0000000000..3367a7dc7e --- /dev/null +++ b/migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql @@ -0,0 +1,9 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- May 8, 2024, 5:46:45 AM WIB +INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200246,0,0,TO_TIMESTAMP('2024-05-08 05:46:45','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2024-05-08 05:46:45','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','EXPORT_BLOB_COLUMN_FOR_INSERT','Y','include blob column when export record using sql insert script option','D','C','c63dc8f1-c098-4f93-b84a-0897c0cf9c6a') +; + +-- IDEMPIERE-6133 +SELECT register_migration_script('202405080546_IDEMPIERE-6133.sql') FROM dual; \ No newline at end of file diff --git a/migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql b/migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql new file mode 100644 index 0000000000..1977f1274f --- /dev/null +++ b/migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql @@ -0,0 +1,6 @@ +-- May 8, 2024, 5:46:45 AM WIB +INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200246,0,0,TO_TIMESTAMP('2024-05-08 05:46:45','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2024-05-08 05:46:45','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','EXPORT_BLOB_COLUMN_FOR_INSERT','Y','include blob column when export record using sql insert script option','D','C','c63dc8f1-c098-4f93-b84a-0897c0cf9c6a') +; + +-- IDEMPIERE-6133 +SELECT register_migration_script('202405080546_IDEMPIERE-6133.sql') FROM dual; \ No newline at end of file diff --git a/org.adempiere.base/META-INF/MANIFEST.MF b/org.adempiere.base/META-INF/MANIFEST.MF index 6f9852ebe6..0eb2bfbf9b 100644 --- a/org.adempiere.base/META-INF/MANIFEST.MF +++ b/org.adempiere.base/META-INF/MANIFEST.MF @@ -115,7 +115,6 @@ Import-Package: com.github.benmanes.caffeine;version="3.1.8", org.antlr.v4.runtime.tree.pattern;version="4.9.2", org.antlr.v4.runtime.tree.xpath;version="4.9.2", org.apache.activemq;version="5.3.0", - org.apache.commons.codec.binary;version="1.16.1", org.apache.commons.collections;version="3.2.2", org.apache.commons.collections.keyvalue;version="3.2.2", org.apache.commons.collections4;version="4.4.0", diff --git a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java index 6a470d07a6..f7297a051e 100644 --- a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java +++ b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java @@ -489,11 +489,11 @@ public default String getSQLCreate(MTable table) } // getSQLCreate /** - * Get SQL Statement to store Blob + * Convert blob to hex encoded string and return SQL function that will convert the hex encoded string back to blob * @param hexString * @return SQL statement */ - public String TO_Blob(String hexString); + public String TO_Blob(byte[] blob); /** * @param column diff --git a/org.adempiere.base/src/org/compiere/model/MSysConfig.java b/org.adempiere.base/src/org/compiere/model/MSysConfig.java index 6784a5f8de..068717a723 100644 --- a/org.adempiere.base/src/org/compiere/model/MSysConfig.java +++ b/org.adempiere.base/src/org/compiere/model/MSysConfig.java @@ -111,6 +111,7 @@ public class MSysConfig extends X_AD_SysConfig public static final String ENABLE_SSO = "ENABLE_SSO"; public static final String ENABLE_SSO_OSGI_CONSOLE = "ENABLE_SSO_OSGI_CONSOLE"; public static final String ENABLE_SSO_IDEMPIERE_MONITOR = "ENABLE_SSO_IDEMPIERE_MONITOR"; + public static final String EXPORT_BLOB_COLUMN_FOR_INSERT = "EXPORT_BLOB_COLUMN_FOR_INSERT"; public static final String FEEDBACK_EMAIL_CC = "FEEDBACK_EMAIL_CC"; public static final String FEEDBACK_EMAIL_TO = "FEEDBACK_EMAIL_TO"; public static final String FORCE_POSTING_PRIOR_TO_PERIOD_CLOSE = "FORCE_POSTING_PRIOR_TO_PERIOD_CLOSE"; diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index c06f878ba6..746c6891ce 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -20,7 +20,6 @@ import java.io.ObjectInputStream; import java.io.Serializable; import java.io.StringWriter; -import org.apache.commons.codec.binary.Hex; import java.math.BigDecimal; import java.sql.Blob; import java.sql.Clob; @@ -3683,9 +3682,9 @@ else if (c == String.class) sqlValues.append (encrypt(i,DB.TO_STRING ((String)value))); else if (DisplayType.isLOB(dt)) { - if(database!=null) + if(database!=null && MSysConfig.getBooleanValue(MSysConfig.EXPORT_BLOB_COLUMN_FOR_INSERT, true, getAD_Client_ID())) { - sqlValues.append (Database.getDatabase(database).TO_Blob(Hex.encodeHexString((byte[]) value))); + sqlValues.append (Database.getDatabase(database).TO_Blob((byte[]) value)); } else if (p_info.isColumnMandatory(i)) { 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 01e7aad1c7..a4360c6888 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 @@ -31,6 +31,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; +import java.util.HexFormat; import java.util.Properties; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; @@ -1219,7 +1220,7 @@ public ITablePartitionService getTablePartitionService() { } @Override - public String TO_Blob(String hexString) { - return "HEXTORAW('"+hexString+"')"; + public String TO_Blob(byte[] blob) { + return "HEXTORAW('"+HexFormat.of().formatHex(blob)+"')"; } } // 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 ddfafc81cf..6b1333e265 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 @@ -34,6 +34,7 @@ import java.sql.Statement; import java.sql.Timestamp; import java.util.Arrays; +import java.util.HexFormat; import java.util.List; import java.util.Properties; import java.util.concurrent.CountDownLatch; @@ -1407,7 +1408,7 @@ public ITablePartitionService getTablePartitionService() { } @Override - public String TO_Blob(String hexString) { - return "decode('"+hexString+"','hex')"; + public String TO_Blob(byte[] blob) { + return "decode('"+HexFormat.of().formatHex(blob)+"','hex')"; } } // DB_PostgreSQL From f02f5d9a44dd2e8b2728bd1d02ce213c47bc051c Mon Sep 17 00:00:00 2001 From: zuhriutama Date: Wed, 8 May 2024 14:15:58 +0700 Subject: [PATCH 5/7] change param name on java doc --- org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java index f7297a051e..5c9fdfa3b9 100644 --- a/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java +++ b/org.adempiere.base/src/org/compiere/db/AdempiereDatabase.java @@ -490,7 +490,7 @@ public default String getSQLCreate(MTable table) /** * Convert blob to hex encoded string and return SQL function that will convert the hex encoded string back to blob - * @param hexString + * @param blob * @return SQL statement */ public String TO_Blob(byte[] blob); From 9ffe823da4a3a7ce573eeea6b3e1663340169e70 Mon Sep 17 00:00:00 2001 From: zuhriutama Date: Wed, 8 May 2024 20:03:43 +0700 Subject: [PATCH 6/7] apply patch from carlos --- migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql | 6 +++++- migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql | 6 +++++- org.adempiere.base/src/org/compiere/model/PO.java | 4 ++-- .../src/org/compiere/db/DB_Oracle.java | 1 - 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql b/migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql index 3367a7dc7e..d87569972b 100644 --- a/migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql +++ b/migration/iD12/oracle/202405080546_IDEMPIERE-6133.sql @@ -5,5 +5,9 @@ SET DEFINE OFF INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200246,0,0,TO_TIMESTAMP('2024-05-08 05:46:45','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2024-05-08 05:46:45','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','EXPORT_BLOB_COLUMN_FOR_INSERT','Y','include blob column when export record using sql insert script option','D','C','c63dc8f1-c098-4f93-b84a-0897c0cf9c6a') ; +-- May 8, 2024, 12:16:14 PM CEST +UPDATE AD_Column SET FieldLength=0, AD_Reference_ID=23,Updated=TO_DATE('2024-05-08 12:16:14','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=10011 +; + -- IDEMPIERE-6133 -SELECT register_migration_script('202405080546_IDEMPIERE-6133.sql') FROM dual; \ No newline at end of file +SELECT register_migration_script('202405080546_IDEMPIERE-6133.sql') FROM dual; diff --git a/migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql b/migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql index 1977f1274f..5955965de4 100644 --- a/migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql +++ b/migration/iD12/postgresql/202405080546_IDEMPIERE-6133.sql @@ -2,5 +2,9 @@ INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200246,0,0,TO_TIMESTAMP('2024-05-08 05:46:45','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2024-05-08 05:46:45','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','EXPORT_BLOB_COLUMN_FOR_INSERT','Y','include blob column when export record using sql insert script option','D','C','c63dc8f1-c098-4f93-b84a-0897c0cf9c6a') ; +-- May 8, 2024, 12:16:14 PM CEST +UPDATE AD_Column SET FieldLength=0, AD_Reference_ID=23,Updated=TO_TIMESTAMP('2024-05-08 12:16:14','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=10011 +; + -- IDEMPIERE-6133 -SELECT register_migration_script('202405080546_IDEMPIERE-6133.sql') FROM dual; \ No newline at end of file +SELECT register_migration_script('202405080546_IDEMPIERE-6133.sql') FROM dual; diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 746c6891ce..9f1e487da1 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -3688,7 +3688,7 @@ else if (DisplayType.isLOB(dt)) } else if (p_info.isColumnMandatory(i)) { - sqlValues.append("''"); // no db dependent stuff here -- at this point value is known to be not null + sqlValues.append("'0'"); // no db dependent stuff here -- at this point value is known to be not null } else { @@ -5423,7 +5423,7 @@ private boolean lobSave () for (int i = 0; i < m_lobInfo.size(); i++) { PO_LOB lob = (PO_LOB)m_lobInfo.get(i); - if (!lob.save(get_TrxName())) + if (!lob.save(get_WhereClause(true), get_TrxName())) { retValue = false; 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 a4360c6888..1f339d2b41 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 @@ -370,7 +370,6 @@ public String getStatus() */ public String convertStatement (String oraStatement) { - Convert.logMigrationScript(oraStatement, null); if (SystemProperties.isDBDebug()) { String filterOrDebug = SystemProperties.getDBDebugFilter(); From f9bb0fb589d5ab7db0991d1f99396a09c3dd1592 Mon Sep 17 00:00:00 2001 From: zuhriutama Date: Wed, 8 May 2024 20:05:11 +0700 Subject: [PATCH 7/7] apply patch from hengsin --- .../impexp/GridTabSQLInsertExporter.java | 2 +- .../src/org/compiere/model/PO.java | 52 ++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java b/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java index 1089c09208..5ed248d924 100644 --- a/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java +++ b/org.adempiere.base/src/org/adempiere/impexp/GridTabSQLInsertExporter.java @@ -86,7 +86,7 @@ public void export(GridTab gridTab, List childs, boolean isCurrentRowOn ZipEntry fileEntry = new ZipEntry("oracle/" + table.getTableName() + ".sql"); zos.putNextEntry(fileEntry); for(String oracle : oracles) - zos.write((oracle+"\n;\n").getBytes()); + zos.write(!(oracle.endsWith("/")) ? (oracle+"\n;\n").getBytes() : (oracle+"\n").getBytes()); zos.closeEntry(); fileEntry = new ZipEntry("postgresql/" + table.getTableName() + ".sql"); diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 9f1e487da1..de4c6ca650 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -36,6 +36,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Properties; import java.util.Set; @@ -3561,6 +3562,7 @@ protected int buildInsertSQL(StringBuilder sqlInsert, boolean withValues, List oracleBlobSQL = new HashMap(); for (int i = 0; i < size; i++) { Object value = get_Value(i); @@ -3684,7 +3686,14 @@ else if (DisplayType.isLOB(dt)) { if(database!=null && MSysConfig.getBooleanValue(MSysConfig.EXPORT_BLOB_COLUMN_FOR_INSERT, true, getAD_Client_ID())) { - sqlValues.append (Database.getDatabase(database).TO_Blob((byte[]) value)); + String blobSQL = Database.getDatabase(database).TO_Blob((byte[]) value); + // Oracle size limit for one SQL statement + if (blobSQL != null && database.equals(Database.DB_ORACLE) && blobSQL.length() > 2048) + { + oracleBlobSQL.put(p_info.getColumnName(i), blobSQL); + blobSQL = p_info.isColumnMandatory(i) ? "'0'" : null; + } + sqlValues.append (blobSQL); } else if (p_info.isColumnMandatory(i)) { @@ -3829,6 +3838,47 @@ else if (c == String.class) } sqlInsert.append(sqlValues) .append(")"); + + // Use pl/sql block for Oracle blob insert that's > 2048 bytes + if (!oracleBlobSQL.isEmpty()) + { + sqlInsert.append("\n;"); + for(String column : oracleBlobSQL.keySet()) + { + sqlInsert.append("\n\n"); + String blobSQL = oracleBlobSQL.get(column); + int hexDataStart = blobSQL.indexOf("'"); + int hexDataEnd = blobSQL.indexOf("'", hexDataStart+1); + String functionStart = blobSQL.substring(0, hexDataStart); + String hexData = blobSQL.substring(hexDataStart+1, hexDataEnd); + String functionEnd = blobSQL.substring(hexDataEnd+1); + int remaining = hexData.length(); + int lineSize = 2048; + sqlInsert.append("DECLARE\n") + .append(" lob_out blob;\n") + .append("BEGIN\n") + .append(" UPDATE ").append(p_info.getTableName()) + .append(" SET ").append(column).append("=EMPTY_BLOB()\n") + .append(" WHERE ").append(getUUIDColumnName()).append("=") + .append("'").append(get_UUID()).append("';\n") + .append(" SELECT ").append(column).append(" INTO lob_out\n") + .append(" FROM ").append(p_info.getTableName()).append("\n") + .append(" WHERE ").append(getUUIDColumnName()).append("=") + .append("'").append(get_UUID()).append("'\n") + .append(" FOR UPDATE;\n"); + // Split hex encoded text into 2048 bytes block + int index = 0; + while (remaining > 0) + { + sqlInsert.append(" dbms_lob.append(lob_out, ").append(functionStart).append("'"); + String data = remaining > lineSize ? hexData.substring(index, index+lineSize) : hexData.substring(index); + sqlInsert.append(data).append("'").append(functionEnd).append(");\n"); + remaining = remaining > lineSize ? remaining - lineSize : 0; + index = index + lineSize; + } + sqlInsert.append("END;\n/"); + } + } return AD_ChangeLog_ID; }