xref: /plan9/sys/src/libndb/ndbgetval.c (revision 1a4050f5b2ddf426a278e3233ccd7b6bcb0639b8)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include "ndb.h"
5 
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*
ndbgetvalue(Ndb * db,Ndbs * s,char * attr,char * val,char * rattr,Ndbtuple ** pp)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;
18 
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 				else
33 					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 				else
47 					ndbfree(t);
48 				return rv;
49 			}
50 		}
51 		ndbfree(t);
52 		t = ndbsnext(s, attr, val);
53 	}
54 	return nil;
55 }
56 
57 Ndbtuple*
ndbgetval(Ndb * db,Ndbs * s,char * attr,char * val,char * rattr,char * buf)58 ndbgetval(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, char *buf)
59 {
60 	Ndbtuple *t;
61 	char *p;
62 
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 	ndbsetmalloctag(t, getcallerpc(&db));
75 	return t;
76 }
77