From e447ccfb840ce1500e406580dbbd35c433020410 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zden=C4=9Bk=20=C5=A0ustr?= Date: Fri, 30 Nov 2007 14:52:46 +0000 Subject: [PATCH] New query attributes for dashboard. state_enter_time does not observe state flag, yet. Needs fixing. --- org.glite.lb.client/examples/query_ext.c | 18 ++++++- org.glite.lb.client/interface/ServerConnection.h | 2 +- org.glite.lb.common/src/xml_conversions.c | 3 ++ org.glite.lb.common/src/xml_parse.c.T | 20 ++++++++ org.glite.lb.server/src/jobstat_supp.c | 17 +++++++ org.glite.lb.server/src/lb_xml_parse.c.T | 20 ++++++-- org.glite.lb.server/src/query.c | 65 ++++++++++++++++++++++++ org.glite.lb.server/src/ws_typemap.h | 4 ++ org.glite.lb.server/src/ws_typeref.c.T | 9 ++++ org.glite.lb.ws-interface/src/LBTypes.xml.T | 3 ++ 10 files changed, 154 insertions(+), 7 deletions(-) diff --git a/org.glite.lb.client/examples/query_ext.c b/org.glite.lb.client/examples/query_ext.c index f4081b8..e47eee9 100644 --- a/org.glite.lb.client/examples/query_ext.c +++ b/org.glite.lb.client/examples/query_ext.c @@ -393,6 +393,15 @@ static char *get_job_condition(char *src, edg_wll_QueryRec *cond) 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; @@ -460,7 +469,8 @@ static char *get_job_condition(char *src, edg_wll_QueryRec *cond) 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 ) @@ -514,6 +524,9 @@ static char *get_event_condition(char *src, edg_wll_QueryRec *cond) 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; @@ -722,6 +735,9 @@ static void printconds(edg_wll_QueryRec **cond) 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; diff --git a/org.glite.lb.client/interface/ServerConnection.h b/org.glite.lb.client/interface/ServerConnection.h index a55ee5e..4e27cdd 100644 --- a/org.glite.lb.client/interface/ServerConnection.h +++ b/org.glite.lb.client/interface/ServerConnection.h @@ -58,7 +58,7 @@ public: 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. diff --git a/org.glite.lb.common/src/xml_conversions.c b/org.glite.lb.common/src/xml_conversions.c index d041ff5..6279276 100644 --- a/org.glite.lb.common/src/xml_conversions.c +++ b/org.glite.lb.common/src/xml_conversions.c @@ -923,6 +923,9 @@ static const char * const query_attrConsts[] = { "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", }; diff --git a/org.glite.lb.common/src/xml_parse.c.T b/org.glite.lb.common/src/xml_parse.c.T index 1cde8fd..612fc3f 100644 --- a/org.glite.lb.common/src/xml_parse.c.T +++ b/org.glite.lb.common/src/xml_parse.c.T @@ -2506,6 +2506,26 @@ int edg_wll_JobQueryRecToXML( 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; diff --git a/org.glite.lb.server/src/jobstat_supp.c b/org.glite.lb.server/src/jobstat_supp.c index 49b9587..ae9a299 100644 --- a/org.glite.lb.server/src/jobstat_supp.c +++ b/org.glite.lb.server/src/jobstat_supp.c @@ -738,8 +738,25 @@ edg_wll_ErrorCode edg_wll_IColumnsSQLPart(edg_wll_Context ctx, 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: diff --git a/org.glite.lb.server/src/lb_xml_parse.c.T b/org.glite.lb.server/src/lb_xml_parse.c.T index 5a969b3..7fc5f44 100644 --- a/org.glite.lb.server/src/lb_xml_parse.c.T +++ b/org.glite.lb.server/src/lb_xml_parse.c.T @@ -50,7 +50,8 @@ 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}; @@ -115,7 +116,8 @@ static void startJobQueryRec(void *data, const char *el, const char **attr) 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]); @@ -240,7 +242,8 @@ static void startQueryEventsRequest(void *data, const char *el, const char **att 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]); @@ -255,7 +258,8 @@ static void startQueryEventsRequest(void *data, const char *el, const char **att 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]); @@ -495,6 +499,7 @@ static void endJobQueryRec(void *data, const char *el UNUSED_VAR) 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; @@ -525,6 +530,8 @@ static void endJobQueryRec(void *data, const char *el UNUSED_VAR) 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 = @@ -649,6 +656,7 @@ static void endQueryEventsRequest(void *data, const char *el UNUSED_VAR) 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 = @@ -680,6 +688,7 @@ static void endQueryEventsRequest(void *data, const char *el UNUSED_VAR) 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 = @@ -1926,7 +1935,8 @@ int edg_wll_IndexedAttrsToXML( 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); diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c index d3fa767..9faf04d 100644 --- a/org.glite.lb.server/src/query.c +++ b/org.glite.lb.server/src/query.c @@ -914,12 +914,22 @@ static char *jc_to_head_where( 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); @@ -942,6 +952,8 @@ static char *jc_to_head_where( 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]))) ) { @@ -1088,6 +1100,7 @@ static char *jc_to_head_where( 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]))) ) { @@ -1456,6 +1469,58 @@ int match_status(edg_wll_Context ctx, const edg_wll_JobStat *stat, const edg_wll 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; } diff --git a/org.glite.lb.server/src/ws_typemap.h b/org.glite.lb.server/src/ws_typemap.h index 6e2e5fb..45f87d4 100644 --- a/org.glite.lb.server/src/ws_typemap.h +++ b/org.glite.lb.server/src/ws_typemap.h @@ -22,6 +22,10 @@ #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 diff --git a/org.glite.lb.server/src/ws_typeref.c.T b/org.glite.lb.server/src/ws_typeref.c.T index c9b18de..b016442 100644 --- a/org.glite.lb.server/src/ws_typeref.c.T +++ b/org.glite.lb.server/src/ws_typeref.c.T @@ -370,6 +370,9 @@ int edg_wll_SoapToAttr(const enum lbt__queryAttr in, edg_wll_QueryAttr *out) 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; } @@ -399,6 +402,9 @@ int edg_wll_AttrToSoap(const edg_wll_QueryAttr in, enum lbt__queryAttr *out) 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; } @@ -468,6 +474,7 @@ int edg_wll_QueryValToSoap( 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; @@ -480,6 +487,8 @@ int edg_wll_QueryValToSoap( } 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); diff --git a/org.glite.lb.ws-interface/src/LBTypes.xml.T b/org.glite.lb.ws-interface/src/LBTypes.xml.T index 15f5070..3dc8f76 100644 --- a/org.glite.lb.ws-interface/src/LBTypes.xml.T +++ b/org.glite.lb.ws-interface/src/LBTypes.xml.T @@ -268,6 +268,9 @@ Instance of the source component. Event type. Checkpoint tag. + JDL Attribute. + Staus enter time. + Last update time. -- 1.8.2.3