| #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; |
| } |