URI:
       tndbgetval.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tndbgetval.c (1309B)
       ---
            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*
           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*
           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         return t;
           75 }