From 58bcb840e0b7764c5e013b2a0aa6305f940aed49 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ji=C5=99=C3=AD=20Filipovi=C4=8D?= Date: Fri, 30 May 2008 09:23:59 +0000 Subject: [PATCH] Partially implemented new configuration (queriable single values are placed in jobs table). --- org.glite.jp.index/src/conf.c | 30 ++++++++++++++++-------- org.glite.jp.index/src/conf.h | 3 ++- org.glite.jp.index/src/db_ops.c | 51 +++++++++++++++++++++++------------------ 3 files changed, 52 insertions(+), 32 deletions(-) diff --git a/org.glite.jp.index/src/conf.c b/org.glite.jp.index/src/conf.c index 11cb55d..56fb2bc 100644 --- a/org.glite.jp.index/src/conf.c +++ b/org.glite.jp.index/src/conf.c @@ -134,8 +134,8 @@ void glite_jp_free_conf(glite_jp_is_conf *conf) if (conf->attrs) for (i = 0; conf->attrs[i]; i++) free(conf->attrs[i]); if (conf->indexed_attrs) for (i = 0; conf->indexed_attrs[i]; i++) free(conf->indexed_attrs[i]); - if (conf->singleval_attrs) for (i = 0; conf->singleval_attrs[i]; i++) free(conf->singleval_attrs[i]); - if (conf->plugins) for (i = 0; conf->plugins[i]; i++) free(conf->plugins[i]); + if (conf->multival_attrs) for (i = 0; conf->multival_attrs[i]; i++) free(conf->multival_attrs[i]); + if (conf->queriable_attrs) for (i = 0; conf->queriable_attrs[i]; i++) free(conf->queriable_attrs[i]); if (conf->feeds) for (i = 0; conf->feeds[i]; i++) { feed = conf->feeds[i]; free(feed->PS_URL); @@ -145,7 +145,8 @@ void glite_jp_free_conf(glite_jp_is_conf *conf) } free(conf->attrs); free(conf->indexed_attrs); - free(conf->singleval_attrs); + free(conf->multival_attrs); + free(conf->queriable_attrs); free(conf->plugins); free(conf->feeds); free(conf); @@ -194,8 +195,24 @@ static int read_conf(glite_jp_is_conf *conf, char *conf_file) if (out.__sizeattrs) { conf->attrs = calloc(out.__sizeattrs + 1, sizeof(*conf->attrs)); + conf->multival_attrs = calloc(1, sizeof(*conf->multival_attrs)); + conf->queriable_attrs = calloc(1, sizeof(*conf->queriable_attrs)); + int mva = 0; + int qa = 0; for (i=0; i < out.__sizeattrs; i++) { - conf->attrs[i] = strdup(out.attrs[i]); + struct jptype__attrType *attr; + attr = GLITE_SECURITY_GSOAP_LIST_GET(out.attrs, i); + conf->attrs[i] = strdup(attr->name); + if (attr->multival == jptype__yesNo__YES){ + conf->multival_attrs = realloc(conf->multival_attrs, (mva+2)*sizeof(*conf->multival_attrs)); + conf->multival_attrs[mva] = strdup(attr->name); + conf->multival_attrs[++mva] = NULL; + } + if (attr->queriable == jptype__yesNo__YES){ + conf->queriable_attrs = realloc(conf->queriable_attrs, (qa+2)*sizeof(*conf->queriable_attrs)); + conf->queriable_attrs[qa] = strdup(attr->name); + conf->queriable_attrs[++qa] = NULL; + } } } if (out.__sizeindexedAttrs) { @@ -204,11 +221,6 @@ static int read_conf(glite_jp_is_conf *conf, char *conf_file) conf->indexed_attrs[i] = strdup(out.indexedAttrs[i]); } } - if (out.__sizesinglevalAttrs){ - conf->singleval_attrs = calloc(out.__sizesinglevalAttrs + 1, sizeof(*conf->singleval_attrs)); - for (i = 0; i < out.__sizesinglevalAttrs; i++) - conf->singleval_attrs[i] = strdup(out.singlevalAttrs[i]); - } if (out.__sizeplugins) { conf->plugins = calloc(out.__sizeplugins + 1, sizeof(*conf->plugins)); for (i=0; i < out.__sizeplugins; i++) { diff --git a/org.glite.jp.index/src/conf.h b/org.glite.jp.index/src/conf.h index 5264a92..d5ec255 100644 --- a/org.glite.jp.index/src/conf.h +++ b/org.glite.jp.index/src/conf.h @@ -36,7 +36,8 @@ typedef struct _glite_jp_is_conf { // arrays are zero-terminated char **attrs; // atributes to obtain char **indexed_attrs; // list of indexed atributes - char **singleval_attrs; // list of single value attributes + char **multival_attrs; // list of multivalue attributes + char **queriable_attrs; // list of queriable attributes char **plugins; // list of plugin.so's glite_jp_is_feed **feeds; // null terminated list of feeds diff --git a/org.glite.jp.index/src/db_ops.c b/org.glite.jp.index/src/db_ops.c index b4231f5..e5db901 100644 --- a/org.glite.jp.index/src/db_ops.c +++ b/org.glite.jp.index/src/db_ops.c @@ -80,29 +80,29 @@ static int glite_jpis_db_queries_deserialize(glite_jp_query_rec_t **queries, void *blob, size_t blob_size) UNUSED; - -static int is_indexed(glite_jp_is_conf *conf, const char *attr) { +static int find_attr(char **attrs, const char *attr){ size_t i; - i = 0; - while (conf->indexed_attrs[i]) { - if (strcasecmp(attr, conf->indexed_attrs[i]) == 0) return 1; - i++; - } - return 0; -} - -static int is_singleval(glite_jp_is_conf *conf, const char *attr) { - size_t i; - i = 0; - if (conf->singleval_attrs) while (conf->singleval_attrs[i]) { - if (strcasecmp(attr, conf->singleval_attrs[i]) == 0) return 1; + while (attrs[i]) { + if (strcasecmp(attr, attrs[i]) == 0) return 1; i++; } return 0; } +static int is_indexed(glite_jp_is_conf *conf, const char *attr) { + return find_attr(conf->indexed_attrs, attr); +} + +static int is_singleval(glite_jp_is_conf *conf, const char *attr) { + return !find_attr(conf->multival_attrs, attr); +} + +static int is_queriable(glite_jp_is_conf *conf, const char *attr){ + return find_attr(conf->queriable_attrs, attr); +} + static size_t db_arg1_length(glite_jpis_context_t isctx, glite_jp_query_rec_t *query) { size_t len; @@ -398,12 +398,19 @@ int glite_jpis_initDatabase(glite_jpis_context_t ctx) { // create jobs table snprintf(sql, sizeof(sql) - 1, SQLCMD_CREATE_JOBS_TABLE_BEGIN); - if (ctx->conf->singleval_attrs) for (i = 0; ctx->conf->singleval_attrs[i]; i++) - snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), - " `attr_%s` %s NOT NULL,\n index (attr_%s),\n", - glite_jp_indexdb_attr2id(ctx->conf->singleval_attrs[i]), - glite_jp_attrval_db_type_index(jpctx, ctx->conf->singleval_attrs[i], INDEX_LENGTH), - glite_jp_indexdb_attr2id(ctx->conf->singleval_attrs[i])); + if (ctx->conf->attrs) for (i = 0; ctx->conf->attrs[i]; i++) + if (is_singleval(ctx->conf, ctx->conf->attrs[i]) + && is_queriable(ctx->conf, ctx->conf->attrs[i])){ + snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), + " `attr_%s` %s NOT NULL,\n", + glite_jp_indexdb_attr2id(ctx->conf->attrs[i]), + glite_jp_attrval_db_type_index(jpctx, ctx->conf->attrs[i], INDEX_LENGTH)); + + if (is_indexed(ctx->conf, ctx->conf->attrs[i])) + snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), + " index (attr_%s), \n", + glite_jp_indexdb_attr2id(ctx->conf->attrs[i])); + } snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), SQLCMD_CREATE_JOBS_TABLE_END); llprintf(LOG_SQL, "sql=%s\n", sql); if ((glite_jp_db_ExecSQL(jpctx, sql, NULL)) == -1) { @@ -693,7 +700,7 @@ int glite_jpis_insertAttrVal(glite_jpis_context_t ctx, const char *jobid, glite_ } free(sql); sql=NULL; - if (is_singleval(ctx->conf, av->name)){ + if (is_singleval(ctx->conf, av->name) && is_queriable(ctx->conf, av->name)){ trio_asprintf(&sql, SQL_CMD_INSERT_SINGLEATTRVAL, glite_jp_indexdb_attr2id(av->name), value, jobid); llprintf(LOG_SQL, "(%s) sql=%s\n", av->name, sql); -- 1.8.2.3