Hi Ashesh,
My test scenario is;
"java -jar xxxx" command.
xxx is not a file. I want to see a error message in pgadmin and
pga_jobsteplog table. I am waiting to "Error: Unable to access jarfile
xxxx" message in job log output.
I make test the patch in windows 7 and ubuntu 14.10. In windows 7 not
problem, perfect working. But nix system (Ubuntu 14.10) debug mode, I just
saw the massage in terminal. Then I added to message error file to output
variable.
Now It's working perfect windows and nix systems. I attach the new patch in
this message.
2015-03-23 1:15 GMT+02:00 Mehmet Emin KARAKAŞ <[email protected]>:
> Hi Ashesh ,
> Sorry for late. I have test in today and share the results
>
> 2015-03-16 10:32 GMT+02:00 Ashesh Vashi <[email protected]>:
>
>> On Mon, Mar 16, 2015 at 1:31 PM, Mehmet Emin KARAKAŞ <[email protected]>
>> wrote:
>>
>>> Hi,
>>>
>>> I have not tried the patch because last week was very run down. But I
>>> will try the patch in this week and I will share the result.
>>>
>> Thanks.
>> I really appreciate.
>>
>> [NOTE: Please keep the list in loop...]
>>
>>
>> --
>>
>> Thanks & Regards,
>>
>> Ashesh Vashi
>> EnterpriseDB INDIA: Enterprise PostgreSQL Company
>> <http://www.enterprisedb.com>
>>
>>
>> *http://www.linkedin.com/in/asheshvashi*
>> <http://www.linkedin.com/in/asheshvashi>
>>
>>>
>>> 2015-03-16 6:16 GMT+02:00 Ashesh Vashi <[email protected]>:
>>>
>>>> HI Mehmet,
>>>>
>>>> Do you have time to spend time for this?
>>>> Can you please review, and test the patch sent by Akshay?
>>>>
>>>> --
>>>>
>>>> Thanks & Regards,
>>>>
>>>> Ashesh Vashi
>>>> EnterpriseDB INDIA: Enterprise PostgreSQL Company
>>>> <http://www.enterprisedb.com>
>>>>
>>>>
>>>> *http://www.linkedin.com/in/asheshvashi*
>>>> <http://www.linkedin.com/in/asheshvashi>
>>>>
>>>> On Thu, Mar 5, 2015 at 3:07 PM, Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Mehmet
>>>>>
>>>>> I have added the logic in job.cpp file to read the error message, If
>>>>> batch job is failed. Attached is the patch file and job.cpp with the
>>>>> email.
>>>>> I haven't tested it because facing some difficulty in linking the
>>>>> project on Windows. Can you please apply the patch and test it at your
>>>>> end,
>>>>> also if you seen some modification please feel free to do it.
>>>>>
>>>>> On Wed, Mar 4, 2015 at 4:22 PM, Akshay Joshi <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Sure.
>>>>>>
>>>>>> On Wed, Mar 4, 2015 at 4:20 PM, Dave Page <[email protected]> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Wed, Mar 4, 2015 at 10:48 AM, Akshay Joshi <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Dave,
>>>>>>>>
>>>>>>>> On Wed, Mar 4, 2015 at 4:11 PM, Dave Page <[email protected]>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> Mehmet may not be able to work on Windows, so one of us may have
>>>>>>>>> to deal with that. Did we not solve this already in PEM btw?
>>>>>>>>>
>>>>>>>>
>>>>>>>> Yes we have solved it in PEM, I have send the source code in my
>>>>>>>> previous email.
>>>>>>>>
>>>>>>>
>>>>>>> Oh, that was it? Well that code is pretty well tried and tested, so
>>>>>>> maybe we should just use that. Perhaps you can send Mehmet a patch to
>>>>>>> test
>>>>>>> on his build?
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>>> On Wed, Mar 4, 2015 at 10:16 AM, Akshay Joshi <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> Hi Mehmet
>>>>>>>>>>
>>>>>>>>>> I have reviewed the patch, but it is only for nix machine. Can
>>>>>>>>>> you please provide a patch where it should be fixed for Windows as
>>>>>>>>>> well. I
>>>>>>>>>> have implemented the same in one of my project using below logic
>>>>>>>>>> which
>>>>>>>>>> works for both windows and nix. You can tried out the below logic
>>>>>>>>>>
>>>>>>>>>> errFile = 'xyz.txt';
>>>>>>>>>> FILE *fpError = freopen(errFile.mb_str(), "w", stderr); ....
>>>>>>>>>> .... // If output is empty then either job did not return any output
>>>>>>>>>> // or
>>>>>>>>>> job threw some error into stderr. if (output == wxEmptyString) {
>>>>>>>>>> // Check script threw some error into stderr if (fpError) {
>>>>>>>>>> fclose(fpError); fpError = fopen(errFile.mb_str(), "r"); if (
>>>>>>>>>> fpError) { char buffer [4098]; wxString errorMsg = wxEmptyString;
>>>>>>>>>> while (!feof(fpError)) { if (fgets(buffer, 4096, fpError) !=
>>>>>>>>>> NULL) errorMsg += wxString(buffer, wxConvLibc); } fclose(fpError);
>>>>>>>>>> } } }
>>>>>>>>>>
>>>>>>>>>> On Wed, Mar 4, 2015 at 10:41 AM, Ashesh Vashi <
>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>
>>>>>>>>>>> Sure
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>>
>>>>>>>>>>> Thanks & Regards,
>>>>>>>>>>>
>>>>>>>>>>> Ashesh Vashi
>>>>>>>>>>> EnterpriseDB INDIA: Enterprise PostgreSQL Company
>>>>>>>>>>> <http://www.enterprisedb.com>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> *http://www.linkedin.com/in/asheshvashi*
>>>>>>>>>>> <http://www.linkedin.com/in/asheshvashi>
>>>>>>>>>>>
>>>>>>>>>>> On Tue, Mar 3, 2015 at 2:01 PM, Dave Page <[email protected]>
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Ashesh; can you please get this reviewed and applied if it
>>>>>>>>>>>> looks OK?
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks.
>>>>>>>>>>>>
>>>>>>>>>>>> On Tue, Mar 3, 2015 at 12:00 PM, Mehmet Emin KARAKAŞ <
>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>> > Hi,
>>>>>>>>>>>> > If batch cron is failed, pgagent doesn't receive error
>>>>>>>>>>>> messages. We fix it.
>>>>>>>>>>>> > We canalized the stderr to stdout. This patch batch cron
>>>>>>>>>>>> receive error
>>>>>>>>>>>> > massages from nix machine. Git Diff Message and job.cpp file
>>>>>>>>>>>> is attached.
>>>>>>>>>>>> >
>>>>>>>>>>>> > Thanks.
>>>>>>>>>>>> >
>>>>>>>>>>>> > --
>>>>>>>>>>>> > MEHMET EMİN KARAKAŞ
>>>>>>>>>>>> > Postgresql Global Username: emin100
>>>>>>>>>>>> >
>>>>>>>>>>>> >
>>>>>>>>>>>> >
>>>>>>>>>>>> > diff --git a/job.cpp b/job.cpp
>>>>>>>>>>>> > index 00334ab..694be22 100644
>>>>>>>>>>>> > --- a/job.cpp
>>>>>>>>>>>> > +++ b/job.cpp
>>>>>>>>>>>> > @@ -273,8 +273,11 @@ int Job::Execute()
>>>>>>>>>>>> > // The *nix way.
>>>>>>>>>>>> > FILE *fp_script;
>>>>>>>>>>>> > char buf[4098];
>>>>>>>>>>>> > +
>>>>>>>>>>>> > + wxString wxSt = wxT("");
>>>>>>>>>>>> > + wxSt.Printf( _("%s 2>&1"), filename.c_str());
>>>>>>>>>>>> >
>>>>>>>>>>>> > - fp_script =
>>>>>>>>>>>> > popen(filename.mb_str(wxConvUTF8), "r");
>>>>>>>>>>>> > + fp_script =
>>>>>>>>>>>> popen(wxSt.mb_str(wxConvUTF8) ,
>>>>>>>>>>>> > "r");
>>>>>>>>>>>> > if (!fp_script)
>>>>>>>>>>>> > {
>>>>>>>>>>>> >
>>>>>>>>>>>> output.Printf(_("Couldn't execute
>>>>>>>>>>>> > script: %s, errno = %d"), filename.c_str(), errno);
>>>>>>>>>>>> >
>>>>>>>>>>>> >
>>>>>>>>>>>> >
>>>>>>>>>>>> >
>>>>>>>>>>>> >
>>>>>>>>>>>> >
>>>>>>>>>>>> >
>>>>>>>>>>>> > --
>>>>>>>>>>>> > Sent via pgadmin-hackers mailing list (
>>>>>>>>>>>> [email protected])
>>>>>>>>>>>> > To make changes to your subscription:
>>>>>>>>>>>> > http://www.postgresql.org/mailpref/pgadmin-hackers
>>>>>>>>>>>> >
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> Dave Page
>>>>>>>>>>>> Blog: http://pgsnake.blogspot.com
>>>>>>>>>>>> Twitter: @pgsnake
>>>>>>>>>>>>
>>>>>>>>>>>> EnterpriseDB UK: http://www.enterprisedb.com
>>>>>>>>>>>> The Enterprise PostgreSQL Company
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> Sent via pgadmin-hackers mailing list (
>>>>>>>>>>>> [email protected])
>>>>>>>>>>>> To make changes to your subscription:
>>>>>>>>>>>> http://www.postgresql.org/mailpref/pgadmin-hackers
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> *Akshay Joshi*
>>>>>>>>>> *Principal Software Engineer *
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> *Phone: +91 20-3058-9517 <%2B91%2020-3058-9517>Mobile: +91
>>>>>>>>>> 976-788-8246*
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Dave Page
>>>>>>>>> Blog: http://pgsnake.blogspot.com
>>>>>>>>> Twitter: @pgsnake
>>>>>>>>>
>>>>>>>>> EnterpriseDB UK: http://www.enterprisedb.com
>>>>>>>>> The Enterprise PostgreSQL Company
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> *Akshay Joshi*
>>>>>>>> *Principal Software Engineer *
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> *Phone: +91 20-3058-9517 <%2B91%2020-3058-9517>Mobile: +91
>>>>>>>> 976-788-8246*
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Dave Page
>>>>>>> Blog: http://pgsnake.blogspot.com
>>>>>>> Twitter: @pgsnake
>>>>>>>
>>>>>>> EnterpriseDB UK: http://www.enterprisedb.com
>>>>>>> The Enterprise PostgreSQL Company
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Akshay Joshi*
>>>>>> *Principal Software Engineer *
>>>>>>
>>>>>>
>>>>>>
>>>>>> *Phone: +91 20-3058-9517 <%2B91%2020-3058-9517>Mobile: +91
>>>>>> 976-788-8246*
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Akshay Joshi*
>>>>> *Principal Software Engineer *
>>>>>
>>>>>
>>>>>
>>>>> *Phone: +91 20-3058-9517 <%2B91%2020-3058-9517>Mobile: +91
>>>>> 976-788-8246*
>>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> MEHMET EMİN KARAKAŞ
>>> Yazılım Uzmanı
>>>
>>> TURKSAT Uluslararası Uydu ve Kablo TV Operatörü
>>> Konya Yolu 40. Km. 06839 Golbasi / ANKARA - TÜRKİYE
>>> Tel : +90 312 615 32 73
>>> Faks : +90 312 615 32 77
>>>
>>
>>
>
>
> --
> MEHMET EMİN KARAKAŞ
> Yazılım Uzmanı
>
> TURKSAT Uluslararası Uydu ve Kablo TV Operatörü
> Konya Yolu 40. Km. 06839 Golbasi / ANKARA - TÜRKİYE
> Tel : +90 312 615 32 73
> Faks : +90 312 615 32 77
>
--
MEHMET EMİN KARAKAŞ
Yazılım Uzmanı
TURKSAT Uluslararası Uydu ve Kablo TV Operatörü
Konya Yolu 40. Km. 06839 Golbasi / ANKARA - TÜRKİYE
Tel : +90 312 615 32 73
Faks : +90 312 615 32 77
diff --git a/job.cpp b/job.cpp
index 00334ab..b227fa2 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,44 @@ 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.
+ if (output == wxEmptyString)
+ {
+ // Check script threw some error into stderr
+ if (fpError)
+ {
+ fclose(fpError);
+ fpError = fopen(errorFile.mb_str(), "r");
+ if (fpError)
+ {
+ char buffer[4098];
+ wxString errorMsg = wxEmptyString;
+ while (!feof(fpError))
+ {
+ if (fgets(buffer, 4096, fpError) != NULL)
+ errorMsg += wxString(buffer, wxConvLibc);
+ }
+
+ if (errorMsg != wxEmptyString) {
+ LogMessage(wxString::Format(_("Script Error: \n%s\n"), errorMsg.c_str()), LOG_WARNING);
+ output += errorMsg.c_str();
+ }
+
+ fclose(fpError);
+ }
+ wxRemoveFile(errorFile);
+ }
+ }
+ else
+ {
+ if (fpError)
+ {
+ fclose(fpError);
+ wxRemoveFile(errorFile);
+ }
+ }
+
// Delete the file/directory. If we fail, don't overwrite the script output in the log, just throw warnings.
if (!wxRemoveFile(filename))
{
//////////////////////////////////////////////////////////////////////////
//
// pgAgent - PostgreSQL Tools
//
// Copyright (C) 2002 - 2014 The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// job.cpp - pgAgent job
//
//////////////////////////////////////////////////////////////////////////
#include "pgAgent.h"
#include <wx/file.h>
#include <wx/filefn.h>
#include <wx/filename.h>
#include <wx/process.h>
#include <sys/types.h>
#ifndef __WIN32__
#include <errno.h>
#include <sys/wait.h>
#endif
Job::Job(DBconn *conn, const wxString &jid)
{
threadConn = conn;
jobid = jid;
status = wxT("");
LogMessage(wxString::Format(_("Starting job: %s"), jobid.c_str()), LOG_DEBUG);
int rc = threadConn->ExecuteVoid(
wxT("UPDATE pgagent.pga_job SET jobagentid=") + backendPid + wxT(", joblastrun=now() ")
wxT(" WHERE jobagentid IS NULL AND jobid=") + jobid);
if (rc == 1)
{
DBresult *id = threadConn->Execute(
wxT("SELECT nextval('pgagent.pga_joblog_jlgid_seq') AS id"));
if (id)
{
logid = id->GetString(wxT("id"));
DBresult *res = threadConn->Execute(
wxT("INSERT INTO pgagent.pga_joblog(jlgid, jlgjobid, jlgstatus) ")
wxT("VALUES (") + logid + wxT(", ") + jobid + wxT(", 'r')"));
if (res)
{
status = wxT("r");
delete res;
}
delete id;
}
}
}
Job::~Job()
{
if (status != wxT(""))
{
threadConn->ExecuteVoid(
wxT("UPDATE pgagent.pga_joblog ")
wxT(" SET jlgstatus='") + status + wxT("', jlgduration=now() - jlgstart ")
wxT(" WHERE jlgid=") + logid + wxT(";\n")
wxT("UPDATE pgagent.pga_job ")
wxT(" SET jobagentid=NULL, jobnextrun=NULL ")
wxT(" WHERE jobid=") + jobid
);
}
threadConn->Return();
LogMessage(wxString::Format(_("Completed job: %s"), jobid.c_str()), LOG_DEBUG);
}
int Job::Execute()
{
int rc = 0;
bool succeeded = false;
DBresult *steps = threadConn->Execute(
wxT("SELECT * ")
wxT(" FROM pgagent.pga_jobstep ")
wxT(" WHERE jstenabled ")
wxT(" AND jstjobid=") + jobid +
wxT(" ORDER BY jstname, jstid"));
if (!steps)
{
status = wxT("i");
return -1;
}
while (steps->HasData())
{
DBconn *stepConn;
wxString jslid, stepid, jpecode, output;
stepid = steps->GetString(wxT("jstid"));
DBresult *id = threadConn->Execute(
wxT("SELECT nextval('pgagent.pga_jobsteplog_jslid_seq') AS id"));
if (id)
{
jslid = id->GetString(wxT("id"));
DBresult *res = threadConn->Execute(
wxT("INSERT INTO pgagent.pga_jobsteplog(jslid, jsljlgid, jsljstid, jslstatus) ")
wxT("SELECT ") + jslid + wxT(", ") + logid + wxT(", ") + stepid + wxT(", 'r'")
wxT(" FROM pgagent.pga_jobstep WHERE jstid=") + stepid);
if (res)
{
rc = res->RowsAffected();
delete res;
}
else
rc = -1;
}
delete id;
if (rc != 1)
{
status = wxT("i");
return -1;
}
switch ((int) steps->GetString(wxT("jstkind"))[0])
{
case 's':
{
wxString jstdbname = steps->GetString(wxT("jstdbname"));
wxString jstconnstr = steps->GetString(wxT("jstconnstr"));
stepConn = DBconn::Get(jstconnstr, jstdbname);
if (stepConn)
{
LogMessage(wxString::Format(_("Executing SQL step %s (part of job %s)"), stepid.c_str(), jobid.c_str()), LOG_DEBUG);
rc = stepConn->ExecuteVoid(steps->GetString(wxT("jstcode")));
succeeded = stepConn->LastCommandOk();
output = stepConn->GetLastError();
stepConn->Return();
}
else
{
output = _("Couldn't get a connection to the database!");
succeeded = false;
}
break;
}
case 'b':
{
// Batch jobs are more complex thank SQL, for obvious reasons...
LogMessage(wxString::Format(_("Executing batch step %s (part of job %s)"), stepid.c_str(), jobid.c_str()), LOG_DEBUG);
// Get a temporary filename, then reuse it to create an empty directory.
wxString dirname = wxFileName::CreateTempFileName(wxT("pga_"));
if (dirname.Length() == 0)
{
output = _("Couldn't get a temporary filename!");
LogMessage(_("Couldn't get a temporary filename!"), LOG_WARNING);
rc = -1;
break;
}
;
if (!wxRemoveFile(dirname))
{
output.Printf(_("Couldn't remove temporary file: %s"), dirname.c_str());
LogMessage(output, LOG_WARNING);
rc = -1;
break;
}
if (!wxMkdir(dirname, 0700))
{
output.Printf(_("Couldn't create temporary directory: %s"), dirname.c_str());
LogMessage(output, LOG_WARNING);
rc = -1;
break;
}
#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
wxFile *file = new wxFile();
if (!file->Create(filename, true, wxS_IRUSR | wxS_IWUSR | wxS_IXUSR))
{
output.Printf(_("Couldn't create temporary script file: %s"), filename.c_str());
LogMessage(output, LOG_WARNING);
rc = -1;
break;
}
if (!file->Open(filename, wxFile::write))
{
output.Printf(_("Couldn't open temporary script file: %s"), filename.c_str());
LogMessage(output, LOG_WARNING);
wxRemoveFile(filename);
wxRmdir(dirname);
rc = -1;
break;
}
wxString code = steps->GetString(wxT("jstcode"));
// Cleanup the code. If we're on Windows, we need to make all line ends \r\n,
// If we're on Unix, we need \n
code.Replace(wxT("\r\n"), wxT("\n"));
#ifdef __WIN32__
code.Replace(wxT("\n"), wxT("\r\n"));
#endif
if (!file->Write(code))
{
output.Printf(_("Couldn't write to temporary script file: %s"), filename.c_str());
LogMessage(output, LOG_WARNING);
wxRemoveFile(filename);
wxRmdir(dirname);
rc = -1;
break;
}
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
HANDLE h_script, h_process;
DWORD dwRead;
char chBuf[4098];
h_script = win32_popen_r(filename.wc_str(), h_process);
if (!h_script)
{
output.Printf(_("Couldn't execute script: %s, GetLastError() returned %d, errno = %d"), filename.c_str(), GetLastError(), errno);
LogMessage(output, LOG_WARNING);
CloseHandle(h_process);
rc = -1;
break;
}
// Read output from the child process
if (h_script)
{
for (;;)
{
if(!ReadFile(h_script, chBuf, 4096, &dwRead, NULL) || dwRead == 0)
break;
chBuf[dwRead] = 0;
output += wxString::FromAscii(chBuf);
}
}
GetExitCodeProcess(h_process, (LPDWORD)&rc);
CloseHandle(h_process);
CloseHandle(h_script);
#else
// The *nix way.
FILE *fp_script;
char buf[4098];
fp_script = popen(filename.mb_str(wxConvUTF8), "r");
if (!fp_script)
{
output.Printf(_("Couldn't execute script: %s, errno = %d"), filename.c_str(), errno);
LogMessage(output, LOG_WARNING);
rc = -1;
break;
}
while(!feof(fp_script))
{
if (fgets(buf, 4096, fp_script) != NULL)
output += wxString::FromAscii(buf);
}
rc = pclose(fp_script);
if (WIFEXITED(rc))
rc = WEXITSTATUS(rc);
else
rc = -1;
#endif
// set success status for batch runs, be pessimistic by default
LogMessage(wxString::Format(_("Script return code: %d"), rc), LOG_DEBUG);
if (rc == 0)
succeeded = true;
// If output is empty then either script did not return any output
// or script threw some error into stderr.
if (output == wxEmptyString)
{
// Check script threw some error into stderr
if (fpError)
{
fclose(fpError);
fpError = fopen(errorFile.mb_str(), "r");
if (fpError)
{
char buffer[4098];
wxString errorMsg = wxEmptyString;
while (!feof(fpError))
{
if (fgets(buffer, 4096, fpError) != NULL)
errorMsg += wxString(buffer, wxConvLibc);
}
if (errorMsg != wxEmptyString) {
LogMessage(wxString::Format(_("Script Error: \n%s\n"), errorMsg.c_str()), LOG_WARNING);
output += errorMsg.c_str();
}
fclose(fpError);
}
wxRemoveFile(errorFile);
}
}
else
{
if (fpError)
{
fclose(fpError);
wxRemoveFile(errorFile);
}
}
// Delete the file/directory. If we fail, don't overwrite the script output in the log, just throw warnings.
if (!wxRemoveFile(filename))
{
LogMessage(wxString::Format(_("Couldn't remove temporary script file: %s"), filename.c_str()), LOG_WARNING);
wxRmdir(dirname);
break;
}
if (!wxRmdir(dirname))
{
LogMessage(wxString::Format(_("Couldn't remove temporary directory: "), dirname.c_str()), LOG_WARNING);
break;
}
break;
}
default:
{
output = _("Invalid step type!");
status = wxT("i");
return -1;
}
}
wxString stepstatus;
if (succeeded)
stepstatus = wxT("s");
else
stepstatus = steps->GetString(wxT("jstonerror"));
rc = threadConn->ExecuteVoid(
wxT("UPDATE pgagent.pga_jobsteplog ")
wxT(" SET jslduration = now() - jslstart, ")
wxT(" jslresult = ") + NumToStr(rc) + wxT(", jslstatus = '") + stepstatus + wxT("', ")
wxT(" jsloutput = ") + threadConn->qtDbString(output) + wxT(" ")
wxT(" WHERE jslid=") + jslid);
if (rc != 1 || stepstatus == wxT("f"))
{
status = wxT("f");
return -1;
}
steps->MoveNext();
}
delete steps;
status = wxT("s");
return 0;
}
JobThread::JobThread(const wxString &jid)
: wxThread(wxTHREAD_DETACHED)
{
LogMessage(wxString::Format(_("Creating job thread for job %s"), jid.c_str()), LOG_DEBUG);
runnable = false;
jobid = jid;
DBconn *threadConn = DBconn::Get(DBconn::GetBasicConnectString(), serviceDBname);
if (threadConn)
{
job = new Job(threadConn, jobid);
if (job->Runnable())
runnable = true;
}
}
JobThread::~JobThread()
{
LogMessage(wxString::Format(_("Destroying job thread for job %s"), jobid.c_str()), LOG_DEBUG);
}
void *JobThread::Entry()
{
if (runnable)
{
job->Execute();
delete job;
}
return(NULL);
}
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers