aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ndb/ndbquery.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-02-11 19:41:16 +0000
committerrsc <devnull@localhost>2005-02-11 19:41:16 +0000
commitd957951b75df08a9bb0293e3e13ff87759afbb92 (patch)
tree4d7868b0d223956217cbc8819d7afb3bec532cca /src/cmd/ndb/ndbquery.c
parentad017cfbf5530cfc3ae2fafd723cdade2a4405f6 (diff)
downloadplan9port-d957951b75df08a9bb0293e3e13ff87759afbb92.tar.gz
plan9port-d957951b75df08a9bb0293e3e13ff87759afbb92.tar.bz2
plan9port-d957951b75df08a9bb0293e3e13ff87759afbb92.zip
new
Diffstat (limited to 'src/cmd/ndb/ndbquery.c')
-rw-r--r--src/cmd/ndb/ndbquery.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/cmd/ndb/ndbquery.c b/src/cmd/ndb/ndbquery.c
new file mode 100644
index 00000000..65bc0472
--- /dev/null
+++ b/src/cmd/ndb/ndbquery.c
@@ -0,0 +1,81 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <ndb.h>
+
+/*
+ * search the database for matches
+ */
+void
+usage(void)
+{
+ fprint(2, "usage: query attr value [returned attribute]\n");
+ exits("usage");
+}
+
+void
+search(Ndb *db, char *attr, char *val, char *rattr)
+{
+ Ndbs s;
+ Ndbtuple *t;
+ Ndbtuple *nt;
+ char *p;
+
+ if(rattr){
+ p = ndbgetvalue(db, &s, attr, val, rattr, nil);
+ if(p){
+ print("%s\n", p);
+ free(p);
+ }
+ return;
+ }
+
+ t = ndbsearch(db, &s, attr, val);
+ while(t){
+ for(nt = t; nt; nt = nt->entry)
+ print("%s=%s ", nt->attr, nt->val);
+ print("\n");
+ ndbfree(t);
+ t = ndbsnext(&s, attr, val);
+ }
+}
+
+void
+main(int argc, char **argv)
+{
+ char *rattr = 0;
+ Ndb *db;
+ char *dbfile = 0;
+ int reps = 1;
+
+ ARGBEGIN{
+ case 'f':
+ dbfile = ARGF();
+ break;
+ }ARGEND;
+
+ switch(argc){
+ case 4:
+ reps = atoi(argv[3]);
+ /* fall through */
+ case 3:
+ rattr = argv[2];
+ break;
+ case 2:
+ rattr = 0;
+ break;
+ default:
+ usage();
+ }
+
+ db = ndbopen(dbfile);
+ if(db == 0){
+ fprint(2, "no db files\n");
+ exits("no db");
+ }
+ while(reps--)
+ search(db, argv[0], argv[1], rattr);
+ ndbclose(db);
+
+ exits(0);
+}