Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 *  search the network database for matches
3
 */
4
#include <u.h>
5
#include <libc.h>
6
#include <bio.h>
7
#include <ndb.h>
8
 
9
static int all, multiple;
10
static Biobuf bout;
11
 
12
void
13
usage(void)
14
{
15
	fprint(2, "usage: query [-am] [-f ndbfile] attr value "
16
		"[returned-attr [reps]]\n");
17
	exits("usage");
18
}
19
 
20
/* print values of nt's attributes matching rattr */
21
static void
22
prmatch(Ndbtuple *nt, char *rattr)
23
{
24
	for(; nt; nt = nt->entry)
25
		if (strcmp(nt->attr, rattr) == 0)
26
			Bprint(&bout, "%s\n", nt->val);
27
}
28
 
29
void
30
search(Ndb *db, char *attr, char *val, char *rattr)
31
{
32
	char *p;
33
	Ndbs s;
34
	Ndbtuple *t, *nt;
35
 
36
	/* first entry with a matching rattr */
37
	if(rattr && !all){
38
		p = ndbgetvalue(db, &s, attr, val, rattr, &t);
39
		if (multiple)
40
			prmatch(t, rattr);
41
		else if(p)
42
			Bprint(&bout, "%s\n", p);
43
		ndbfree(t);
44
		free(p);
45
		return;
46
	}
47
 
48
	/* all entries with matching rattrs */
49
	if(rattr) {
50
		for(t = ndbsearch(db, &s, attr, val); t != nil;
51
		    t = ndbsnext(&s, attr, val)){
52
			prmatch(t, rattr);
53
			ndbfree(t);
54
		}
55
		return;
56
	}
57
 
58
	/* all entries */
59
	for(t = ndbsearch(db, &s, attr, val); t; t = ndbsnext(&s, attr, val)){
60
		for(nt = t; nt; nt = nt->entry)
61
			Bprint(&bout, "%s=%s ", nt->attr, nt->val);
62
		Bprint(&bout, "\n");
63
		ndbfree(t);
64
	}
65
}
66
 
67
void
68
main(int argc, char **argv)
69
{
70
	int reps = 1;
71
	char *rattr = nil, *dbfile = nil;
72
	Ndb *db;
73
 
74
	ARGBEGIN{
75
	case 'a':
76
		all++;
77
		break;
78
	case 'm':
79
		multiple++;
80
		break;
81
	case 'f':
82
		dbfile = EARGF(usage());
83
		break;
84
	default:
85
		usage();
86
	}ARGEND;
87
 
88
	switch(argc){
89
	case 4:
90
		reps = atoi(argv[3]);	/* wtf use is this? */
91
		/* fall through */
92
	case 3:
93
		rattr = argv[2];
94
		break;
95
	case 2:
96
		rattr = nil;
97
		break;
98
	default:
99
		usage();
100
	}
101
 
102
	if(Binit(&bout, 1, OWRITE) == -1)
103
		sysfatal("Binit: %r");
104
	db = ndbopen(dbfile);
105
	if(db == nil){
106
		fprint(2, "%s: no db files\n", argv0);
107
		exits("no db");
108
	}
109
	while(reps--)
110
		search(db, argv[0], argv[1], rattr);
111
	ndbclose(db);
112
 
113
	exits(0);
114
}