From bbf662fc94fbb75874db7a453def89a8277facb4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ale=C5=A1=20K=C5=99enek?= Date: Wed, 17 Aug 2005 09:53:04 +0000 Subject: [PATCH] rough implementation of attribute retrieval via plugins --- org.glite.jp.primary/src/attrs.c | 157 ++++++++++++++++++++++++++++- org.glite.jp.primary/src/attrs.h | 2 +- org.glite.jp.primary/src/backend.h | 5 + org.glite.jp.primary/src/new_ftp_backend.c | 11 ++ 4 files changed, 172 insertions(+), 3 deletions(-) diff --git a/org.glite.jp.primary/src/attrs.c b/org.glite.jp.primary/src/attrs.c index 6316de2..629f9b6 100644 --- a/org.glite.jp.primary/src/attrs.c +++ b/org.glite.jp.primary/src/attrs.c @@ -1,8 +1,161 @@ #include +#include +#include +#include + #include "glite/jp/types.h" +#include "glite/jp/attr.h" + #include "attrs.h" +#include "file_plugin.h" + +static struct { + char *class,*uri; + glite_jpps_fplug_data_t **plugins; + int nplugins; +} *known_classes; + -glite_jpps_get_attrs(glite_jp_context_t ctx,const char *job,char const *const attr,int nattr,glite_jp_attrval_t **attrs_out) +static void scan_classes(glite_jp_context_t ctx) { - return ENOSYS; + int i,j,k; + glite_jpps_fplug_data_t *pd; + + if (!ctx->plugins) return; + for (i=0; ctx->plugins[i]; i++) { + pd = ctx->plugins[i]; + + for (j=0; pd->classes[j]; j++) { + for (k=0; known_classes && known_classes[k].class + && strcmp(pd->classes[j],known_classes[k].class); + k++); + if (known_classes[k].class) { + known_classes[k].plugins = realloc(known_classes[k].plugins, + (known_classes[k].nplugins + 2) * sizeof(glite_jpps_fplug_data_t *)); + known_classes[k].plugins[known_classes[k].nplugins++] = pd; + known_classes[k].plugins[known_classes[k].nplugins] = NULL; + } + else { + known_classes = realloc(known_classes,(k+2) * sizeof *known_classes); + known_classes[k].class = pd->classes[j]; + known_classes[k].uri = pd->uris[j]; + known_classes[k].plugins = malloc(2 * sizeof(glite_jpps_fplug_data_t *)); + known_classes[k].plugins[0] = pd; + known_classes[k].plugins[1] = NULL; + known_classes[k].nplugins = 1; + } + } + } +} + +static int merge_attrvals(glite_jp_attrval_t **out,int nout,const glite_jp_attrval_t *in) +{ + int nin; + + if (!in) return nout; + + for (nin=0; in[nin].name; nin++); + *out = realloc(*out,(nout+nin+1) * sizeof **out); + memcpy(*out + nout,in,(nin+1) * sizeof **out); + return nout+nin; +} + +glite_jpps_get_attrs(glite_jp_context_t ctx,const char *job,char const *const *attr,int nattr,glite_jp_attrval_t **attrs_out) +{ + glite_jp_attrval_t *meta = NULL,*out = NULL; + char const **other = NULL; + int i,j,nmeta,nother,err = 0,nout = 0; + + struct { int class_idx; + char *name; + } *files = NULL; + int nfiles = 0; + + nmeta = nother = 0; + +/* sort the queried attributes to backend metadata and others -- retrived by plugins + * XXX: assumes unique values for metadata. + */ + for (i=0; iops.open(p->fpctx,beh,known_classes[ci].uri,&ph)) { + + for (j=0; jops.attr(p->fpctx,ph,other[j],&myattr)) { + nout = merge_attrvals(&out,nout,myattr); + free(myattr); + } + } + p->ops.close(p->fpctx,ph); + } + } + + glite_jppsbe_close_file(ctx,beh); + } + } + + nout = merge_attrvals(&out,nout,meta); + free(meta); meta = NULL; + + *attrs_out = out; + err = 0; + +cleanup: + if (meta) for (i=0; i #include "glite/jp/types.h" +#include "glite/jp/attr.h" #include "glite/jp/context.h" #include "glite/jp/strmd5.h" @@ -1782,6 +1783,16 @@ int glite_jppsbe_query( #endif + +int glite_jppsbe_is_metadata(glite_jp_context_t ctx,const char *attr) +{ + /* XXX: should be more */ + if (!strcmp(attr,GLITE_JP_ATTR_OWNER)) return 1; + + return 0; +} + + /* XXX: - no primary authorization yet - no concurrency control yet -- 1.8.2.3