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);
}
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);
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) {
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++) {
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;
// 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) {
}
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);