Single value attributes.
authorJiří Filipovič <fila@ics.muni.cz>
Fri, 23 May 2008 15:06:13 +0000 (15:06 +0000)
committerJiří Filipovič <fila@ics.muni.cz>
Fri, 23 May 2008 15:06:13 +0000 (15:06 +0000)
org.glite.jp.index/Makefile
org.glite.jp.index/config/glite-jp-index-dbsetup.sql
org.glite.jp.index/src/conf.c
org.glite.jp.index/src/conf.h
org.glite.jp.index/src/db_ops.c

index f04ad8c..b812b25 100644 (file)
@@ -53,7 +53,7 @@ ps_prefix:=${ws_prefix}
 
 SRCS:= conf.c bones_server.c soap_ops.c soap_ps_calls.c common.c \
        ${is_prefix}Server.c ${ps_prefix}Client.c ${ws_prefix}C.c \
-       ws_ps_typeref.c ws_is_typeref.c db_ops.c context.c
+       ws_ps_typeref.c ws_is_typeref.c db_ops.c context.c type_plugin.c
 
 EXA_TEST_SRCS:=jpis-test.c ${is_prefix}Client.c ${is_prefix}C.c context.c db_ops.c conf.c ws_is_typeref.c common.c
 EXA_DB_SRCS:=jpis-db-internal.c db_ops.c conf.c context.c ws_is_typeref.c common.c
index 0985239..34e7565 100644 (file)
@@ -9,7 +9,7 @@ create table jobs (
        unique (dg_jobid),
        index (jobid),
        index (dg_jobid)
-) engine=innodb;
+) character set utf8 collate utf8_bin engine=innodb;
 
 create table attrs (
        `attrid`                char(32)        binary not null,
@@ -20,7 +20,7 @@ create table attrs (
        primary key (attrid),
        index (attrid),
        index (name)
-) engine=innodb;
+) character set utf8 collate utf8_bin engine=innodb;
 
 create table feeds (
        `uniqueid`      int             auto_increment not null,
@@ -35,7 +35,7 @@ create table feeds (
         index (uniqueid),
         index (feedid),
        index (state)
-) engine=innodb;
+) character set utf8 collate utf8_bin engine=innodb;
 
 create table acls (
        `aclid`           char(32)        binary not null,
@@ -43,7 +43,7 @@ create table acls (
        `refcnt`          int             not null,
 
         primary key (aclid)
-) engine=innodb;
+) character set utf8 collate utf8_bin engine=innodb;
 
 create table users (
        `userid`          char(32)        binary not null,
@@ -51,7 +51,7 @@ create table users (
 
         primary key (userid),
         unique (cert_subj)
-) engine=innodb;
+) character set utf8 collate utf8_bin engine=innodb;
 
 # data tables - created one for each configured and indexed attribute,
 # in future values of the non-indexed attributes will be stored in attr_values
@@ -64,7 +64,7 @@ create table users (
 #
 #        index (jobid),
 #        index (value)
-#) engine=innodb;
+#) character set utf8 collate utf8_bin engine=innodb;
 
 
 # ---- future schema improvements ----
@@ -81,7 +81,7 @@ create table users (
 #      index (jobid),
 #      index (attrid),
 #      index (value)
-#) engine=innodb;
+#) character set utf8 collate utf8_bin engine=innodb;
 
 #create table attr_multivalues (
 #      `jobid`           char(32),
@@ -93,4 +93,4 @@ create table users (
 #      index (jobid),
 #      index (attrid)
 #      index (value)
-#) engine=innodb;
+#) character set utf8 collate utf8_bin engine=innodb;
index f1cbacb..11cb55d 100644 (file)
@@ -134,6 +134,7 @@ 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->feeds) for (i = 0; conf->feeds[i]; i++) {
                feed = conf->feeds[i];
@@ -144,6 +145,7 @@ void glite_jp_free_conf(glite_jp_is_conf *conf)
        }
        free(conf->attrs);
        free(conf->indexed_attrs);
+       free(conf->singleval_attrs);
        free(conf->plugins);
        free(conf->feeds);
        free(conf);
@@ -202,6 +204,11 @@ 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 4cd6060..5264a92 100644 (file)
@@ -36,6 +36,7 @@ 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    **plugins;              // list of plugin.so's
 
        glite_jp_is_feed        **feeds;        // null terminated list of feeds
index 99e520f..a9879b9 100644 (file)
         INDEX (jobid),\n\
         INDEX (value)\n\
 ) CHARACTER SET utf8 COLLATE utf8_bin ENGINE=innodb;"
+
+#define SQLCMD_CREATE_JOBS_TABLE_BEGIN "CREATE TABLE jobs (\n\
+       `jobid`         char(32)        NOT NULL,\n\
+        `dg_jobid`        varchar(255)    NOT NULL,\n\
+        `ownerid`         char(32)        NOT NULL,\n\
+        `aclid`           char(32)        NOT NULL,\n\
+        `ps`            varchar(255)    NOT NULL,\n"
+#define SQLCMD_CREATE_JOBS_TABLE_END "\
+       primary key (jobid),\n\
+        unique (dg_jobid),\n\
+        index (jobid),\n\
+        index (dg_jobid)\n\
+) character set utf8 collate utf8_bin engine=innodb;"
+
 #define SQLCMD_INSERT_ATTRVAL "INSERT INTO " GLITE_JP_INDEXDB_TABLE_ATTR_PREFIX "%|Ss (jobid, value, full_value, origin) VALUES (\n\
        '%|Ss',\n\
        '%|Ss',\n\
        '%|Ss',\n\
        '%ld'\n\
 )"
