diff options
Diffstat (limited to 'src/libndb/ndbgetval.c')
-rw-r--r-- | src/libndb/ndbgetval.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/libndb/ndbgetval.c b/src/libndb/ndbgetval.c new file mode 100644 index 00000000..2c66b206 --- /dev/null +++ b/src/libndb/ndbgetval.c @@ -0,0 +1,75 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include "ndb.h" + +/* + * search for a tuple that has the given 'attr=val' and also 'rattr=x'. + * copy 'x' into 'buf' and return the whole tuple. + * + * return 0 if not found. + */ +char* +ndbgetvalue(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, Ndbtuple **pp) +{ + Ndbtuple *t, *nt; + char *rv; + Ndbs temps; + + if(s == nil) + s = &temps; + if(pp) + *pp = nil; + t = ndbsearch(db, s, attr, val); + while(t){ + /* first look on same line (closer binding) */ + nt = s->t; + for(;;){ + if(strcmp(rattr, nt->attr) == 0){ + rv = strdup(nt->val); + if(pp != nil) + *pp = t; + else + ndbfree(t); + return rv; + } + nt = nt->line; + if(nt == s->t) + break; + } + /* search whole tuple */ + for(nt = t; nt; nt = nt->entry){ + if(strcmp(rattr, nt->attr) == 0){ + rv = strdup(nt->val); + if(pp != nil) + *pp = t; + else + ndbfree(t); + return rv; + } + } + ndbfree(t); + t = ndbsnext(s, attr, val); + } + return nil; +} + +Ndbtuple* +ndbgetval(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, char *buf) +{ + Ndbtuple *t; + char *p; + + p = ndbgetvalue(db, s, attr, val, rattr, &t); + if(p == nil){ + if(buf != nil) + *buf = 0; + } else { + if(buf != nil){ + strncpy(buf, p, Ndbvlen-1); + buf[Ndbvlen-1] = 0; + } + free(p); + } + return t; +} |