From 6679626373852d25e54c1d4689eb4140d6cdac5f Mon Sep 17 00:00:00 2001 From: zuhriutama Date: Mon, 4 Mar 2024 12:05:06 +0700 Subject: [PATCH 1/2] added support for postgresql --- META-INF/MANIFEST.MF | 3 +- .../processor/PostgreSQLExtractor.java | 124 ++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/com/cloudempiere/dataextractor/processor/PostgreSQLExtractor.java diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index 46e67cb..6338179 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -10,7 +10,8 @@ Bundle-ActivationPolicy: lazy Require-Bundle: org.adempiere.base;bundle-version="10.0.0", org.adempiere.plugin.utils;bundle-version="10.0.0", org.adempiere.pipo;bundle-version="10.0.0" -Import-Package: org.osgi.framework;version="1.10.0", +Import-Package: org.apache.commons.codec.binary;version="1.14.0", + org.osgi.framework;version="1.10.0", org.osgi.service.component.annotations;version="1.3.0" Service-Component: OSGI-INF/*.xml Export-Package: org.slf4j, diff --git a/src/com/cloudempiere/dataextractor/processor/PostgreSQLExtractor.java b/src/com/cloudempiere/dataextractor/processor/PostgreSQLExtractor.java new file mode 100644 index 0000000..643cd04 --- /dev/null +++ b/src/com/cloudempiere/dataextractor/processor/PostgreSQLExtractor.java @@ -0,0 +1,124 @@ +package com.cloudempiere.dataextractor.processor; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.adempiere.base.annotation.Process; +import org.adempiere.exceptions.AdempiereException; +import org.adempiere.pipo2.Zipper; +import org.apache.commons.codec.binary.Hex; +import org.compiere.tools.FileUtil; +import org.compiere.util.DB; + +import com.cloudempiere.dataextractor.model.MDEXColumn; +import com.cloudempiere.dataextractor.model.MDEXJobTable; +import com.cloudempiere.dataextractor.model.MDEXTable; + + +@Process +public class PostgreSQLExtractor extends BaseExtractor{ + + @Override + public File generate() { + try { + String folderName = createTmpDirectory().getAbsolutePath() + File.separator + schema.getName() + "_" + schema.getDEX_Schema_ID(); + File folder = new File(folderName); + folder.mkdir(); + + for(MDEXJobTable jobTable : job.getTables()) { + if(jobTable.isProcessed()) + continue; + + MDEXTable table = (MDEXTable) jobTable.getDEX_Table(); + + File file = new File(folder.getAbsolutePath() + File.separator + table.getTableName() + ".sql"); + + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF8")); + + List columns = getColumns(table); + + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + List columnNames = new ArrayList(); + StringBuffer row = new StringBuffer("CREATE TABLE "+table.getTableName()+" ("); + for(int i=0;i0) + row.append(","); + if(column.getType().equals(MDEXColumn.DATATYPE_Number)) { + row.append(column.getName() + " numeric(10) NULL"); + }else if(column.getType().equals(MDEXColumn.DATATYPE_Blob)) { + row.append(column.getName() + " bytea NULL"); + }else + row.append(column.getName() + " TEXT NULL"); + columnNames.add(column.getName()); + } + row.append(");\n"); + + out.write(row.toString()); + + pstmt = DB.prepareStatement(table.getSql(), null); + rs = pstmt.executeQuery(); + + while(rs.next()) { + row = new StringBuffer("INSERT INTO "+table.getTableName()+"(" + + String.join(",", columnNames) + + ") VALUES("); + for(int i=0;i0) + row.append(","); + if(column.getType().equals(MDEXColumn.DATATYPE_Number)) { + row.append(rs.getInt(column.getColumnName())); + }else if(column.getType().equals(MDEXColumn.DATATYPE_Blob)) { + if(rs.getString(column.getColumnName())!=null) { + row.append("decode('"+Hex.encodeHexString(rs.getBytes(column.getColumnName()))+"','hex')"); + }else { + row.append("null"); + } + + }else + row.append("'"+ rs.getString(column.getColumnName()) + "'"); + } + row.append(");\n"); + + out.write(row.toString()); + } + } catch (SQLException ex) { + throw new AdempiereException(ex.getMessage()); + } finally { + DB.close(rs, pstmt); + } + out.close(); + + jobTable.setProcessed(true); + jobTable.saveEx(); + } + + File zip = new File(folderName + ".zip"); + if(zip.exists()) + zip.delete(); + Zipper.zipFolder(folder, zip, "*"); + FileUtil.deleteFolderRecursive(folder); + + return zip; + + }catch(IOException ex) { + log.info(ex.getMessage()); + } + + return null; + } + + + +} From 1c57e9d2028c680abb74f14fd6e14aec94308c63 Mon Sep 17 00:00:00 2001 From: zuhriutama Date: Sat, 16 Mar 2024 12:42:18 +0700 Subject: [PATCH 2/2] combine all query into one sql --- .../processor/PostgreSQLExtractor.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/com/cloudempiere/dataextractor/processor/PostgreSQLExtractor.java b/src/com/cloudempiere/dataextractor/processor/PostgreSQLExtractor.java index 643cd04..0242ef2 100644 --- a/src/com/cloudempiere/dataextractor/processor/PostgreSQLExtractor.java +++ b/src/com/cloudempiere/dataextractor/processor/PostgreSQLExtractor.java @@ -15,7 +15,6 @@ import org.adempiere.exceptions.AdempiereException; import org.adempiere.pipo2.Zipper; import org.apache.commons.codec.binary.Hex; -import org.compiere.tools.FileUtil; import org.compiere.util.DB; import com.cloudempiere.dataextractor.model.MDEXColumn; @@ -29,19 +28,20 @@ public class PostgreSQLExtractor extends BaseExtractor{ @Override public File generate() { try { - String folderName = createTmpDirectory().getAbsolutePath() + File.separator + schema.getName() + "_" + schema.getDEX_Schema_ID(); - File folder = new File(folderName); - folder.mkdir(); + String fileName = createTmpDirectory().getAbsolutePath() + File.separator + schema.getName() + "_" + schema.getDEX_Schema_ID(); + File folder = new File(fileName); + if(!folder.exists()) + folder.mkdir(); + + File file = new File(fileName + File.separator + "backup.sql"); + + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF8")); for(MDEXJobTable jobTable : job.getTables()) { if(jobTable.isProcessed()) continue; MDEXTable table = (MDEXTable) jobTable.getDEX_Table(); - - File file = new File(folder.getAbsolutePath() + File.separator + table.getTableName() + ".sql"); - - BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF8")); List columns = getColumns(table); @@ -98,17 +98,17 @@ public File generate() { } finally { DB.close(rs, pstmt); } - out.close(); jobTable.setProcessed(true); jobTable.saveEx(); } + + out.close(); - File zip = new File(folderName + ".zip"); + File zip = new File(fileName + ".zip"); if(zip.exists()) zip.delete(); - Zipper.zipFolder(folder, zip, "*"); - FileUtil.deleteFolderRecursive(folder); + Zipper.zipFolder(folder, zip, ""); return zip;