13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier #include "ndb.h"
53e12c5d1SDavid du Colombier
63e12c5d1SDavid du Colombier /*
73e12c5d1SDavid du Colombier * search for a tuple that has the given 'attr=val' and also 'rattr=x'.
83e12c5d1SDavid du Colombier * copy 'x' into 'buf' and return the whole tuple.
93e12c5d1SDavid du Colombier *
103e12c5d1SDavid du Colombier * return 0 if not found.
113e12c5d1SDavid du Colombier */
1257837e0bSDavid du Colombier char*
ndbgetvalue(Ndb * db,Ndbs * s,char * attr,char * val,char * rattr,Ndbtuple ** pp)1357837e0bSDavid du Colombier ndbgetvalue(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, Ndbtuple **pp)
143e12c5d1SDavid du Colombier {
153e12c5d1SDavid du Colombier Ndbtuple *t, *nt;
1657837e0bSDavid du Colombier char *rv;
1757837e0bSDavid du Colombier Ndbs temps;
183e12c5d1SDavid du Colombier
1957837e0bSDavid du Colombier if(s == nil)
2057837e0bSDavid du Colombier s = &temps;
2157837e0bSDavid du Colombier if(pp)
2257837e0bSDavid du Colombier *pp = nil;
233e12c5d1SDavid du Colombier t = ndbsearch(db, s, attr, val);
243e12c5d1SDavid du Colombier while(t){
253e12c5d1SDavid du Colombier /* first look on same line (closer binding) */
263e12c5d1SDavid du Colombier nt = s->t;
273e12c5d1SDavid du Colombier for(;;){
283e12c5d1SDavid du Colombier if(strcmp(rattr, nt->attr) == 0){
2957837e0bSDavid du Colombier rv = strdup(nt->val);
3057837e0bSDavid du Colombier if(pp != nil)
3157837e0bSDavid du Colombier *pp = t;
3257837e0bSDavid du Colombier else
3357837e0bSDavid du Colombier ndbfree(t);
3457837e0bSDavid du Colombier return rv;
353e12c5d1SDavid du Colombier }
363e12c5d1SDavid du Colombier nt = nt->line;
373e12c5d1SDavid du Colombier if(nt == s->t)
383e12c5d1SDavid du Colombier break;
393e12c5d1SDavid du Colombier }
403e12c5d1SDavid du Colombier /* search whole tuple */
4157837e0bSDavid du Colombier for(nt = t; nt; nt = nt->entry){
423e12c5d1SDavid du Colombier if(strcmp(rattr, nt->attr) == 0){
4357837e0bSDavid du Colombier rv = strdup(nt->val);
4457837e0bSDavid du Colombier if(pp != nil)
4557837e0bSDavid du Colombier *pp = t;
4657837e0bSDavid du Colombier else
4757837e0bSDavid du Colombier ndbfree(t);
4857837e0bSDavid du Colombier return rv;
4957837e0bSDavid du Colombier }
503e12c5d1SDavid du Colombier }
513e12c5d1SDavid du Colombier ndbfree(t);
523e12c5d1SDavid du Colombier t = ndbsnext(s, attr, val);
533e12c5d1SDavid du Colombier }
5457837e0bSDavid du Colombier return nil;
553e12c5d1SDavid du Colombier }
5695a264b3SDavid du Colombier
5795a264b3SDavid du Colombier Ndbtuple*
ndbgetval(Ndb * db,Ndbs * s,char * attr,char * val,char * rattr,char * buf)5895a264b3SDavid du Colombier ndbgetval(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, char *buf)
5995a264b3SDavid du Colombier {
6057837e0bSDavid du Colombier Ndbtuple *t;
6157837e0bSDavid du Colombier char *p;
6257837e0bSDavid du Colombier
6357837e0bSDavid du Colombier p = ndbgetvalue(db, s, attr, val, rattr, &t);
6457837e0bSDavid du Colombier if(p == nil){
6557837e0bSDavid du Colombier if(buf != nil)
6657837e0bSDavid du Colombier *buf = 0;
6757837e0bSDavid du Colombier } else {
6857837e0bSDavid du Colombier if(buf != nil){
6957837e0bSDavid du Colombier strncpy(buf, p, Ndbvlen-1);
7057837e0bSDavid du Colombier buf[Ndbvlen-1] = 0;
7157837e0bSDavid du Colombier }
7257837e0bSDavid du Colombier free(p);
7357837e0bSDavid du Colombier }
74*1a4050f5SDavid du Colombier ndbsetmalloctag(t, getcallerpc(&db));
7557837e0bSDavid du Colombier return t;
7695a264b3SDavid du Colombier }
77