/*
  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 <libpq-fe.h>
#include <string.h>


#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 <module>\nWarning: $USER environment variable must also be set \nand a log file must be written on stdin.\n");
  exit(0);
}