summaryrefslogtreecommitdiff
path: root/dev-db/pgagent/files/save-stderr-jobstep-output.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dev-db/pgagent/files/save-stderr-jobstep-output.patch')
-rw-r--r--dev-db/pgagent/files/save-stderr-jobstep-output.patch79
1 files changed, 79 insertions, 0 deletions
diff --git a/dev-db/pgagent/files/save-stderr-jobstep-output.patch b/dev-db/pgagent/files/save-stderr-jobstep-output.patch
new file mode 100644
index 000000000000..245dbe2764ea
--- /dev/null
+++ b/dev-db/pgagent/files/save-stderr-jobstep-output.patch
@@ -0,0 +1,79 @@
+From 5d2e0d3500a8e144215cdfe10b52cf7415b58046 Mon Sep 17 00:00:00 2001
+From: Ashesh Vashi <ashesh.vashi@enterprisedb.com>
+Date: Mon, 25 May 2015 12:37:42 +0530
+Subject: [PATCH] Save the standarad error too along with the standard output
+ in the jobstep output for the batch jobs.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+[Worked on by: Mehmet Emin KARAKAŞ, Akshay Joshi]
+[Reviewed and improvised by: Sanket Joshi, Ashesh Vashi]
+---
+ job.cpp | 37 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 37 insertions(+)
+
+diff --git a/job.cpp b/job.cpp
+index 00334ab..c4b39ce 100644
+--- a/job.cpp
++++ b/job.cpp
+@@ -186,8 +186,10 @@ int Job::Execute()
+
+ #ifdef __WIN32__
+ wxString filename = dirname + wxT("\\") + jobid + wxT("_") + stepid + wxT(".bat");
++ wxString errorFile = dirname + wxT("\\") + jobid + wxT("_") + stepid + wxT("_error.txt");
+ #else
+ wxString filename = dirname + wxT("/") + jobid + wxT("_") + stepid + wxT(".scr");
++ wxString errorFile = dirname + wxT("/") + jobid + wxT("_") + stepid + wxT("_error.txt");
+ #endif
+
+ // Write the script
+@@ -233,6 +235,10 @@ int Job::Execute()
+ file->Close();
+ LogMessage(wxString::Format(_("Executing script file: %s"), filename.c_str()), LOG_DEBUG);
+
++ // freopen function is used to redirect output of stream (stderr in our case)
++ // into the specified file.
++ FILE *fpError = freopen(errorFile.mb_str(), "w", stderr);
++
+ // Execute the file and capture the output
+ #ifdef __WIN32__
+ // The Windows way
+@@ -304,6 +310,37 @@ int Job::Execute()
+ if (rc == 0)
+ succeeded = true;
+
++ // If output is empty then either script did not return any output
++ // or script threw some error into stderr.
++ // Check script threw some error into stderr
++ if (fpError)
++ {
++ //fclose(fpError);
++ FILE* fpErr = fopen(errorFile.mb_str(), "r");
++ if (fpErr)
++ {
++ char buffer[4098];
++ wxString errorMsg = wxEmptyString;
++ while (!feof(fpErr))
++ {
++ if (fgets(buffer, 4096, fpErr) != NULL)
++ errorMsg += wxString(buffer, wxConvLibc);
++ }
++
++ if (errorMsg != wxEmptyString) {
++ wxString errmsg =
++ wxString::Format(
++ _("Script Error: \n%s\n"),
++ errorMsg.c_str());
++ LogMessage(errmsg, LOG_WARNING);
++ output += wxT("\n") + errmsg;
++ }
++
++ fclose(fpErr);
++ }
++ wxRemoveFile(errorFile);
++ }
++
+ // Delete the file/directory. If we fail, don't overwrite the script output in the log, just throw warnings.
+ if (!wxRemoveFile(filename))
+ {