aboutsummaryrefslogtreecommitdiff
path: root/src/libndb/ndbgetval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libndb/ndbgetval.c')
-rw-r--r--src/libndb/ndbgetval.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/libndb/ndbgetval.c b/src/libndb/ndbgetval.c
new file mode 100644
index 00000000..2c66b206
--- /dev/null
+++ b/src/libndb/ndbgetval.c
@@ -0,0 +1,75 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "ndb.h"
+
+/*
+ * search for a tuple that has the given 'attr=val' and also 'rattr=x'.
+ * copy 'x' into 'buf' and return the whole tuple.
+ *
+ * return 0 if not found.
+ */
+char*
+ndbgetvalue(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, Ndbtuple **pp)
+{
+ Ndbtuple *t, *nt;
+ char *rv;
+ Ndbs temps;
+
+ if(s == nil)
+ s = &temps;
+ if(pp)
+ *pp = nil;
+ t = ndbsearch(db, s, attr, val);
+ while(t){
+ /* first look on same line (closer binding) */
+ nt = s->t;
+ for(;;){
+ if(strcmp(rattr, nt->attr) == 0){
+ rv = strdup(nt->val);
+ if(pp != nil)
+ *pp = t;
+ else
+ ndbfree(t);
+ return rv;
+ }
+ nt = nt->line;
+ if(nt == s->t)
+ break;
+ }
+ /* search whole tuple */
+ for(nt = t; nt; nt = nt->entry){
+ if(strcmp(rattr, nt->attr) == 0){
+ rv = strdup(nt->val);
+ if(pp != nil)
+ *pp = t;
+ else
+ ndbfree(t);
+ return rv;
+ }
+ }
+ ndbfree(t);
+ t = ndbsnext(s, attr, val);
+ }
+ return nil;
+}
+
+Ndbtuple*
+ndbgetval(Ndb *db, Ndbs *s, char *attr, char *val, char *rattr, char *buf)
+{
+ Ndbtuple *t;
+ char *p;
+
+ p = ndbgetvalue(db, s, attr, val, rattr, &t);
+ if(p == nil){
+ if(buf != nil)
+ *buf = 0;
+ } else {
+ if(buf != nil){
+ strncpy(buf, p, Ndbvlen-1);
+ buf[Ndbvlen-1] = 0;
+ }
+ free(p);
+ }
+ return t;
+}