plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

sdbjoin.c (883B)


      1 #include "std.h"
      2 
      3 static char *file[2];
      4 
      5 static void
      6 usage(void)
      7 {
      8 	fprint(2, "sdbjoin: [-f file0] file1 [attr [val]]...\n");
      9 	exits("usage");
     10 }
     11 
     12 void
     13 main(int argc, char *argv[])
     14 {
     15 	Sdb db[2];
     16 	Sdbr r, *sr;
     17 	ulong i;
     18 
     19 	ARGBEGIN {
     20 	case 'f':
     21 		file[0] = EARGF(usage());
     22 		break;
     23 	default:
     24 		usage();
     25 	} ARGEND;
     26 	if (argc < 1)
     27 		usage();
     28 	file[1] = *argv;
     29 	sdbr_init(&r);
     30 	sdbr_add(&r, Str(""), Str(""));
     31 	sdbr_arg2r(&r, &argv[1]);
     32 	sdb_open(&db[0], file[0]);
     33 	sdb_open(&db[1], file[1]);
     34 	for (;sdb_next(&db[0]);) {
     35 		sr = db[0].r + db[0].n;
     36 		Strinsert(&r.attr[0], sr->attr[0], 0);
     37 		Strinsert(&r.val[0], sr->val[0], 0);
     38 		for (;sdb_query(&db[1], r);) {
     39 			vsdbr_join(&db[0].r, db[1].r[db[1].n]);
     40 			if (!sdb_next(&db[1]))
     41 				break;
     42 		}
     43 		Strzero(&r.attr[0]);
     44 		Strzero(&r.val[0]);
     45 		sdb_rewind(&db[1]);
     46 	}
     47 	for (i = 0; i < sdb_n(db[0]); ++i)
     48 		sdbr_print(db[0].r[i]);
     49 	exits(0);
     50 }