else if ( !strcmp(tmps, "exit_code") ) cond->attr = EDG_WLL_QUERY_ATTR_EXITCODE;
else if ( !strcmp(tmps, "parent_job") ) cond->attr = EDG_WLL_QUERY_ATTR_PARENT;
else if ( !strcmp(tmps, "time") ) cond->attr = EDG_WLL_QUERY_ATTR_TIME;
+ 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;
+
+
+ /**< When entered current status */
+ /**< Time of the last known event of the job */
+ /**< Network server aka RB aka WMproxy endpoint */
+
else
{
cond->attr = EDG_WLL_QUERY_ATTR_USERTAG;
cond->value2.i = atoi(tmps);
}
break;
-
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
case EDG_WLL_QUERY_ATTR_TIME:
cond->value.t.tv_sec = StrToTime(tmps);
if ( cond->op == EDG_WLL_QUERY_OP_WITHIN )
if ( tmps[0] == '\0' ) return NULL;
if ( !strcmp(tmps, "time") ) cond->attr = EDG_WLL_QUERY_ATTR_TIME;
+ 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, "level") ) cond->attr = EDG_WLL_QUERY_ATTR_LEVEL;
else if ( !strcmp(tmps, "host") ) cond->attr = EDG_WLL_QUERY_ATTR_HOST;
else if ( !strcmp(tmps, "source") ) cond->attr = EDG_WLL_QUERY_ATTR_SOURCE;
case EDG_WLL_QUERY_ATTR_RESUBMITTED: printf("resubmitted"); break;
case EDG_WLL_QUERY_ATTR_USERTAG: printf("%s",cond[i][j].attr_id.tag); break;
case EDG_WLL_QUERY_ATTR_TIME: printf("time"); break;
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME: printf("state_enter_time"); break;
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: printf("last_update_time"); break;
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR: printf("jdl_attr"); break;
case EDG_WLL_QUERY_ATTR_LEVEL: printf("level"); break;
case EDG_WLL_QUERY_ATTR_HOST: printf("host"); break;
case EDG_WLL_QUERY_ATTR_SOURCE: printf("source"); break;
RESUBMITTED = EDG_WLL_QUERY_ATTR_RESUBMITTED, /**< Job was resubmitted */
PARENT = EDG_WLL_QUERY_ATTR_PARENT, /**< Id of the parent job. */
EXITCODE = EDG_WLL_QUERY_ATTR_EXITCODE, /**< Job system exit code. */
- JDL_ATTR = EDG_WLL_QUERY_ATTR_JDL_ATTR, /**< Arbitrary JDL attribute */
+ JDLATTR = EDG_WLL_QUERY_ATTR_JDL_ATTR, /**< Arbitrary JDL attribute */
};
/** Symbolic names of predicates.
"EDG_WLL_QUERY_ATTR_RESUBMITTED",
"EDG_WLL_QUERY_ATTR_PARENT",
"EDG_WLL_QUERY_ATTR_EXITCODE",
+ "EDG_WLL_QUERY_ATTR_JDL_ATTR",
+ "EDG_WLL_QUERY_ATTR_STATEENTERTIME",
+ "EDG_WLL_QUERY_ATTR_LASTUPDATETIME",
"EDG_WLL_QUERY_ATTR__LAST",
};
case EDG_WLL_QUERY_ATTR_USERTAG:
edg_wll_add_tagged_string_to_XMLBody(&pomValue, conditions[row][i].value.c, "usertag", conditions[row][i].attr_id.tag, "name", NULL);
break;
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR:
+ edg_wll_add_string_to_XMLBody(&pomValue, conditions[row][i].value.c, "jdl", NULL);
+ break;
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
+ if (conditions[row][i].op == EDG_WLL_QUERY_OP_WITHIN) {
+ edg_wll_add_tagged_time_t_to_XMLBody(&pomValue, conditions[row][i].value.t.tv_sec, "stateentertime", edg_wll_StatToString(conditions[row][i].attr_id.state), "state", -1);
+ edg_wll_add_tagged_time_t_to_XMLBody(&pomValue, conditions[row][i].value2.t.tv_sec, "stateentertime", edg_wll_StatToString(conditions[row][i].attr_id.state), "state", -1);
+ }
+ else
+ edg_wll_add_tagged_time_t_to_XMLBody(&pomValue, conditions[row][i].value.t.tv_sec, "stateentertime", edg_wll_StatToString(conditions[row][i].attr_id.state), "state", -1);
+ break;
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
+ if (conditions[row][i].op == EDG_WLL_QUERY_OP_WITHIN) {
+ edg_wll_add_time_t_to_XMLBody(&pomValue, conditions[row][i].value.t.tv_sec, "lastupdatetime", -1);
+ edg_wll_add_time_t_to_XMLBody(&pomValue, conditions[row][i].value2.t.tv_sec, "lastupdatetime", -1);
+ }
+ else
+ edg_wll_add_time_t_to_XMLBody(&pomValue, conditions[row][i].value.t.tv_sec, "lastupdatetime", -1);
+ break;
+
default:
free(pomValue);
return -1;
break;
case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
glite_lbu_TimeToDB(stat->pub.stateEnterTime.tv_sec, &data);
+ break;
case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
glite_lbu_TimeToDB(stat->pub.lastUpdateTime.tv_sec, &data);
+ break;
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR: // XXX: It's not clear how this is supposed to work
+ if (stat->pub.jdl)
+ trio_asprintf(&data, "'%|Ss'", stat->pub.destination);
+ else data = strdup("''");
+ break;
+/* case EDG_WLL_QUERY_ATTR_STATEENTERTIME: /// XXX: Which way of handling this is correct?
+ if (stat->pub.stateEnterTime)
+ glite_lbu_TimeToDB(stat->pub.stateEnterTime, &data);
+ else data = strdup("0");
+ break;
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
+ if (stat->pub.lastUpdateTime)
+ glite_lbu_TimeToDB(stat->pub.lastUpdateTime, &data);
+ else data = strdup("0");
+ break;*/
/* XXX add more attributes when defined */
default:
static char *ops[] = { "equal","less","greater","within","unequal" },
*attrs[] = { "jobid","owner","status","location","destination",
"donecode","usertag","time","level","host","source",
- "instance","type","chkpt_tag", "resubmitted", "parent_job", "exitcode" };
+ "instance","type","chkpt_tag", "resubmitted", "parent_job",
+ "exitcode", "jdl", "stateentertime", "lastupdatetime" };
static const struct timeval null_timeval = {0,0};
if (strcmp(attr[0],"name")) { unexp() break;}
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]);
}
- else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) {
+ else if ( ((i+1) == EDG_WLL_QUERY_ATTR_TIME) ||
+ ((i+1) == EDG_WLL_QUERY_ATTR_STATEENTERTIME)) {
if (!attr[0] || !attr[1]) { unexp() break;}
if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
if (attr[0] && strcmp(attr[0],"name")) { unexp() break;}
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]);
}
- else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) {
+ else if ( ((i+1) == EDG_WLL_QUERY_ATTR_TIME) ||
+ ((i+1) == EDG_WLL_QUERY_ATTR_STATEENTERTIME)) {
if (!attr[0] || !attr[1]) { unexp() break;}
if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
if (attr[0] && strcmp(attr[0],"name")) { unexp() break;}
XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.tag = strdup(attr[1]);
}
- else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) {
+ else if ( ((i+1) == EDG_WLL_QUERY_ATTR_TIME) ||
+ ((i+1) == EDG_WLL_QUERY_ATTR_STATEENTERTIME)) {
if (!attr[0] || !attr[1]) { unexp() break;}
if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
case EDG_WLL_QUERY_ATTR_LOCATION:
case EDG_WLL_QUERY_ATTR_DESTINATION:
case EDG_WLL_QUERY_ATTR_USERTAG:
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR:
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c =
edg_wll_from_string_to_string(XMLCtx);
break;
break;
case EDG_WLL_QUERY_ATTR_TIME:
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
if ( !XMLCtx->bound )
{
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec =
edg_wll_from_string_to_int(XMLCtx);
break;
case EDG_WLL_QUERY_ATTR_TIME:
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
if ( !XMLCtx->bound )
{
XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec =
XMLCtx->event_conditions[XMLCtx->row2] != NULL) {
switch (XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr) {
case EDG_WLL_QUERY_ATTR_TIME:
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
if ( !XMLCtx->bound )
{
XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.t.tv_sec =
edg_wll_query_attrToString(ctx->job_index[i][j].attr),
"attribute", NULL);
- if (ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_TIME)
+ if ((ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_TIME) ||
+ (ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_STATEENTERTIME))
edg_wll_add_string_to_XMLBody(&pomA,
edg_wll_StatToString(ctx->job_index[i][j].attr_id.state),
"state", NULL);
case EDG_WLL_QUERY_ATTR_DONECODE:
case EDG_WLL_QUERY_ATTR_EXITCODE:
case EDG_WLL_QUERY_ATTR_STATUS:
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
ct++;
break;
case EDG_WLL_QUERY_ATTR_USERTAG:
ct++;
break;
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR:
+ ct++;
+ 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 JDL attributes");
+ return NULL;
+ }
+ break;
default:
sprintf(msg, "jc_to_head_where(): attr=%d unsupported", jc[m][n].attr);
for ( n = 0; jc[m][n].attr; n++ ) switch (jc[m][n].attr)
{
case EDG_WLL_QUERY_ATTR_TIME:
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
if ( !is_indexed(&(jc[m][n]), ctx)
|| !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
{
case EDG_WLL_QUERY_ATTR_LOCATION:
case EDG_WLL_QUERY_ATTR_RESUBMITTED:
case EDG_WLL_QUERY_ATTR_USERTAG:
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR:
if ( !is_indexed(&(jc[m][n]), ctx)
|| !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
{
break;
}
break;
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR:
+ if ( stat->destination )
+ {
+ if ( !strcmp(conds[i][j].value.c, stat->jdl) ) { // XXX: actually interested in one attribute only.
+ if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
+ } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
+ }
+ break;
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
+ if ( !stat->stateEnterTime.tv_sec )
+ break;
+ switch ( conds[i][j].op )
+ {
+ case EDG_WLL_QUERY_OP_EQUAL:
+ if ( conds[i][j].value.t.tv_sec == stat->stateEnterTime.tv_sec ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_UNEQUAL:
+ if ( conds[i][j].value.t.tv_sec != stat->stateEnterTime.tv_sec ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_LESS:
+ if ( conds[i][j].value.t.tv_sec > stat->stateEnterTime.tv_sec ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_GREATER:
+ if ( conds[i][j].value.t.tv_sec < stat->stateEnterTime.tv_sec ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_WITHIN:
+ if ( conds[i][j].value.t.tv_sec <= stat->stateEnterTime.tv_sec
+ && conds[i][j].value2.t.tv_sec >= stat->stateEnterTime.tv_sec ) goto or_satisfied;
+ break;
+ }
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
+ if ( !stat->lastUpdateTime.tv_sec )
+ break;
+ switch ( conds[i][j].op )
+ {
+ case EDG_WLL_QUERY_OP_EQUAL:
+ if ( conds[i][j].value.t.tv_sec == stat->lastUpdateTime.tv_sec ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_UNEQUAL:
+ if ( conds[i][j].value.t.tv_sec != stat->lastUpdateTime.tv_sec ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_LESS:
+ if ( conds[i][j].value.t.tv_sec > stat->lastUpdateTime.tv_sec ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_GREATER:
+ if ( conds[i][j].value.t.tv_sec < stat->lastUpdateTime.tv_sec ) goto or_satisfied;
+ break;
+ case EDG_WLL_QUERY_OP_WITHIN:
+ if ( conds[i][j].value.t.tv_sec <= stat->lastUpdateTime.tv_sec
+ && conds[i][j].value2.t.tv_sec >= stat->lastUpdateTime.tv_sec ) goto or_satisfied;
+ break;
+ }
default:
break;
}
#define RESUBMITTED lbt__queryAttr__RESUBMITTED
#define PARENT lbt__queryAttr__PARENT
#define EXITCODE lbt__queryAttr__EXITCODE
+#define JDLATTR lbt__queryAttr__JDLATTR
+#define STATEENTERTIME lbt__queryAttr__STATEENTERTIME
+#define LASTUPDATETIME lbt__queryAttr__LASTUPDATETIME
+
#define EQUAL lbt__queryOp__EQUAL
#define UNEQUAL lbt__queryOp__UNEQUAL
case RESUBMITTED: *out = EDG_WLL_QUERY_ATTR_RESUBMITTED; break;
case PARENT: *out = EDG_WLL_QUERY_ATTR_PARENT; break;
case EXITCODE: *out = EDG_WLL_QUERY_ATTR_EXITCODE; break;
+ case JDLATTR: *out = EDG_WLL_QUERY_ATTR_JDL_ATTR; break;
+ case STATEENTERTIME: *out = EDG_WLL_QUERY_ATTR_STATEENTERTIME; break;
+ case LASTUPDATETIME: *out = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; break;
default: return 0;
}
case EDG_WLL_QUERY_ATTR_RESUBMITTED: *out = RESUBMITTED; break;
case EDG_WLL_QUERY_ATTR_PARENT: *out = PARENT; break;
case EDG_WLL_QUERY_ATTR_EXITCODE: *out = EXITCODE; break;
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR: *out = JDLATTR; break;
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME: *out = STATEENTERTIME; break;
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: *out = LASTUPDATETIME; break;
default: return 0;
}
case EDG_WLL_QUERY_ATTR_HOST:
case EDG_WLL_QUERY_ATTR_INSTANCE:
case EDG_WLL_QUERY_ATTR_CHKPT_TAG:
+ case EDG_WLL_QUERY_ATTR_JDL_ATTR:
VALUEQR_SET(out, c, in->c ? soap_strdup(soap, in->c) : NULL);
if (in->c && !VALUEQR_GET(out, c) ) return SOAP_FAULT;
break;
}
break;
case EDG_WLL_QUERY_ATTR_TIME:
+ case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
+ case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
VALUEQR_SET(out, t, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, t)))));
if ( !VALUEQR_GET(out, t) ) return SOAP_FAULT;
VALUEQR_SETTYPE(out, t);
<val name="INSTANCE">Instance of the source component.</val>
<val name="EVENTTYPE">Event type.</val>
<val name="CHKPTTAG">Checkpoint tag.</val>
+ <val name="JDLATTR">JDL Attribute.</val>
+ <val name="STATEENTERTIME">Staus enter time.</val>
+ <val name="LASTUPDATETIME">Last update time.</val>
</enum>
<struct name="queryRecord">