#endif
#include "glite/lb/xml_conversions.h"
#include "glite/lb/jobstat.h"
+#include "glite/lb/events_parse.h"
static void dgerr(edg_wll_Context,char *);
static void printstat(edg_wll_JobStat,int);
else if ( !strcmp(tmps, "state_enter_time") ) cond->attr = EDG_WLL_QUERY_ATTR_STATEENTERTIME;
else if ( !strcmp(tmps, "last_update_time") ) cond->attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME;
else if ( !strcmp(tmps, "jdl_attr") ) cond->attr = EDG_WLL_QUERY_ATTR_JDL_ATTR;
+ else if ( !strcmp(tmps, "job_type") ) cond->attr = EDG_WLL_QUERY_ATTR_JOB_TYPE;
/**< When entered current status */
break;
case EDG_WLL_QUERY_ATTR_STATUS:
- if ( !strcasecmp(tmps, "Submitted") ) cond->value.i = EDG_WLL_JOB_SUBMITTED;
- else if ( !strcasecmp(tmps, "Waiting") ) cond->value.i = EDG_WLL_JOB_WAITING;
- else if ( !strcasecmp(tmps, "Ready") ) cond->value.i = EDG_WLL_JOB_READY;
- else if ( !strcasecmp(tmps, "Scheduled") ) cond->value.i = EDG_WLL_JOB_SCHEDULED;
- else if ( !strcasecmp(tmps, "Running") ) cond->value.i = EDG_WLL_JOB_RUNNING;
- else if ( !strcasecmp(tmps, "Done") ) cond->value.i = EDG_WLL_JOB_DONE;
- else if ( !strcasecmp(tmps, "Aborted") ) cond->value.i = EDG_WLL_JOB_ABORTED;
- else if ( !strcasecmp(tmps, "Cancelled") ) cond->value.i = EDG_WLL_JOB_CANCELLED;
- else if ( !strcasecmp(tmps, "Cleared") ) cond->value.i = EDG_WLL_JOB_CLEARED;
- else
- {
+ if ( 0 > (cond->value.i = edg_wll_StringToStat(tmps))) {
fprintf(stderr,"%s: invalid status value (%s)\n", myname, tmps);
return 0;
}
fprintf(stderr,"%s: time condition must be associated with state condition\n", myname);
return NULL;
}
- if ( !strcasecmp(tmps, "Submitted") ) cond->attr_id.state = EDG_WLL_JOB_SUBMITTED;
- else if ( !strcasecmp(tmps, "Waiting") ) cond->attr_id.state = EDG_WLL_JOB_WAITING;
- else if ( !strcasecmp(tmps, "Ready") ) cond->attr_id.state = EDG_WLL_JOB_READY;
- else if ( !strcasecmp(tmps, "Scheduled") ) cond->attr_id.state = EDG_WLL_JOB_SCHEDULED;
- else if ( !strcasecmp(tmps, "Running") ) cond->attr_id.state = EDG_WLL_JOB_RUNNING;
- else if ( !strcasecmp(tmps, "Done") ) cond->attr_id.state = EDG_WLL_JOB_DONE;
- else if ( !strcasecmp(tmps, "Aborted") ) cond->attr_id.state = EDG_WLL_JOB_ABORTED;
- else if ( !strcasecmp(tmps, "Cancelled") ) cond->attr_id.state = EDG_WLL_JOB_CANCELLED;
- else if ( !strcasecmp(tmps, "Cleared") ) cond->attr_id.state = EDG_WLL_JOB_CLEARED;
- else
- {
+ if ( 0 > (cond->value.i = edg_wll_StringToStat(tmps))) {
fprintf(stderr,"%s: invalid status value (%s)\n", myname, tmps);
return 0;
}
cond->value2.t.tv_sec = StrToTime(tmps);
}
break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+ if ( 0 > (cond->value.i = edg_wll_JobtypeStrToCode(tmps))) {
+ fprintf(stderr,"%s: invalid job type (%s)\n", myname, tmps);
+ return 0;
+ }
+ break;
default:
break;
case EDG_WLL_QUERY_ATTR_SOURCE: printf("source"); break;
case EDG_WLL_QUERY_ATTR_INSTANCE: printf("instance"); break;
case EDG_WLL_QUERY_ATTR_EVENT_TYPE: printf("ev_type"); break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE: printf("job_type"); break;
default: break;
}
switch ( cond[i][j].op )
EDG_WLL_QUERY_ATTR_EVENT_TYPE, /**< Event type \see _edg_wll_QueryRec */
EDG_WLL_QUERY_ATTR_CHKPT_TAG, /**< Checkpoint tag */
EDG_WLL_QUERY_ATTR_RESUBMITTED, /**< Job was resubmitted */
- EDG_WLL_QUERY_ATTR_PARENT, /**< Job was resubmitted */
+ EDG_WLL_QUERY_ATTR_PARENT, /**< Parent Job ID */
EDG_WLL_QUERY_ATTR_EXITCODE, /**< Unix exit code */
EDG_WLL_QUERY_ATTR_JDL_ATTR, /**< Arbitrary JDL attribute */
EDG_WLL_QUERY_ATTR_STATEENTERTIME, /**< When entered current status */
EDG_WLL_QUERY_ATTR_LASTUPDATETIME, /**< Time of the last known event of the job */
EDG_WLL_QUERY_ATTR_NETWORK_SERVER, /**< Network server aka RB aka WMproxy endpoint */
+ EDG_WLL_QUERY_ATTR_JOB_TYPE, /**< Event type \see _edg_wll_QueryRec */
EDG_WLL_QUERY_ATTR__LAST
/* if adding new attribute, add conversion string to common/xml_conversions.c too !! */
} edg_wll_QueryAttr;
"donecode","usertag","time","level","host","source",
"instance","type","chkpt_tag", "resubmitted", "parent_job",
"exitcode", "jdl", "stateentertime", "lastupdatetime",
- "networkserver" };
+ "networkserver", "jobtype" };
/**
* Names for the predefined types of query operands
case EDG_WLL_QUERY_ATTR_TIME:
case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
/* do nothing */
break;
default:
+enum edg_wll_StatJobtype edg_wll_from_string_to_edg_wll_StatJobtype(edg_wll_XML_ctx *XMLCtx)
+{
+ enum edg_wll_StatJobtype out = -1;
+ char *s;
+
+ s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
+ if (s) {
+ out = edg_wll_JobtypeStrToCode(s);
+ free(s);
+ }
+ edg_wll_freeBuf(XMLCtx);
+
+ return(out);
+}
+
+
/* XMLCtx->eventsOutGlobal[XMLCtx->position].jobClear.clearReason =
edg_wll_from_string_to_int(XMLCtx); */
"EDG_WLL_QUERY_ATTR_JDL_ATTR",
"EDG_WLL_QUERY_ATTR_STATEENTERTIME",
"EDG_WLL_QUERY_ATTR_LASTUPDATETIME",
+ "EDG_WLL_QUERY_ATTR_JOB_TYPE",
"EDG_WLL_QUERY_ATTR__LAST",
};
edg_wll_add_time_t_to_XMLBody(&pomValue, conditions[row][i].value.t.tv_sec, "lastupdatetime", -1);
break;
case EDG_WLL_QUERY_ATTR_JOB_TYPE:
- edg_wll_add_int_to_XMLBody(&pomValue, conditions[row][i].value.i, "jobtype", -1);
+ edg_wll_add_string_to_XMLBody(&pomValue, edg_wll_StatusJobtypeNames[conditions[row][i].value.i],
+ "jobtype", NULL);
break;
default:
break;
case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: GS("networkserver");
break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE: GS("jobtype");
+ break;
default:
assert(! "Unknown attribute!");
break;
GS(buf);
free(buf);
break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+ asprintf(&buf, "%s", edg_wll_StatusJobtypeNames[l2->value.i]);
+ GS(buf);
+ free(buf);
+ break;
default:
assert(! "Unknown condition attribute!");
break;
}
conds[i][j].value.t.tv_usec = 0;
break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+ if ( 0 > (conds[i][j].value.i = edg_wll_JobtypeStrToCode(value))) {
+ asprintf(&errmsg, "Unknown job type \"%s\" in query", value);
+ err = edg_wll_SetError(ctx, EINVAL, errmsg);
+ goto err;
+ }
+ break;
default:
asprintf(&errmsg, "Value conversion for attribute \"%s\" not supported in current implementation", attribute);
err = edg_wll_SetError(ctx, ENOSYS, errmsg);
char *e;
char *s;
-
if (XMLCtx->level == 4 &&
XMLCtx->job_conditions != NULL &&
XMLCtx->job_conditions[XMLCtx->row] != NULL) {
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec =
edg_wll_from_string_to_time_t(XMLCtx);
break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+ XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i =
+ edg_wll_from_string_to_edg_wll_StatJobtype(XMLCtx);
+
+ break;
default:
edg_wll_freeBuf(XMLCtx);
XMLCtx->level--;
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec =
edg_wll_from_string_to_time_t(XMLCtx);
break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+ XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i =
+ edg_wll_from_string_to_edg_wll_StatJobtype(XMLCtx);
+
+ break;
default:
edg_wll_freeBuf(XMLCtx);
XMLCtx->level--;
ct++;
break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+ if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
+ {
+ edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with jobtype");
+ return NULL;
+ }
+ ct++;
+ break;
+
default:
sprintf(msg, "ec_to_head_where(): attr=%d unsupported", ec[m][n].attr);
edg_wll_SetError(ctx, EINVAL, msg);
return NULL;
}
break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+ if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
+ {
+ edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with jobtype");
+ return NULL;
+ }
+ ct++;
+ break;
+
default:
sprintf(msg, "jc_to_head_where(): attr=%d unsupported", jc[m][n].attr);
case EDG_WLL_QUERY_ATTR_DONECODE:
case EDG_WLL_QUERY_ATTR_EXITCODE:
case EDG_WLL_QUERY_ATTR_STATUS:
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
if ( !is_indexed(&(jc[m][n]), ctx)
|| !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
{
if (oldstat->lastUpdateTime.tv_sec != stat->lastUpdateTime.tv_sec) goto or_satisfied;
break;
}
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
+ switch ( conds[i][j].op )
+ {
+ case EDG_WLL_QUERY_OP_EQUAL:
+ if ( conds[i][j].value.i == stat->jobtype ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_UNEQUAL:
+ if ( conds[i][j].value.i != stat->jobtype ) goto or_satisfied;
+ break;
+ }
default:
break;
}
#define STATEENTERTIME lbt__queryAttr__STATEENTERTIME
#define LASTUPDATETIME lbt__queryAttr__LASTUPDATETIME
#define NETWORKSERVER lbt__queryAttr__NETWORKSERVER
+#define JOBTYPE lbt__queryAttr__JOBTYPE
#define EQUAL lbt__queryOp__EQUAL
#define UNEQUAL lbt__queryOp__UNEQUAL
case STATEENTERTIME: *out = EDG_WLL_QUERY_ATTR_STATEENTERTIME; break;
case LASTUPDATETIME: *out = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; break;
case NETWORKSERVER: *out = EDG_WLL_QUERY_ATTR_NETWORK_SERVER; break;
+ case JOBTYPE: *out = EDG_WLL_QUERY_ATTR_JOB_TYPE; break;
default: return 0;
}
case EDG_WLL_QUERY_ATTR_STATEENTERTIME: *out = STATEENTERTIME; break;
case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: *out = LASTUPDATETIME; break;
case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: *out = NETWORKSERVER; break;
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE: *out = JOBTYPE; break;
default: return 0;
}
case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
case EDG_WLL_QUERY_ATTR_RESUBMITTED:
case EDG_WLL_QUERY_ATTR_EXITCODE:
+ case EDG_WLL_QUERY_ATTR_JOB_TYPE:
VALUEQR_SET(out, i, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, i)))));
if ( !VALUEQR_GET(out, i) ) return SOAP_FAULT;
*(VALUEQR_GET(out, i)) = in->i;
<val name="STATEENTERTIME">Staus enter time.</val>
<val name="LASTUPDATETIME">Last update time.</val>
<val name="NETWORKSERVER">Network server aka RB aka WMproxy endpoint</val>
+ <val name="JOBTYPE">Type of the job</val>
</enum>
<struct name="queryRecord">