free(ijsp);
} else {
if (edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store)) {
- edg_wll_UpdateError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, "Could not compute job status from events");
- syslog(LOG_ERR, "Could not compute status of job %s events (corrupted DB?)\n",string_jobid);
- fprintf(stderr, "[%d] Could not compute status of job %s events (corrupted DB?)\n", getpid(), string_jobid);
+ char *err;
+
+ /* job has no record in states table ?? */
+ asprintf(&err, "Could not compute status of job %s (corrupted DB?)\n",string_jobid);
+ edg_wll_UpdateError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, err);
+ free(err);
goto rollback;
}
}
else if (!strncmp(requestPTR,KEY_PURGE_REQUEST,sizeof(KEY_PURGE_REQUEST)-1)) {
edg_wll_PurgeRequest request;
+ edg_wll_PurgeResult result;
+ int fatal = 0;
ctx->p_tmp_timeout.tv_sec = 86400;
- if ( !parsePurgeRequest(ctx,messageBody,(int (*)()) edg_wll_StringToStat,&request) )
- edg_wll_PurgeServer(ctx, (const edg_wll_PurgeRequest *)&request);
+ if ( !parsePurgeRequest(ctx,messageBody,(int (*)()) edg_wll_StringToStat,&request) ) {
+ switch ( edg_wll_PurgeServer(ctx, (const edg_wll_PurgeRequest *)&request, &result)) {
+ case 0: if (html) ret = HTTP_NOTIMPL;
+ else ret = HTTP_OK;
+
+ break;
+ case ENOENT: ret = HTTP_NOTFOUND; break;
+ case EPERM: ret = HTTP_UNAUTH; break;
+ case EINVAL: ret = HTTP_INVALID; break;
+ case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
+ default: ret = HTTP_INTERNAL; break;
+ }
+ if (!html && !fatal) {
+ if (edg_wll_PurgeResultToXML(ctx, &result, &message))
+ ret = HTTP_INTERNAL;
+ else
+ printf("%s", message);
+ }
+
+ /* result is now packed in message, free it */
+ if ( result.server_file )
+ free(result.server_file);
+ if ( result.jobs )
+ {
+ for ( i = 0; result.jobs[i]; i++ )
+ free(result.jobs[i]);
+ free(result.jobs);
+ }
+
+ }
if ( request.jobs )
{
free(request.jobs);
}
- /*
- * response allready sent from edg_wll_PurgeServer() - return NULL results
- */
- *response = NULL;
- *headersOut = NULL;
- *bodyOut = NULL;
- return edg_wll_Error(ctx,NULL,NULL);
}
else if (!strncmp(requestPTR,KEY_DUMP_REQUEST,sizeof(KEY_DUMP_REQUEST)-1)) {
edg_wll_DumpRequest request;
}
}
-int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request)
+int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request, edg_wll_PurgeResult *result)
{
int i,parse = 0,dumpfile = -1;
edg_wlc_JobId job;
- char *message = NULL, *response = NULL;
char *tmpfname = NULL;
- int naffected_jobs = 0;
- edg_wll_PurgeResult result;
- int ret = HTTP_OK;
+ int naffected_jobs = 0, ret;
if (!ctx->noAuth) {
}
edg_wll_ResetError(ctx);
- memset(&result, 0, sizeof(edg_wll_PurgeResult));
+ memset(result, 0, sizeof(*result));
if ( (request->flags & EDG_WLL_PURGE_SERVER_DUMP) &&
else {
switch (purge_one(ctx,job,dumpfile,request->flags&EDG_WLL_PURGE_REALLY_PURGE,0)) {
case 0: if (request->flags & EDG_WLL_PURGE_LIST_JOBS) {
- result.jobs = realloc(result.jobs,(naffected_jobs+2) * sizeof(*result.jobs));
- result.jobs[naffected_jobs] = strdup(request->jobs[i]);
- result.jobs[naffected_jobs+1] = NULL;
+ result->jobs = realloc(result->jobs,(naffected_jobs+2) * sizeof(*(result->jobs)));
+ result->jobs[naffected_jobs] = strdup(request->jobs[i]);
+ result->jobs[naffected_jobs+1] = NULL;
}
naffected_jobs++;
break;
/* XXX: change with the streaming interface */
if (request->flags & EDG_WLL_PURGE_LIST_JOBS) {
- result.jobs = realloc(result.jobs,(naffected_jobs+2) * sizeof(*result.jobs));
- result.jobs[naffected_jobs] = job_s;
- result.jobs[naffected_jobs+1] = NULL;
+ result->jobs = realloc(result->jobs,(naffected_jobs+2) * sizeof(*(result->jobs)));
+ result->jobs[naffected_jobs] = job_s;
+ result->jobs[naffected_jobs+1] = NULL;
job_s = NULL;
}
naffected_jobs++;
}
}
- switch ( edg_wll_Error(ctx,NULL,NULL) )
- {
- case 0:
- ret = HTTP_OK;
- break;
- case EINVAL:
- ret = HTTP_INVALID;
- break;
- case EPERM:
- ret = HTTP_UNAUTH;
- break;
- case ENOENT:
- ret = HTTP_NOTFOUND;
- break;
-
- /* fatal errors */
- case ENOMEM:
- /* fall through */
- default:
- ret = HTTP_INTERNAL;
- break;
- }
-
- if (ret != HTTP_INTERNAL) {
+ ret = edg_wll_Error(ctx,NULL,NULL);
+ if (ret == 0 || ret == ENOENT || ret == EPERM || ret == EINVAL) {
if ( request->flags & EDG_WLL_PURGE_SERVER_DUMP && tmpfname )
{
- edg_wll_CreatePurgeFileFromTmp(ctx, tmpfname, &(result.server_file));
+ edg_wll_CreatePurgeFileFromTmp(ctx, tmpfname, &(result->server_file));
unlink(tmpfname);
}
-
- if ( edg_wll_PurgeResultToXML(ctx, &result, &message) )
- ret = HTTP_INTERNAL;
- else
- printf("%s", message);
}
- if ( result.server_file )
- free(result.server_file);
- if ( result.jobs )
- {
- for ( i = 0; result.jobs[i]; i++ )
- free(result.jobs[i]);
- free(result.jobs);
- }
-
- asprintf(&response, "HTTP/1.1 %d %s", ret, edg_wll_HTTPErrorMessage(ret));
-
- edg_wll_http_send(ctx, response, resp_headers, message,ctx->connections->serverConnection);
- if (response) free(response);
- if (message) free(message);
-
return edg_wll_Error(ctx,NULL,NULL);
}