New query attributes for dashboard. state_enter_time does not observe state flag...
authorZdeněk Šustr <sustr4@cesnet.cz>
Fri, 30 Nov 2007 14:52:46 +0000 (14:52 +0000)
committerZdeněk Šustr <sustr4@cesnet.cz>
Fri, 30 Nov 2007 14:52:46 +0000 (14:52 +0000)
org.glite.lb.client/examples/query_ext.c
org.glite.lb.client/interface/ServerConnection.h
org.glite.lb.common/src/xml_conversions.c
org.glite.lb.common/src/xml_parse.c.T
org.glite.lb.server/src/jobstat_supp.c
org.glite.lb.server/src/lb_xml_parse.c.T
org.glite.lb.server/src/query.c
org.glite.lb.server/src/ws_typemap.h
org.glite.lb.server/src/ws_typeref.c.T
org.glite.lb.ws-interface/src/LBTypes.xml.T

index f4081b8..e47eee9 100644 (file)
@@ -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;
index a55ee5e..4e27cdd 100644 (file)
@@ -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.
index d041ff5..6279276 100644 (file)
@@ -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",
 };
 
index 1cde8fd..612fc3f 100644 (file)
@@ -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;
index 49b9587..ae9a299 100644 (file)
@@ -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:
index 5a969b3..7fc5f44 100644 (file)
@@ -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);
index d3fa767..9faf04d 100644 (file)
@@ -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;
                        }
index 6e2e5fb..45f87d4 100644 (file)
 #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
index c9b18de..b016442 100644 (file)
@@ -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);
index 15f5070..3dc8f76 100644 (file)
                        <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">