From: Miloš Mulač Date: Thu, 6 Oct 2005 13:59:19 +0000 (+0000) Subject: add query conditions to sql WHERE X-Git-Tag: gridsite-core_R_1_1_12~10 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=89dc32c230bcdb04595a61004a7d0b420b73f65a;p=jra1mw.git add query conditions to sql WHERE --- diff --git a/org.glite.jp.index/src/soap_ops.c b/org.glite.jp.index/src/soap_ops.c index 0585c49..d142dcd 100644 --- a/org.glite.jp.index/src/soap_ops.c +++ b/org.glite.jp.index/src/soap_ops.c @@ -179,26 +179,70 @@ end: } -static int get_jobids(glite_jpis_context_t isctx, struct _jpelem__QueryJobs *in, char ***jobids) +static int get_jobids(struct soap *soap, glite_jpis_context_t isctx, struct _jpelem__QueryJobs *in, char ***jobids) { - char *qa, *qb, *qbase, *query, *jid, **jids; - int i, ret; + char *qa, *qb, *qop, *qbase, *query, *jid, **jids; + int i, j, ret; glite_jp_db_stmt_t stmt; + glite_jp_queryop_t op; + glite_jp_attrval_t attr; + trio_asprintf(&qbase,"SELECT dg_jobid FROM jobs WHERE "); for (i=0; i < in->__sizeconditions; i++) { if (i == 0) { - trio_asprintf(&qa,"jobs.jobid = attr_%|Ss.jobid", + trio_asprintf(&qa,"jobs.jobid = attr_%|Ss.jobid AND (", str2md5(in->conditions[i]->attr)); } else { - trio_asprintf(&qb,"%s AND jobs.jobid = attr_%|Ss.jobid", + trio_asprintf(&qb,"%s AND jobs.jobid = attr_%|Ss.jobid AND (", qa, str2md5(in->conditions[i]->attr)); - free(qa); - qa = qb; - qb = NULL; - } + free(qa); qa = qb; qb = NULL; + } + + for (j=0; j < in->conditions[i]->__sizerecord; j++) { + glite_jpis_SoapToQueryOp(in->conditions[i]->record[j]->op, &op); + switch (op) { + case GLITE_JP_QUERYOP_EQUAL: + qop = strdup("="); + break; + case GLITE_JP_QUERYOP_UNEQUAL: + qop = strdup("!="); + break; + default: + // unsupported query operator + goto err; + break; + } + if (in->conditions[i]->record[j]->value->string) { + attr.name = in->conditions[i]->attr; + attr.value = in->conditions[i]->record[j]->value->string; + attr.binary = 0; + glite_jpis_SoapToAttrOrig(soap, + in->conditions[i]->origin, &(attr.origin)); + trio_asprintf(&qb,"%s OR attr_%|Ss.value %s %|Ss ", + qa, in->conditions[i]->attr, qop, + glite_jp_attrval_to_db_index(isctx->jpctx, &attr, 255)); + free(qop); + free(qa); qa = qb; qb = NULL; + } + else { + attr.name = in->conditions[i]->attr; + attr.value = in->conditions[i]->record[j]->value->blob->__ptr; + attr.binary = 1; + attr.size = in->conditions[i]->record[j]->value->blob->__size; + glite_jpis_SoapToAttrOrig(soap, + in->conditions[i]->origin, &(attr.origin)); + trio_asprintf(&qb,"%s OR attr_%|Ss.value %s %|Ss ", + qa, in->conditions[i]->attr, qop, + glite_jp_attrval_to_db_index(isctx->jpctx, &attr, 255)); + free(qop); + free(qa); qa = qb; qb = NULL; + } + } + trio_asprintf(&qb,"%s)",qa); + free(qa); qa = qb; qb = NULL; } trio_asprintf(&query, "%s%s;", qbase, qa); free(qbase); @@ -365,7 +409,7 @@ SOAP_FMAC5 int SOAP_FMAC6 __jpsrv__QueryJobs( return SOAP_ERR; } - if ( get_jobids(isctx, in, &jobids) ) { + if ( get_jobids(soap, isctx, in, &jobids) ) { return SOAP_ERR; } diff --git a/org.glite.jp.index/src/ws_is_typeref.c b/org.glite.jp.index/src/ws_is_typeref.c index b3f8e2c..3e8824c 100644 --- a/org.glite.jp.index/src/ws_is_typeref.c +++ b/org.glite.jp.index/src/ws_is_typeref.c @@ -10,7 +10,7 @@ #include "ws_ps_typeref.h" -static void SoapToQueryOp(const enum jptype__queryOp in, glite_jp_queryop_t *out) +void glite_jpis_SoapToQueryOp(const enum jptype__queryOp in, glite_jp_queryop_t *out) { switch ( in ) { @@ -24,7 +24,7 @@ static void SoapToQueryOp(const enum jptype__queryOp in, glite_jp_queryop_t *out } } -static void SoapToAttrOrig(struct soap *soap, const enum jptype__attrOrig *in, glite_jp_attr_orig_t *out) +void glite_jpis_SoapToAttrOrig(struct soap *soap, const enum jptype__attrOrig *in, glite_jp_attr_orig_t *out) { assert(out); @@ -88,7 +88,7 @@ static int SoapToQueryCond( for (i=0; i < in->__sizerecord; i++) { qr[i].attr = strdup(in->attr); - SoapToQueryOp(in->record[i]->op, &(qr[i].op)); + glite_jpis_SoapToQueryOp(in->record[i]->op, &(qr[i].op)); switch (qr[i].op) { case GLITE_JP_QUERYOP_EXISTS: @@ -107,10 +107,12 @@ static int SoapToQueryCond( break; } - SoapToAttrOrig(soap, in->origin, &(qr[i].origin) ); + glite_jpis_SoapToAttrOrig(soap, in->origin, &(qr[i].origin) ); } *out = qr; + + return 0; } /** @@ -139,4 +141,6 @@ int glite_jpis_SoapToQueryConds( } *out = qr; + + return 0; } diff --git a/org.glite.jp.index/src/ws_is_typeref.h b/org.glite.jp.index/src/ws_is_typeref.h index 8869a48..880b7e4 100644 --- a/org.glite.jp.index/src/ws_is_typeref.h +++ b/org.glite.jp.index/src/ws_is_typeref.h @@ -1,6 +1,8 @@ #ifndef GLITE_JPIS_IS_TYPEREF_H #define GLITE_JPIS_IS_TYPEREF_H +void glite_jpis_SoapToQueryOp(const enum jptype__queryOp in, glite_jp_queryop_t *out); +void glite_jpis_SoapToAttrOrig(struct soap *soap, const enum jptype__attrOrig *in, glite_jp_attr_orig_t *out); int glite_jpis_SoapToQueryConds(struct soap *soap, int size, struct jptype__indexQuery **in, glite_jp_query_rec_t ***out); #endif