From fa79315e5f780b5d5d5b75bf0a44da3c39ee9903 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ji=C5=99=C3=AD=20Filipovi=C4=8D?= Date: Fri, 23 May 2008 15:06:13 +0000 Subject: [PATCH] Single value attributes. --- org.glite.jp.index/Makefile | 2 +- .../config/glite-jp-index-dbsetup.sql | 16 ++-- org.glite.jp.index/src/conf.c | 7 ++ org.glite.jp.index/src/conf.h | 1 + org.glite.jp.index/src/db_ops.c | 94 +++++++++++++++++++--- 5 files changed, 101 insertions(+), 19 deletions(-) diff --git a/org.glite.jp.index/Makefile b/org.glite.jp.index/Makefile index f04ad8c..b812b25 100644 --- a/org.glite.jp.index/Makefile +++ b/org.glite.jp.index/Makefile @@ -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 diff --git a/org.glite.jp.index/config/glite-jp-index-dbsetup.sql b/org.glite.jp.index/config/glite-jp-index-dbsetup.sql index 0985239..34e7565 100644 --- a/org.glite.jp.index/config/glite-jp-index-dbsetup.sql +++ b/org.glite.jp.index/config/glite-jp-index-dbsetup.sql @@ -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; diff --git a/org.glite.jp.index/src/conf.c b/org.glite.jp.index/src/conf.c index f1cbacb..11cb55d 100644 --- a/org.glite.jp.index/src/conf.c +++ b/org.glite.jp.index/src/conf.c @@ -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++) { diff --git a/org.glite.jp.index/src/conf.h b/org.glite.jp.index/src/conf.h index 4cd6060..5264a92 100644 --- a/org.glite.jp.index/src/conf.h +++ b/org.glite.jp.index/src/conf.h @@ -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 diff --git a/org.glite.jp.index/src/db_ops.c b/org.glite.jp.index/src/db_ops.c index 99e520f..a9879b9 100644 --- a/org.glite.jp.index/src/db_ops.c +++ b/org.glite.jp.index/src/db_ops.c @@ -42,12 +42,29 @@ 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; + } } -- 1.8.2.3