Partially implemented new configuration (queriable single values are placed in jobs...
authorJiří Filipovič <fila@ics.muni.cz>
Fri, 30 May 2008 09:23:59 +0000 (09:23 +0000)
committerJiří Filipovič <fila@ics.muni.cz>
Fri, 30 May 2008 09:23:59 +0000 (09:23 +0000)
org.glite.jp.index/src/conf.c
org.glite.jp.index/src/conf.h
org.glite.jp.index/src/db_ops.c

index 11cb55d..56fb2bc 100644 (file)
@@ -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++) {
index 5264a92..d5ec255 100644 (file)
@@ -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
index b4231f5..e5db901 100644 (file)
 
 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);