/* CVS2SQL Programma interfacciabile a CVS tramite loginfo, per registrare i commit su di un database POSTGRES. L'applicazione dovra' essere eseguita sul server nel quale risiede il repository (Etabeta) Le informazioni da registrare sulla tabella COMMITS, vengono reperite in 3 modi: - dallo stdin per quanto riguarda il log file vero e proprio: [Release] [Descrizione] [Errori] [Files] - variabile d'ambiente per l'autore ($USER) - linea di comando per quanto riguarda il nome del modulo. Sarebbe bello farlo in C++ ma su etabeta gcc e' installato male e non funziona. Altrettanto bello sarebbe potere usare cvs2sql presente nelle libwww: http://dev.w3.org/cvsweb/libwww/Library/cvs2sql Ma per fare cosi' e' necessario scaricarle e compilarle. E per compilare un programmino del cavolo non voglio includere nel repository tutta quella roba. */ #include #include #define POSTGRES_HOST "mccoy" #define POSTGRES_PORT "" #define POSTGRES_DB "eurocampo" #define DEFAULT_USER "Aga Informatica" #define BUFSIZE 16384 void cvs2sql(char* modulo) { FILE *fin=stdin; int status; char autore[20]; char release[20]; char buffer[BUFSIZE]; char files[BUFSIZE/4]; char descrizione[BUFSIZE/4]; char errori [BUFSIZE/4]; char committed_files[BUFSIZE/2]; char *p1, *p2, *p3; PGconn* pgc; /* Sistema l'autore della modifica, prendendolo dalla variabile d'ambiente*/ strcpy(autore,getenv("USER")); if (strlen(autore) == 0) strcpy(autore, "Aga Informatica"); /* Legge dallo stdin il log file, 16 KB sono abbastanza per un log...*/ status = fread(buffer, 1, BUFSIZE, fin); if (status < 0) { printf("Can't read from stdin\n"); return; } /* Legge le informazioni sui files modificati, aggiunti, cancellati */ strcpy(committed_files, ""); p1 = strstr(buffer, " Files:"); if (p1 != NULL) { int l; p2 = strrchr(p1, '\n'); p2++; p1 = strstr(p2, "Log Message:"); *p1 = '\0'; l = (int) (p2 - p1); strncpy(committed_files, p2, l); p1 += 13; } /* Legge il paragrafo di release */ p2 = strstr(p1 ? p1 : buffer,"[Release]"); if (p2 != NULL) { p2++; p1 = strchr(p2, '\n'); *p1 = '\0'; strcpy(release, p2); p1++; } p2 = strstr(p1 ? p1 : buffer, "[Files]"); if (p2 != NULL) { p2 += 7; strncpy(files, p2, ); } p2 = strstr(p1 ? p1 : buffer, "[Descrizione]"); if (p2 != NULL) { } p2 = strstr(p1 ? p1 : buffer, "[Errori]"); if (p2 != NULL) { } /* Apre la connessione sul database, inizia una transazione, bloccando la tabella dei progressivi per gestire la concorrenza */ pgc = PQsetdb(POSTGRES_HOST, POSTGRES_PORT, NULL, NULL, POSTGRES_DB); if (PQstatus(pgc)==CONNECTION_OK) { } else printf("FATAL ERROR: Can't open database %s: %s\n", POSTGRES_DB, PQerrorMessage(pgc)); PQfinish(pgc); } int main(int argc, char* argv[]) { if (argc == 2) cvs2sql(argv[1]); else printf("Usage: cvs2sql \nWarning: $USER environment variable must also be set \nand a log file must be written on stdin.\n"); exit(0); }