Blame


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