Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include "ndb.h"6 /*7 * search for a tuple that has the given 'attr=val' and also 'rattr=x'.8 * copy 'x' into 'buf' and return the whole tuple.9 *10 * return 0 if not found.11 */12 char*13 ndbgetvalue(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, Ndbtuple **pp)14 {15 Ndbtuple *t, *nt;16 char *rv;17 Ndbs temps;19 if(s == nil)20 s = &temps;21 if(pp)22 *pp = nil;23 t = ndbsearch(db, s, attr, val);24 while(t){25 /* first look on same line (closer binding) */26 nt = s->t;27 for(;;){28 if(strcmp(rattr, nt->attr) == 0){29 rv = strdup(nt->val);30 if(pp != nil)31 *pp = t;32 else33 ndbfree(t);34 return rv;35 }36 nt = nt->line;37 if(nt == s->t)38 break;39 }40 /* search whole tuple */41 for(nt = t; nt; nt = nt->entry){42 if(strcmp(rattr, nt->attr) == 0){43 rv = strdup(nt->val);44 if(pp != nil)45 *pp = t;46 else47 ndbfree(t);48 return rv;49 }50 }51 ndbfree(t);52 t = ndbsnext(s, attr, val);53 }54 return nil;55 }57 Ndbtuple*58 ndbgetval(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, char *buf)59 {60 Ndbtuple *t;61 char *p;63 p = ndbgetvalue(db, s, attr, val, rattr, &t);64 if(p == nil){65 if(buf != nil)66 *buf = 0;67 } else {68 if(buf != nil){69 strncpy(buf, p, Ndbvlen-1);70 buf[Ndbvlen-1] = 0;71 }72 free(p);73 }74 return t;75 }