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 }