diff --git a/docs/welcome/features.md b/docs/welcome/features.md index b88eff80..3227d0f0 100644 --- a/docs/welcome/features.md +++ b/docs/welcome/features.md @@ -100,4 +100,16 @@ The set of SQL commands to create the object is stored in a file with the given | ALIAS | *FILE | .SQLALIAS | CREATE OR REPLACE ALIAS | | SEQUENCE | *DTAARA | .SQLSEQ | CREATE OR REPLACE SEQUENCE | -Generic SQL statements with file extension .SQL are executed using RUNSQLSTM \ No newline at end of file +Generic SQL statements with file extension .SQL are executed using RUNSQLSTM + +### Incremental SQL pseudo-source + +If you want different source to run if your object is already built, but want to maintain your code in the same file, write that SQL pseudo-source in the incremental block. Only if the object exists in your library list, will the incremental pseudo-source run. Otherwise, source outside of the block will be the one which runs. + +``` +incremental { + ALTER TABLE ADD COLUMN ... +} + +CREATE OR REPLACE TABLE ... +``` \ No newline at end of file diff --git a/src/mk/def_rules.mk b/src/mk/def_rules.mk index ab0195e5..7aaa8f01 100644 --- a/src/mk/def_rules.mk +++ b/src/mk/def_rules.mk @@ -1026,11 +1026,12 @@ define TABLE_TO_FILE_RECIPE = $(FILE_VARIABLES) $(eval d = $($@_d)) @$(call echo_cmd,"=== Creating SQL TABLE from Sql statement [$(notdir $<)] in $(OBJLIB)") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*FILE) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef # @$(TOOLSPATH)/checkObjectAlreadyExists $@ $(OBJLIB) @@ -1039,44 +1040,48 @@ define VIEW_TO_FILE_RECIPE = $(FILE_VARIABLES) $(eval d = $($@_d)) @$(call echo_cmd,"=== Creating SQL VIEW from Sql statement [$(notdir $<)] in $(OBJLIB)") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*FILE) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef define INDEX_TO_FILE_RECIPE = $(FILE_VARIABLES) $(eval d = $($@_d)) @$(call echo_cmd,"=== Creating SQL INDEX from Sql statement [$(notdir $<)] in $(OBJLIB)") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*FILE) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef define SQLUDT_TO_FILE_RECIPE = $(FILE_VARIABLES) $(eval d = $($@_d)) @$(call echo_cmd,"=== Creating SQL UDT from Sql statement [$(notdir $<)] in $(OBJLIB)") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*FILE) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef define SQLALIAS_TO_FILE_RECIPE = $(FILE_VARIABLES) $(eval d = $($@_d)) @$(call echo_cmd,"=== Creating SQL ALIAS from Sql statement [$(notdir $<)] in $(OBJLIB)") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*FILE) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef @@ -1095,11 +1100,12 @@ define SQLSEQ_TO_DTAARA_RECIPE = $(DTAARA_VARIABLES) $(eval d = $($@_d)) @$(call echo_cmd,"=== Creating SQL SEQUENCE from Sql statement [$(notdir $<)] in $(OBJLIB)") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*DTAARA) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef # __ __ _____ _ _ _ _ ____ _ @@ -1259,21 +1265,23 @@ endef define SQLPRC_TO_PGM_RECIPE = $(PGM_VARIABLES) @$(call echo_cmd,"=== Creating SQL PROCEDURE from Sql statement [$(notdir $<)]") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*PGM) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" "$(logFile)" "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef define SQLTRG_TO_PGM_RECIPE = $(PGM_VARIABLES) @$(call echo_cmd,"=== Creating SQL TRIGGER in $(CURLIB)from Sql statement [$(notdir $<)]") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*PGM) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" "$(logFile)" "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef @@ -1421,11 +1429,12 @@ define SQLUDF_TO_SRVPGM_RECIPE = $(SRVPGM_VARIABLES) $(eval d = $($@_d)) @$(call echo_cmd,"=== Creating SQL UDF from Sql statement [$(notdir $<)]") - $(eval crtcmd := RUNSQLSTM srcstmf('$<') $(RUNSQLFLAGS)) + $(eval tempFile := $(shell mktemp)) + $(eval crtcmd := RUNSQLSTM srcstmf('$(tempFile)') $(RUNSQLFLAGS)) $(eval mbrtextcmd := CHGOBJD OBJ($(OBJLIB)/$(basename $(notdir $<))) OBJTYPE(*SRVPGM) TEXT('$(TEXT)')) @$(PRESETUP) \ $(SETCURLIBTOOBJLIB) \ - $(SCRIPTSPATH)/launch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" "$(logFile)" "" "$(mbrtextcmd)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) + $(SCRIPTSPATH)/extractPseudoSQLAndLaunch "$(JOBLOGFILE)" "$(crtcmd)" "$(PRECMD)" "$(POSTCMD)" "$(notdir $@)" "$<" $(logFile) "$(mbrtextcmd)" "$(VPATH)" "$(tempFile)"> $(logFile) 2>&1 && $(call logSuccess,$@) || $(call logFail,$@) endef define BND_TO_SRVPGM_RECIPE = diff --git a/src/scripts/extractAndLaunch b/src/scripts/extractAndLaunch index 3cc48228..f2194de4 100755 --- a/src/scripts/extractAndLaunch +++ b/src/scripts/extractAndLaunch @@ -26,7 +26,6 @@ while read -r line; do linetmp=$(echo "$line" | sed 's/\+\S*$//') cmd="${cmd} ${linetmp}" continue - fi cmd+=$line diff --git a/src/scripts/extractPseudoSQLAndLaunch b/src/scripts/extractPseudoSQLAndLaunch new file mode 100755 index 00000000..2afc3ed4 --- /dev/null +++ b/src/scripts/extractPseudoSQLAndLaunch @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) + +joblog_json=$1 +cmd=$2 +precmd=$3 +postcmd=$4 +object=$5 +source=$6 +output=$7 +text_command=$8 +VPATH=$9 +temp_file=${10} + +objectExists="false" +shouldProcess="true" + +IFS=":" +for dir in $VPATH; +do + if [[ -e "$dir/$object" ]]; then + objectExists="true" + fi +done + +while read -r line; do + if [[ $line == *"{"* ]]; then + if [[ "$objectExists" = "false" ]]; then + shouldProcess="false" + fi + continue + elif [[ $line == *"}"* ]]; then + if [[ "$objectExists" = "false" ]]; then + shouldProcess="true" + continue + else + break + fi + fi + + if [[ "$shouldProcess" = "true" ]]; then + echo $line >> $temp_file + fi +done < <(grep "" $source) + +"$SCRIPT_DIR"/launch "$joblog_json" "$cmd" "$precmd" "$postcmd" "$object" "$source" "$output" "" "$text_command"