+#define SQL_CMD_INSERT_SINGLEATTRVAL "UPDATE jobs \n\
+       SET %s='%s' \n\
+       WHERE dg_jobid='%s'"
 #define INDEX_LENGTH 255
 
 #define WORD_SWAP(X) ((((X) >> 8) & 0xFF) | (((X) & 0xFF) << 8))
@@ -75,6 +92,22 @@ static int is_indexed(glite_jp_is_conf *conf, const char *attr) {
        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;
+                i++;
+        }
+        return 0;
+}
+
+static char *get_simple_name(char *attr){
+       char *p = strrchr(attr, ':');
+       if (p) return p+1;
+       else return attr;
+}
 
 static size_t db_arg1_length(glite_jpis_context_t isctx, glite_jp_query_rec_t *query) {
        size_t len;
@@ -369,6 +402,21 @@ int glite_jpis_initDatabase(glite_jpis_context_t ctx) {
        }
        glite_jp_db_FreeStmt(&stmt);
 
+       // 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) - 1, 
+                       "       `%s`    %s      NOT NULL,\n     index (%s),\n",
+                       get_simple_name(ctx->conf->singleval_attrs[i]),
+                       glite_jp_attrval_db_type_full(jpctx, ctx->conf->singleval_attrs[i]),
+                       get_simple_name(ctx->conf->singleval_attrs[i]));
+       snprintf(sql + strlen(sql), sizeof(sql) - 1, SQLCMD_CREATE_JOBS_TABLE_END);
+       llprintf(LOG_SQL, "sql=%s\n", sql);
+       if ((glite_jp_db_ExecSQL(jpctx, sql, NULL)) == -1) {
+                        glite_jpis_stack_error(ctx->jpctx, EAGAIN, "Cannot create table 'jobs'!");
+                        goto fail;
+                }
+
        return 0;
 
 fail_conds:
@@ -403,11 +451,13 @@ int glite_jpis_dropDatabase(glite_jpis_context_t ctx) {
        }
        if (ret != 0) goto fail;
        glite_jp_db_FreeStmt(&stmt_tabs);
+       snprintf(sql, sizeof(sql)-1, "DROP TABLE jobs");
+       llprintf(LOG_SQL, "dropping 'jobs'");
+       if (glite_jp_db_ExecSQL(jpctx, sql, NULL) == -1) printf("warning: can't drop table 'jobs'\n");
 
        // drop feeds and atributes
        if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM attrs", NULL) == -1) goto fail;
        if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM feeds", NULL) == -1) goto fail;
-       if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM jobs", NULL) == -1) goto fail;
        if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM users", NULL) == -1) goto fail;
        if (glite_jp_db_ExecSQL(jpctx, "DELETE FROM acls", NULL) == -1) goto fail;
 
@@ -627,6 +677,11 @@ int glite_jpis_destroyTryReconnectFeed(glite_jpis_context_t ctx, long int unique
 int glite_jpis_insertAttrVal(glite_jpis_context_t ctx, const char *jobid, glite_jp_attrval_t *av) {
        char *sql, *table, *value, *full_value, *md5_jobid;
        long int origin;
+       glite_jp_error_t err;
+
+       glite_jp_clear_error(ctx->jpctx);
+        memset(&err,0,sizeof err);
+        err.source = __FUNCTION__;
 
        table = glite_jp_indexdb_attr2id(av->name);
        value = glite_jp_attrval_to_db_index(ctx->jpctx, av, INDEX_LENGTH);
@@ -634,20 +689,39 @@ int glite_jpis_insertAttrVal(glite_jpis_context_t ctx, const char *jobid, glite_
        md5_jobid = str2md5(jobid);
        origin = av->origin;
        trio_asprintf(&sql, SQLCMD_INSERT_ATTRVAL, table, md5_jobid, value, full_value, origin);
-       free(md5_jobid);
-       free(table);
-       free(value);
-       free(full_value);
        llprintf(LOG_SQL, "(%s) sql=%s\n", av->name, sql);
 //     if (ctx->conf->feeding) printf("FEED: %s\n", sql);
 //     else
-       if (glite_jp_db_ExecSQL(ctx->jpctx, sql, NULL) != 1) {
-               free(sql);
-               return ctx->jpctx->error->code;
+       if (glite_jp_db_ExecSQL(ctx->jpctx, sql, NULL) != 1){ 
+               err.code = EIO;
+               err.desc = "DB access failed";
+               goto cleanup;
+       }
+       free(sql); sql=NULL;
+
+       if (is_singleval(ctx->conf, av->name)){
+               trio_asprintf(&sql, SQL_CMD_INSERT_SINGLEATTRVAL, 
+                       get_simple_name(av->name), value, jobid);
+               llprintf(LOG_SQL, "(%s) sql=%s\n", av->name, sql);
+               if (glite_jp_db_ExecSQL(ctx->jpctx, sql, NULL) != 1){
+                       err.code = EIO;
+                       err.desc = "DB access failed";
+                       goto cleanup;
+               }
+               free(sql);sql=NULL;
        }
-       free(sql);
 
-       return 0;
+cleanup:
+       free(md5_jobid);
+        free(table);
+        free(value);
+        free(full_value);
+
+       if (err.code) {
+                return glite_jpis_stack_error(ctx->jpctx, err.code, err.desc);
+        } else {
+                return 0;
+        }
 }