X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/7ce1db3366b00d100225ce31e8d34586705d6cb8..d78749d85e240d8ae7d241fd7a7ed2dfc2f179c7:/gen/warehouse.pc diff --git a/gen/warehouse.pc b/gen/warehouse.pc index 4403037f..4f8c0a11 100644 --- a/gen/warehouse.pc +++ b/gen/warehouse.pc @@ -1,123 +1,161 @@ -/* $Header$ +/* $Id$ * * This generates a database extract from the users table for the MIT * Warehouse. * - * (c) Copyright 1992 by the Massachusetts Institute of Technology. - * For copying and distribution information, please see the file - * . + * Copyright (C) 1996-1998 by the Massachusetts Institute of Technology. + * For copying and distribution information, please see the file + * . */ #include -#include #include #include -#include -#include -#include -#include + #include -#include -#include -#include -#include +#include + #include +#include +#include +#include +#include +#include + +#include + +#include "util.h" + EXEC SQL INCLUDE sqlca; -extern int errno; -char *whoami = "sis.gen"; +RCSID("$Header$"); + +char *whoami = "warehouse.gen"; char *db = "moira/moira"; -main(argc, argv) -int argc; -char **argv; +#ifndef WAREHOUSE_SUBDIR +#define WAREHOUSE_SUBDIR "warehouse" +#endif + +char warehouse_dir[MAXPATHLEN]; + +int main(int argc, char **argv) { - int out = 1 /* stdout */; - char *outf = NULL, outft[64]; - struct stat sb; - int flag1; - SigInfo si; - struct timeval now; - EXEC SQL BEGIN DECLARE SECTION; - char login[9], sig[257], id[17], kname[257]; - EXEC SQL VAR sig IS STRING(257); - int timestamp, sigwho; - struct { char login[12]; - char id[12]; - char sig[256]; - } outrec; - EXEC SQL END DECLARE SECTION; - - initialize_sms_error_table (); - - EXEC SQL CONNECT :db; - - if (argc == 2) { - if (stat(argv[1], &sb) == 0) { - if (ModDiff (&flag1, "users", sb.st_mtime) == 0 && - flag1 < 0) { - fprintf(stderr, "File %s does not need to be rebuilt.\n", - argv[1]); - exit(MR_NO_CHANGE); - } - } - outf = argv[1]; - sprintf(outft, "%s~", outf); - if ((out = open(outft, O_WRONLY|O_APPEND|O_CREAT|O_TRUNC, 0666)) < 0) { - fprintf(stderr, "unable to open %s for output\n", outf); - exit(MR_OCONFIG); + int out = STDOUT_FILENO; + char *outf = NULL, outft[MAXPATHLEN]; + char control_fn[MAXPATHLEN], cmd[256]; + FILE *f; + int records = 0; + EXEC SQL BEGIN DECLARE SECTION; + char login[USERS_LOGIN_SIZE]; + char id[USERS_CLEARID_SIZE], kname[MAX_K_NAME_SZ]; + char fname[USERS_FIRST_SIZE], lname[USERS_LAST_SIZE]; + char middle[USERS_MIDDLE_SIZE]; + int timestamp; + struct { + char login[12]; + char id[12]; + char fname[20]; + char lname[20]; + char middle[20]; + char sig[256]; + } outrec; + EXEC SQL END DECLARE SECTION; + + initialize_sms_error_table(); + + sprintf(warehouse_dir, "%s/%s", DCM_DIR, WAREHOUSE_SUBDIR); + + EXEC SQL CONNECT :db; + + if (argc == 2) + { + outf = argv[1]; + sprintf(outft, "%s/username_id.map", warehouse_dir); + if ((out = open(outft, O_WRONLY|O_APPEND|O_CREAT|O_TRUNC, 0666)) < 0) + { + fprintf(stderr, "unable to open %s for output\n", outf); + exit(MR_OCONFIG); } - } else if (argc != 1) { - fprintf(stderr, "usage: %s [outfile]\n", argv[0]); - exit(MR_ARGS); - } else { - outf = NULL; } + else if (argc != 1) + { + fprintf(stderr, "usage: %s [outfile]\n", argv[0]); + exit(MR_ARGS); + } + else + outf = NULL; - /* The following is declarative, not executed, - * and so is dependent on where it is in the file, - * not in the order of execution of statements. - */ - EXEC SQL WHENEVER SQLERROR GOTO sqlerr; - - EXEC SQL DECLARE x CURSOR FOR - SELECT u.login, u.clearid, u.signature, u.sigdate, s.string, u.sigwho - FROM users u, strings s - WHERE u.status = 1 and u.sigwho = s.string_id; - EXEC SQL OPEN x; - while (1) { - EXEC SQL FETCH x INTO :login, :id, :sig, :timestamp, :kname, :sigwho; - if (sqlca.sqlcode != 0) break; - if (id == 0) continue; - if (!isdigit(id[1])) continue; - strtrim(login); - strtrim(id); - strtrim(kname); - memset(&outrec, 0, sizeof(outrec)); - strcpy(outrec.login, login); - strcpy(outrec.id, id); - if (sigwho) { - si.timestamp = timestamp; - si.SigInfoVersion = 0; /* XXXXXX this isn't used */ - kname_parse(si.pname, si.pinst, si.prealm, kname); - si.rawsig = (unsigned char *)sig; - GDSS_Recompose(&si, outrec.sig); - } - write(out, &outrec, sizeof(outrec)); + /* The following is declarative, not executed, + * and so is dependent on where it is in the file, + * not in the order of execution of statements. + */ + EXEC SQL WHENEVER SQLERROR GOTO sqlerr; + + EXEC SQL DECLARE x CURSOR FOR + SELECT login, clearid, first, last, middle + FROM users + WHERE (status = 1 or status = 2 or status = 5 OR + status = 6 or status = 7 or status = 9); + EXEC SQL OPEN x; + while (1) + { + EXEC SQL FETCH x INTO :login, :id, :fname, :lname, :middle; + if (sqlca.sqlcode) + break; + if (id == 0) + continue; + if (!isdigit(id[1])) + continue; + strtrim(login); + strtrim(id); + strtrim(fname); + strtrim(lname); + strtrim(middle); + memset(&outrec, 0, sizeof(outrec)); + strcpy(outrec.login, login); + strcpy(outrec.id, id); + strcpy(outrec.fname, fname); + strcpy(outrec.lname, lname); + strcpy(outrec.middle, middle); + write(out, &outrec, sizeof(outrec)); + records++; } - EXEC SQL CLOSE x; + EXEC SQL CLOSE x; - EXEC SQL COMMIT; + EXEC SQL COMMIT; - if (close(out)) { - perror("close failed"); - exit(MR_CCONFIG); + if (close(out)) + { + perror("close failed"); + exit(MR_CCONFIG); } - if (outf) - fix_file(outf); - exit(MR_SUCCESS); + sprintf(control_fn, "%s/username_id.ctl", warehouse_dir); + + f = fopen(control_fn, "w"); + if (!f) + { + perror("creating username_id control file"); + exit(MR_OCONFIG); + } + fprintf(f, "username_id.map --- Moira feed for MIT Data Warehouse\n"); + fprintf(f, "%d records\n", records); + fprintf(f, "%d bytes\n", records * (12 + 12 + 20 + 20 + 20 + 256)); + fprintf(f, "Full feed\n"); + fprintf(f, "Fixed format -- binary\n"); + fclose(f); + if (outf) + { + fprintf(stderr, "Building tar file.\n"); + sprintf(cmd, "(cd %s; tar cf - . ) | compress > %s", + warehouse_dir, outf); + if (system(cmd)) + exit(MR_TAR_FAIL); + } + + exit(MR_SUCCESS); - sqlerr: - db_error(sqlca.sqlcode); - exit(MR_DBMS_ERR); +sqlerr: + db_error(sqlca.sqlcode); + exit(MR_DBMS_ERR); }