diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/libndb/ndbgetval.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libndb/ndbgetval.c')
-rwxr-xr-x | sys/src/libndb/ndbgetval.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/sys/src/libndb/ndbgetval.c b/sys/src/libndb/ndbgetval.c new file mode 100755 index 000000000..e5d3bf1b9 --- /dev/null +++ b/sys/src/libndb/ndbgetval.c @@ -0,0 +1,76 @@ +#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); + } + ndbsetmalloctag(t, getcallerpc(&db)); + return t; +} |