From b8f0aa4bd8c53aafca66c5271b33dfe81ccfa457 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 14 Mar 2018 18:13:08 -0300 Subject: [PATCH] IDEMPIERE-3655 Improve installer to include migration scripts and syncApplied --- .../oracle/201803141439_IDEMPIERE-3655.sql | 11 ++ .../201803141439_IDEMPIERE-3655.sql | 8 ++ migration/local_sql/README.txt | 20 ++++ migration/zip_2pack/README.txt | 8 ++ .../utils/PackInApplicationActivator.java | 16 +-- org.adempiere.server-feature/build.properties | 1 + .../utils.unix/RUN_SyncDB.sh | 10 ++ .../oracle/01_add_missing_Translations.sql | 69 ------------ .../utils.unix/oracle/PostMigration.sh | 2 +- .../utils.unix/oracle/SyncDB.sh | 100 ++++++++++++++++++ .../01_add_missing_translations.sql | 69 ------------ .../utils.unix/postgresql/PostMigration.sh | 2 +- .../utils.unix/postgresql/SyncDB.sh | 100 ++++++++++++++++++ .../utils.windows/RUN_SyncDB.bat | 4 + .../oracle/01_add_missing_Translations.sql | 69 ------------ .../utils.windows/oracle/SyncDB.bat | 28 +++++ .../01_add_missing_translations.sql | 69 ------------ .../utils.windows/postgresql/SyncDB.bat | 29 +++++ 18 files changed, 329 insertions(+), 286 deletions(-) create mode 100644 migration/i5.1/oracle/201803141439_IDEMPIERE-3655.sql create mode 100644 migration/i5.1/postgresql/201803141439_IDEMPIERE-3655.sql create mode 100644 migration/local_sql/README.txt create mode 100644 migration/zip_2pack/README.txt create mode 100644 org.adempiere.server-feature/utils.unix/RUN_SyncDB.sh delete mode 100644 org.adempiere.server-feature/utils.unix/oracle/01_add_missing_Translations.sql create mode 100644 org.adempiere.server-feature/utils.unix/oracle/SyncDB.sh delete mode 100644 org.adempiere.server-feature/utils.unix/postgresql/01_add_missing_translations.sql create mode 100644 org.adempiere.server-feature/utils.unix/postgresql/SyncDB.sh create mode 100644 org.adempiere.server-feature/utils.windows/RUN_SyncDB.bat delete mode 100644 org.adempiere.server-feature/utils.windows/oracle/01_add_missing_Translations.sql create mode 100644 org.adempiere.server-feature/utils.windows/oracle/SyncDB.bat delete mode 100644 org.adempiere.server-feature/utils.windows/postgresql/01_add_missing_translations.sql create mode 100644 org.adempiere.server-feature/utils.windows/postgresql/SyncDB.bat diff --git a/migration/i5.1/oracle/201803141439_IDEMPIERE-3655.sql b/migration/i5.1/oracle/201803141439_IDEMPIERE-3655.sql new file mode 100644 index 0000000000..d6e6fdec60 --- /dev/null +++ b/migration/i5.1/oracle/201803141439_IDEMPIERE-3655.sql @@ -0,0 +1,11 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3655 +-- Mar 14, 2018 2:27:47 PM BRT +UPDATE AD_SysConfig SET Value=CASE WHEN Value NOT LIKE 'migration;%' THEN 'migration;'||TRIM(Value) ELSE Value END,Updated=TO_DATE('2018-03-14 14:27:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_SysConfig_ID=200102 +; + +SELECT register_migration_script('201803141439_IDEMPIERE-3655.sql') FROM dual +; + diff --git a/migration/i5.1/postgresql/201803141439_IDEMPIERE-3655.sql b/migration/i5.1/postgresql/201803141439_IDEMPIERE-3655.sql new file mode 100644 index 0000000000..8a191c1789 --- /dev/null +++ b/migration/i5.1/postgresql/201803141439_IDEMPIERE-3655.sql @@ -0,0 +1,8 @@ +-- IDEMPIERE-3655 +-- Mar 14, 2018 2:27:47 PM BRT +UPDATE AD_SysConfig SET Value=CASE WHEN Value NOT LIKE 'migration;%' THEN 'migration;'||TRIM(Value) ELSE Value END,Updated=TO_DATE('2018-03-14 14:27:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_SysConfig_ID=200102 +; + +SELECT register_migration_script('201803141439_IDEMPIERE-3655.sql') FROM dual +; + diff --git a/migration/local_sql/README.txt b/migration/local_sql/README.txt new file mode 100644 index 0000000000..382afaa483 --- /dev/null +++ b/migration/local_sql/README.txt @@ -0,0 +1,20 @@ +You can add here custom scripts for your installation to be applied when running the RUN_SyncDB utility. + +Custom scripts must follow the same convention as core scripts, this is: +postgresql/yyyymmddHHMM_InformationalDescription.sql +oracle/yyyymmddHHMM_InformationalDescription.sql + +This is, the scripts must be within a folder with name postgresql or oracle depending on the database to apply, and must follow the convention yyyymmddHHMM_InformationalDescription.sql + +* yyyymmddHHMM : the timestamp of the SQL script, this is relevant as the files will be applied ordering by this timestamp - independently of the folder where they are located + +* InformationalDescription : optional additional information + +folders are applied in alphabetical order, for example: +i4.1 +i4.1z +i5.1 + ... and so on until the current version ... and then +local_sql + +Note it process ANY FOLDER that contains a subfolder postgresql or oracle, and at the end it process the scripts in processes_post_migration \ No newline at end of file diff --git a/migration/zip_2pack/README.txt b/migration/zip_2pack/README.txt new file mode 100644 index 0000000000..03ca950d9f --- /dev/null +++ b/migration/zip_2pack/README.txt @@ -0,0 +1,8 @@ +2Pack files are processed anywhere within the migration folder, however, it is recommended to add here your custom 2Pack zip files for your installation, these 2Pack files will be applied after starting the server by the org.adempiere.plugin.utils.PackInApplicationActivator plugin. + +Name of 2pack files must follow the convention: +yyyymmddHHMM_ClientValue_InformationalDescription.zip + +* yyyymmddHHMM : the timestamp of the 2pack file, this is relevant as the files will be applied ordering by this timestamp - independently of the folder where they are located +* ClientValue : refers to the AD_Client.Value - this is case sensitive and it describes in which client (tenant) the 2pack is applied +* InformationalDescription : optional additional information \ No newline at end of file diff --git a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java index 5a3020485d..44764cd4dc 100644 --- a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java +++ b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java @@ -137,7 +137,7 @@ public class PackInApplicationActivator extends AbstractActivator { File[] fileArray = getFilesToProcess(folders); if (fileArray.length <= 0) { - System.out.println("No zip files to process"); + logger.info("No zip files to process"); return; } @@ -162,9 +162,9 @@ public class PackInApplicationActivator extends AbstractActivator { } if (filesToProcess.size() > 0) { - System.out.println("The following packages were not applied: "); + logger.warning("The following packages were not applied: "); for (File file : filesToProcess) { - System.out.println(file.getName()); + logger.warning(file.getName()); } } } @@ -172,7 +172,7 @@ public class PackInApplicationActivator extends AbstractActivator { private boolean packIn(File packinFile) { if (packinFile != null && service != null) { String fileName = packinFile.getName(); - System.out.println("Installing " + fileName + " ..."); + logger.warning("Installing " + fileName + " ..."); // The convention for package names is: yyyymmddHHMM_ClientValue_InformationalDescription.zip String [] parts = fileName.split("_"); @@ -194,7 +194,7 @@ public class PackInApplicationActivator extends AbstractActivator { logger.log(Level.SEVERE, "Pack in failed.", e); return false; } - System.out.println(packinFile.getPath() + " installed"); + logger.warning(packinFile.getPath() + " installed"); } return true; @@ -254,7 +254,7 @@ public class PackInApplicationActivator extends AbstractActivator { boolean found = false; for (File fileToProcess : toProcess.listFiles(filter)) { if (!found) { - System.out.println("*** Creating list from folder " + toProcess.toString()); + logger.info("*** Creating list from folder " + toProcess.toString()); found = true; } if (fileToProcess.isDirectory()) @@ -263,7 +263,7 @@ public class PackInApplicationActivator extends AbstractActivator { filesToProcess.add(fileToProcess); } if (!found) { - logger.log(Level.SEVERE, toProcess.getName() + " does not have .zip files or subfolders"); + logger.log(Level.FINE, toProcess.getName() + " does not have .zip files or subfolders"); return; } } else { @@ -283,7 +283,7 @@ public class PackInApplicationActivator extends AbstractActivator { } private MClient getClient(String clientValue) { - String where = "upper(Value) = upper(?)"; + String where = "Value = ?"; Query q = new Query(Env.getCtx(), MClient.Table_Name, where, null) .setParameters(new Object[] {clientValue}) diff --git a/org.adempiere.server-feature/build.properties b/org.adempiere.server-feature/build.properties index 19b15a49f4..1e3fb3ecf2 100644 --- a/org.adempiere.server-feature/build.properties +++ b/org.adempiere.server-feature/build.properties @@ -3,6 +3,7 @@ root=file:build.xml,file:setup.ini,file:extensions-priorty.properties,file:hazel root.folder.data=data root.folder.setup=setup root.folder.jettyhome=jettyhome +root.folder.migration=../migration #linux 64 bits root.linux.gtk.x86_64=file:setup.sh,file:console-setup.sh,file:idempiere-server.sh,file:setup-alt.sh,file:console-setup-alt.sh,file:sign-database-build.sh,file:sign-database-build-alt.sh,file:idempiereEnvTemplate.properties diff --git a/org.adempiere.server-feature/utils.unix/RUN_SyncDB.sh b/org.adempiere.server-feature/utils.unix/RUN_SyncDB.sh new file mode 100644 index 0000000000..3d8d4c67fc --- /dev/null +++ b/org.adempiere.server-feature/utils.unix/RUN_SyncDB.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# Author Carlos Ruiz +if [ $IDEMPIERE_HOME ]; then + cd $IDEMPIERE_HOME/utils +fi +. ./myEnvironment.sh Server +echo Synchronize iDempiere Database - $IDEMPIERE_HOME \($ADEMPIERE_DB_NAME\) + +sh $ADEMPIERE_DB_PATH/SyncDB.sh "$ADEMPIERE_DB_USER" "$ADEMPIERE_DB_PASSWORD" "$ADEMPIERE_DB_PATH" diff --git a/org.adempiere.server-feature/utils.unix/oracle/01_add_missing_Translations.sql b/org.adempiere.server-feature/utils.unix/oracle/01_add_missing_Translations.sql deleted file mode 100644 index b3ba3d6223..0000000000 --- a/org.adempiere.server-feature/utils.unix/oracle/01_add_missing_Translations.sql +++ /dev/null @@ -1,69 +0,0 @@ -DECLARE - ins VARCHAR2 (2000); - sel VARCHAR2 (2000); - inssel VARCHAR2 (4001); - table_id NUMBER; -BEGIN - ins := RPAD (' ', 2000, ' '); - sel := RPAD (' ', 2000, ' '); - inssel := RPAD (' ', 4001, ' '); - DBMS_OUTPUT.PUT_LINE ('Start'); - - FOR t IN (SELECT ad_table_id, - SUBSTR (tablename, 1, LENGTH (tablename) - 4) tablename - FROM AD_TABLE - WHERE tablename LIKE '%_Trl' AND isactive = 'Y' - AND isview = 'N') - LOOP - ins := - 'INSERT INTO ' - || t.tablename - || '_TRL (' - || 'ad_language,ad_client_id,ad_org_id,created,createdby,updated,updatedby,isactive,istranslated,' - || t.tablename - || '_id'; - sel := - 'SELECT l.ad_language,t.ad_client_id,t.ad_org_id,t.created,t.createdby,t.updated,t.updatedby,t.isactive,''N'' as istranslated,' - || t.tablename - || '_id'; - - SELECT ad_table_id - INTO table_id - FROM AD_TABLE - WHERE tablename = t.tablename; - - FOR c IN (SELECT col.columnname - FROM AD_COLUMN col INNER JOIN AD_TABLE tab - ON (col.ad_table_id = tab.ad_table_id) - WHERE col.ad_table_id = table_id - AND col.istranslated = 'Y' - AND col.isactive = 'Y' - ORDER BY 1) - LOOP - ins := TRIM (ins) || ',' || TRIM (c.columnname); - sel := TRIM (sel) || ',t.' || TRIM (c.columnname); - END LOOP; - - ins := TRIM (ins) || ')'; - sel := - TRIM (sel) - || ' from ' - || t.tablename - || ' t, ad_language l WHERE l.issystemlanguage=''Y'' AND NOT EXISTS (SELECT 1 FROM ' - || t.tablename - || '_TRL b WHERE b.' - || t.tablename - || '_id=t.' - || t.tablename - || '_id AND b.AD_LANGUAGE=l.AD_LANGUAGE)'; - inssel := TRIM (ins) || ' ' || TRIM (sel); - - DBMS_OUTPUT.PUT_LINE (inssel); - EXECUTE IMMEDIATE inssel; - END LOOP; - - DBMS_OUTPUT.PUT_LINE ('End'); - COMMIT; -END; -/ - diff --git a/org.adempiere.server-feature/utils.unix/oracle/PostMigration.sh b/org.adempiere.server-feature/utils.unix/oracle/PostMigration.sh index ae75c34e28..81b5080cf2 100644 --- a/org.adempiere.server-feature/utils.unix/oracle/PostMigration.sh +++ b/org.adempiere.server-feature/utils.unix/oracle/PostMigration.sh @@ -20,4 +20,4 @@ fi echo ------------------------------------- echo Add missing translations echo ------------------------------------- -echo sqlplus $2/$3@$ADEMPIERE_DB_SERVER:$ADEMPIERE_DB_PORT/$ADEMPIERE_DB_NAME @$IDEMPIERE_HOME/utils/$ADEMPIERE_DB_PATH/01_add_missing_Translations.sql +echo sqlplus $2/$3@$ADEMPIERE_DB_SERVER:$ADEMPIERE_DB_PORT/$ADEMPIERE_DB_NAME @$IDEMPIERE_HOME/migration/processes_post_migration/$ADEMPIERE_DB_PATH/01_add_missing_Translations.sql diff --git a/org.adempiere.server-feature/utils.unix/oracle/SyncDB.sh b/org.adempiere.server-feature/utils.unix/oracle/SyncDB.sh new file mode 100644 index 0000000000..0d82781493 --- /dev/null +++ b/org.adempiere.server-feature/utils.unix/oracle/SyncDB.sh @@ -0,0 +1,100 @@ +#!/bin/sh +# +# Author: Carlos Ruiz - globalqss +# Script to synchronize the database for with latest migration scripts + +echo Synchronize iDempiere Database + +echo Upgrading database $1@$ADEMPIERE_DB_NAME + +if [ $# -eq 0 ] + then + echo "Usage: $0 " + echo "Example: $0 adempiere adempiere" + exit 1 +fi +if [ "$IDEMPIERE_HOME" = "" -o "$ADEMPIERE_DB_NAME" = "" -o "$ADEMPIERE_DB_SERVER" = "" -o "$ADEMPIERE_DB_PORT" = "" ] + then + echo "Please make sure that the environment variables are set correctly:" + echo " IDEMPIERE_HOME e.g. /idempiere" + echo " ADEMPIERE_DB_NAME e.g. adempiere or xe" + echo " ADEMPIERE_DB_SERVER e.g. dbserver.adempiere.org" + echo " ADEMPIERE_DB_PORT e.g. 5432 or 1521" + exit 1 +fi + +TMPFOLDER=/tmp +ADEMPIERE_DB_USER=$1 +ADEMPIERE_DB_PASSWORD=$2 +ADEMPIERE_DB_PATH=$3 +CMD="sqlplus $ADEMPIERE_DB_USER/$ADEMPIERE_DB_PASSWORD@$ADEMPIERE_DB_SERVER:$ADEMPIERE_DB_PORT/$ADEMPIERE_DB_NAME" +SILENTCMD="$CMD -S" +ERROR_STRINGS="^(ORA-[0-9]+:|TNS-|PLS-)" + +cd $IDEMPIERE_HOME/migration + +# Create list of files already applied - registered in AD_MigrationScript table +echo "set heading off +set feedback off +set pagesize 0 +set term off +set echo off +select name from ad_migrationscript;" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sort > $TMPFOLDER/lisDB_$$.txt + +# Create list of files in the migration folder +> $TMPFOLDER/lisFS_$$.txt +find -type d -name $ADEMPIERE_DB_PATH | grep -v "./processes_post_migration/$ADEMPIERE_DB_PATH" | while read FOLDER +do + cd "${FOLDER}" + ls *.sql >> $TMPFOLDER/lisFS_$$.txt + cd $IDEMPIERE_HOME/migration +done +sort -o $TMPFOLDER/lisFS_$$.txt $TMPFOLDER/lisFS_$$.txt +sort -o $TMPFOLDER/lisDB_$$.txt $TMPFOLDER/lisDB_$$.txt +MSGERROR="" +APPLIED=N +# extract and process the list of pending files +comm -13 $TMPFOLDER/lisDB_$$.txt $TMPFOLDER/lisFS_$$.txt > $TMPFOLDER/lisPENDING_$$.txt +if [ -s $TMPFOLDER/lisPENDING_$$.txt ] +then + mkdir $TMPFOLDER/SyncDB_out_$$ + for FILE in `cat $TMPFOLDER/lisPENDING_$$.txt` + do + SCRIPT=`find -name "$FILE" | grep "/$ADEMPIERE_DB_PATH/"` + OUTFILE=$TMPFOLDER/SyncDB_out_$$/`basename "$FILE" .sql`.out + echo "Applying $SCRIPT" + cat "$SCRIPT" | $CMD 2>&1 | tee "$OUTFILE" + APPLIED=Y + if egrep "$ERROR_STRINGS" "$OUTFILE" > /dev/null 2>&1 + then + MSGERROR="$MSGERROR\n**** ERROR ON FILE $OUTFILE - Please verify ****" + # Stop processing to allow user to fix the problem before processing additional files + break + fi + done +else + if [ -s $TMPFOLDER/lisFS_$$.txt ] + then + echo "Database is already in sync - no scripts pending to apply" + else + echo "No scripts were found to apply" + fi +fi +if [ x$APPLIED = xY ] +then + cd $IDEMPIERE_HOME/migration + for FILE in processes_post_migration/$ADEMPIERE_DB_PATH/*.sql + do + OUTFILE=$TMPFOLDER/SyncDB_out_$$/`basename "$FILE" .sql`.out + cat "$FILE" | $CMD 2>&1 | tee "$OUTFILE" + if egrep "$ERROR_STRINGS" "$OUTFILE" > /dev/null 2>&1 + then + MSGERROR="$MSGERROR\n**** ERROR ON FILE $OUTFILE - Please verify ****" + fi + done +fi +if [ -n "$MSGERROR" ] +then + echo "$MSGERROR" + echo "\n Errors were found during the process (see message above) - please review and fix the error running manually the script - and then restart this process again" +fi diff --git a/org.adempiere.server-feature/utils.unix/postgresql/01_add_missing_translations.sql b/org.adempiere.server-feature/utils.unix/postgresql/01_add_missing_translations.sql deleted file mode 100644 index 4c40cbdeec..0000000000 --- a/org.adempiere.server-feature/utils.unix/postgresql/01_add_missing_translations.sql +++ /dev/null @@ -1,69 +0,0 @@ -CREATE OR REPLACE FUNCTION add_missing_translations() RETURNS void as $func$ -DECLARE - ins VARCHAR (2000); - sel VARCHAR (2000); - inssel VARCHAR (4001); - table_id NUMERIC; - t RECORD; - c RECORD; -BEGIN - - FOR t IN (SELECT ad_table_id, - SUBSTR (tablename, 1, LENGTH (tablename) - 4) as tablename - FROM AD_TABLE - WHERE tablename LIKE '%_Trl' AND isactive = 'Y' - AND isview = 'N') - LOOP - ins := - 'INSERT INTO ' - || t.tablename - || '_TRL (' - || 'ad_language,ad_client_id,ad_org_id,created,createdby,updated,updatedby,isactive,istranslated,' - || t.tablename - || '_id'; - sel := - 'SELECT l.ad_language,t.ad_client_id,t.ad_org_id,t.created,t.createdby,t.updated,t.updatedby,t.isactive,''N'' as istranslated,' - || t.tablename - || '_id'; - - SELECT ad_table_id - INTO table_id - FROM AD_TABLE - WHERE tablename = t.tablename; - - FOR c IN (SELECT col.columnname - FROM AD_COLUMN col INNER JOIN AD_TABLE tab - ON (col.ad_table_id = tab.ad_table_id) - WHERE col.ad_table_id = table_id - AND col.istranslated = 'Y' - AND col.isactive = 'Y' - ORDER BY 1) - LOOP - ins := TRIM (ins) || ',' || TRIM (c.columnname); - sel := TRIM (sel) || ',t.' || TRIM (c.columnname); - END LOOP; - - ins := TRIM (ins) || ')'; - sel := - TRIM (sel) - || ' from ' - || t.tablename - || ' t, ad_language l WHERE l.issystemlanguage=''Y'' AND NOT EXISTS (SELECT 1 FROM ' - || t.tablename - || '_TRL b WHERE b.' - || t.tablename - || '_id=t.' - || t.tablename - || '_id AND b.AD_LANGUAGE=l.AD_LANGUAGE)'; - inssel := TRIM (ins) || ' ' || TRIM (sel); - - EXECUTE inssel; - END LOOP; - -END; -$func$ LANGUAGE plpgsql; - -select add_missing_translations(); - -commit; - diff --git a/org.adempiere.server-feature/utils.unix/postgresql/PostMigration.sh b/org.adempiere.server-feature/utils.unix/postgresql/PostMigration.sh index 89d5cd294f..0cd4e52612 100644 --- a/org.adempiere.server-feature/utils.unix/postgresql/PostMigration.sh +++ b/org.adempiere.server-feature/utils.unix/postgresql/PostMigration.sh @@ -24,6 +24,6 @@ export PGPASSWORD echo ------------------------------------- echo Add missing translations echo ------------------------------------- -psql -h $ADEMPIERE_DB_SERVER -p $ADEMPIERE_DB_PORT -d $ADEMPIERE_DB_NAME -U $2 -f $IDEMPIERE_HOME/utils/$ADEMPIERE_DB_PATH/01_add_missing_translations.sql +psql -h $ADEMPIERE_DB_SERVER -p $ADEMPIERE_DB_PORT -d $ADEMPIERE_DB_NAME -U $2 -f $IDEMPIERE_HOME/migration/processes_post_migration/$ADEMPIERE_DB_PATH/01_add_missing_translations.sql PGPASSWORD= export PGPASSWORD diff --git a/org.adempiere.server-feature/utils.unix/postgresql/SyncDB.sh b/org.adempiere.server-feature/utils.unix/postgresql/SyncDB.sh new file mode 100644 index 0000000000..c766b7bb78 --- /dev/null +++ b/org.adempiere.server-feature/utils.unix/postgresql/SyncDB.sh @@ -0,0 +1,100 @@ +#!/bin/sh +# +# Author: Carlos Ruiz - globalqss +# Script to synchronize the database for with latest migration scripts + +echo Synchronize iDempiere Database + +echo Upgrading database $1@$ADEMPIERE_DB_NAME + +if [ $# -eq 0 ] + then + echo "Usage: $0 " + echo "Example: $0 adempiere adempiere" + exit 1 +fi +if [ "$IDEMPIERE_HOME" = "" -o "$ADEMPIERE_DB_NAME" = "" -o "$ADEMPIERE_DB_SERVER" = "" -o "$ADEMPIERE_DB_PORT" = "" ] + then + echo "Please make sure that the environment variables are set correctly:" + echo " IDEMPIERE_HOME e.g. /idempiere" + echo " ADEMPIERE_DB_NAME e.g. adempiere or xe" + echo " ADEMPIERE_DB_SERVER e.g. dbserver.adempiere.org" + echo " ADEMPIERE_DB_PORT e.g. 5432 or 1521" + exit 1 +fi + +PGPASSWORD=$2 +export PGPASSWORD + +TMPFOLDER=/tmp +ADEMPIERE_DB_USER=$1 +ADEMPIERE_DB_PATH=$3 +CMD="psql -h $ADEMPIERE_DB_SERVER -p $ADEMPIERE_DB_PORT -d $ADEMPIERE_DB_NAME -U $ADEMPIERE_DB_USER" +SILENTCMD="$CMD -q -t" +ERROR_STRINGS="^(ERROR:|FEHLER:|FATAL:|ERRO:)" + +cd $IDEMPIERE_HOME/migration + +# Create list of files already applied - registered in AD_MigrationScript table +echo "select name from ad_migrationscript" | $SILENTCMD | sed -e 's:^ ::' | grep -v '^$' | sort > $TMPFOLDER/lisDB_$$.txt + +# Create list of files in the migration folder +> $TMPFOLDER/lisFS_$$.txt +find -type d -name $ADEMPIERE_DB_PATH | grep -v "./processes_post_migration/$ADEMPIERE_DB_PATH" | while read FOLDER +do + cd "${FOLDER}" + ls *.sql >> $TMPFOLDER/lisFS_$$.txt + cd $IDEMPIERE_HOME/migration +done +sort -o $TMPFOLDER/lisFS_$$.txt $TMPFOLDER/lisFS_$$.txt +sort -o $TMPFOLDER/lisDB_$$.txt $TMPFOLDER/lisDB_$$.txt +MSGERROR="" +APPLIED=N +# extract and process the list of pending files +comm -13 $TMPFOLDER/lisDB_$$.txt $TMPFOLDER/lisFS_$$.txt > $TMPFOLDER/lisPENDING_$$.txt +if [ -s $TMPFOLDER/lisPENDING_$$.txt ] +then + mkdir $TMPFOLDER/SyncDB_out_$$ + for FILE in `cat $TMPFOLDER/lisPENDING_$$.txt` + do + SCRIPT=`find -name "$FILE" | grep "/$ADEMPIERE_DB_PATH/"` + OUTFILE=$TMPFOLDER/SyncDB_out_$$/`basename "$FILE" .sql`.out + echo "Applying $SCRIPT" + cat "$SCRIPT" | $CMD 2>&1 | tee "$OUTFILE" + APPLIED=Y + if egrep "$ERROR_STRINGS" "$OUTFILE" > /dev/null 2>&1 + then + MSGERROR="$MSGERROR\n**** ERROR ON FILE $OUTFILE - Please verify ****" + # Stop processing to allow user to fix the problem before processing additional files + break + fi + done +else + if [ -s $TMPFOLDER/lisFS_$$.txt ] + then + echo "Database is already in sync - no scripts pending to apply" + else + echo "No scripts were found to apply" + fi +fi +if [ x$APPLIED = xY ] +then + cd $IDEMPIERE_HOME/migration + for FILE in processes_post_migration/$ADEMPIERE_DB_PATH/*.sql + do + OUTFILE=$TMPFOLDER/SyncDB_out_$$/`basename "$FILE" .sql`.out + cat "$FILE" | $CMD 2>&1 | tee "$OUTFILE" + if egrep "$ERROR_STRINGS" "$OUTFILE" > /dev/null 2>&1 + then + MSGERROR="$MSGERROR\n**** ERROR ON FILE $OUTFILE - Please verify ****" + fi + done +fi +if [ -n "$MSGERROR" ] +then + echo "$MSGERROR" + echo "\n Errors were found during the process (see message above) - please review and fix the error running manually the script - and then restart this process again" +fi + +PGPASSWORD= +export PGPASSWORD diff --git a/org.adempiere.server-feature/utils.windows/RUN_SyncDB.bat b/org.adempiere.server-feature/utils.windows/RUN_SyncDB.bat new file mode 100644 index 0000000000..6c4d7680eb --- /dev/null +++ b/org.adempiere.server-feature/utils.windows/RUN_SyncDB.bat @@ -0,0 +1,4 @@ +@if (%IDEMPIERE_HOME%) == () (CALL myEnvironment.bat Server) else (CALL %IDEMPIERE_HOME%\utils\myEnvironment.bat Server) +@Title Synchronize iDempiere Database - %IDEMPIERE_HOME% (%ADEMPIERE_DB_NAME%) + +@call %ADEMPIERE_DB_PATH%\SyncDB %ADEMPIERE_DB_USER% %ADEMPIERE_DB_PASSWORD% %ADEMPIERE_DB_PATH% diff --git a/org.adempiere.server-feature/utils.windows/oracle/01_add_missing_Translations.sql b/org.adempiere.server-feature/utils.windows/oracle/01_add_missing_Translations.sql deleted file mode 100644 index b3ba3d6223..0000000000 --- a/org.adempiere.server-feature/utils.windows/oracle/01_add_missing_Translations.sql +++ /dev/null @@ -1,69 +0,0 @@ -DECLARE - ins VARCHAR2 (2000); - sel VARCHAR2 (2000); - inssel VARCHAR2 (4001); - table_id NUMBER; -BEGIN - ins := RPAD (' ', 2000, ' '); - sel := RPAD (' ', 2000, ' '); - inssel := RPAD (' ', 4001, ' '); - DBMS_OUTPUT.PUT_LINE ('Start'); - - FOR t IN (SELECT ad_table_id, - SUBSTR (tablename, 1, LENGTH (tablename) - 4) tablename - FROM AD_TABLE - WHERE tablename LIKE '%_Trl' AND isactive = 'Y' - AND isview = 'N') - LOOP - ins := - 'INSERT INTO ' - || t.tablename - || '_TRL (' - || 'ad_language,ad_client_id,ad_org_id,created,createdby,updated,updatedby,isactive,istranslated,' - || t.tablename - || '_id'; - sel := - 'SELECT l.ad_language,t.ad_client_id,t.ad_org_id,t.created,t.createdby,t.updated,t.updatedby,t.isactive,''N'' as istranslated,' - || t.tablename - || '_id'; - - SELECT ad_table_id - INTO table_id - FROM AD_TABLE - WHERE tablename = t.tablename; - - FOR c IN (SELECT col.columnname - FROM AD_COLUMN col INNER JOIN AD_TABLE tab - ON (col.ad_table_id = tab.ad_table_id) - WHERE col.ad_table_id = table_id - AND col.istranslated = 'Y' - AND col.isactive = 'Y' - ORDER BY 1) - LOOP - ins := TRIM (ins) || ',' || TRIM (c.columnname); - sel := TRIM (sel) || ',t.' || TRIM (c.columnname); - END LOOP; - - ins := TRIM (ins) || ')'; - sel := - TRIM (sel) - || ' from ' - || t.tablename - || ' t, ad_language l WHERE l.issystemlanguage=''Y'' AND NOT EXISTS (SELECT 1 FROM ' - || t.tablename - || '_TRL b WHERE b.' - || t.tablename - || '_id=t.' - || t.tablename - || '_id AND b.AD_LANGUAGE=l.AD_LANGUAGE)'; - inssel := TRIM (ins) || ' ' || TRIM (sel); - - DBMS_OUTPUT.PUT_LINE (inssel); - EXECUTE IMMEDIATE inssel; - END LOOP; - - DBMS_OUTPUT.PUT_LINE ('End'); - COMMIT; -END; -/ - diff --git a/org.adempiere.server-feature/utils.windows/oracle/SyncDB.bat b/org.adempiere.server-feature/utils.windows/oracle/SyncDB.bat new file mode 100644 index 0000000000..5754205cc1 --- /dev/null +++ b/org.adempiere.server-feature/utils.windows/oracle/SyncDB.bat @@ -0,0 +1,28 @@ +@Echo Synchronize iDempiere Database + +@Rem +@Echo Upgrading database %1@%ADEMPIERE_DB_NAME% + +@if (%IDEMPIERE_HOME%) == () goto environment +@if (%ADEMPIERE_DB_NAME%) == () goto environment +@if (%ADEMPIERE_DB_SERVER%) == () goto environment +@if (%ADEMPIERE_DB_PORT%) == () goto environment +@Rem Must have parameter: userAccount +@if (%1) == () goto usage + +@Echo WARNING: THIS PROGRAM IS NOT DEVELOPED FOR WINDOWS YET - YOU NEED TO APPLY MANUALLY THE PENDING MIGRATION SCRIPTS + +@Rem TODO: port oracle/SyncDB.sh to windows syntax + +@goto end + +:environment +@Echo Please make sure that the enviroment variables are set correctly: +@Echo IDEMPIERE_HOME e.g. D:\Adempiere +@Echo ADEMPIERE_DB_NAME e.g. adempiere.adempiere.org + +:usage +@echo Usage: %0 +@echo Examples: %0 adempiere adempiere + +:end diff --git a/org.adempiere.server-feature/utils.windows/postgresql/01_add_missing_translations.sql b/org.adempiere.server-feature/utils.windows/postgresql/01_add_missing_translations.sql deleted file mode 100644 index 4c40cbdeec..0000000000 --- a/org.adempiere.server-feature/utils.windows/postgresql/01_add_missing_translations.sql +++ /dev/null @@ -1,69 +0,0 @@ -CREATE OR REPLACE FUNCTION add_missing_translations() RETURNS void as $func$ -DECLARE - ins VARCHAR (2000); - sel VARCHAR (2000); - inssel VARCHAR (4001); - table_id NUMERIC; - t RECORD; - c RECORD; -BEGIN - - FOR t IN (SELECT ad_table_id, - SUBSTR (tablename, 1, LENGTH (tablename) - 4) as tablename - FROM AD_TABLE - WHERE tablename LIKE '%_Trl' AND isactive = 'Y' - AND isview = 'N') - LOOP - ins := - 'INSERT INTO ' - || t.tablename - || '_TRL (' - || 'ad_language,ad_client_id,ad_org_id,created,createdby,updated,updatedby,isactive,istranslated,' - || t.tablename - || '_id'; - sel := - 'SELECT l.ad_language,t.ad_client_id,t.ad_org_id,t.created,t.createdby,t.updated,t.updatedby,t.isactive,''N'' as istranslated,' - || t.tablename - || '_id'; - - SELECT ad_table_id - INTO table_id - FROM AD_TABLE - WHERE tablename = t.tablename; - - FOR c IN (SELECT col.columnname - FROM AD_COLUMN col INNER JOIN AD_TABLE tab - ON (col.ad_table_id = tab.ad_table_id) - WHERE col.ad_table_id = table_id - AND col.istranslated = 'Y' - AND col.isactive = 'Y' - ORDER BY 1) - LOOP - ins := TRIM (ins) || ',' || TRIM (c.columnname); - sel := TRIM (sel) || ',t.' || TRIM (c.columnname); - END LOOP; - - ins := TRIM (ins) || ')'; - sel := - TRIM (sel) - || ' from ' - || t.tablename - || ' t, ad_language l WHERE l.issystemlanguage=''Y'' AND NOT EXISTS (SELECT 1 FROM ' - || t.tablename - || '_TRL b WHERE b.' - || t.tablename - || '_id=t.' - || t.tablename - || '_id AND b.AD_LANGUAGE=l.AD_LANGUAGE)'; - inssel := TRIM (ins) || ' ' || TRIM (sel); - - EXECUTE inssel; - END LOOP; - -END; -$func$ LANGUAGE plpgsql; - -select add_missing_translations(); - -commit; - diff --git a/org.adempiere.server-feature/utils.windows/postgresql/SyncDB.bat b/org.adempiere.server-feature/utils.windows/postgresql/SyncDB.bat new file mode 100644 index 0000000000..71569cf88c --- /dev/null +++ b/org.adempiere.server-feature/utils.windows/postgresql/SyncDB.bat @@ -0,0 +1,29 @@ +@Echo Synchronize iDempiere Database + +@Echo Upgrading database %1@%ADEMPIERE_DB_NAME% + +@if (%IDEMPIERE_HOME%) == () goto environment +@if (%ADEMPIERE_DB_NAME%) == () goto environment +@if (%ADEMPIERE_DB_SERVER%) == () goto environment +@if (%ADEMPIERE_DB_PORT%) == () goto environment +@Rem Must have parameter: userAccount +@if (%1) == () goto usage + +@Echo WARNING: THIS PROGRAM IS NOT DEVELOPED FOR WINDOWS YET - YOU NEED TO APPLY MANUALLY THE PENDING MIGRATION SCRIPTS + +@Rem TODO: port postgresql/SyncDB.sh to windows syntax + +@goto end + +:environment +@Echo Please make sure that the enviroment variables are set correctly: +@Echo IDEMPIERE_HOME e.g. D:\ADEMPIERE2 +@Echo ADEMPIERE_DB_NAME e.g. adempiere or xe +@Echo ADEMPIERE_DB_SERVER e.g. dbserver.adempiere.org +@Echo ADEMPIERE_DB_PORT e.g. 5432 or 1521 + +:usage +@echo Usage: %0 +@echo Examples: %0 ADEMPIERE/ADEMPIERE + +:end