xref: /plan9/sys/src/libndb/ndbgetval.c (revision 1a4050f5b2ddf426a278e3233ccd7b6bcb0639b8)
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