/*--------------------------------------------------------------------------*/
/* carga_empleados : Carga tabla de empleados desde un archivo de texto de formtato fijo */
/*--------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <libpq-fe.h>

/* Aca van siempre la cantidad de parametros */
#define CANT_PARAM 7 
#define MAX_ERRORES 10 /* Maxima cantidad de errores aceptados */


int main(int c, char **v)
{
/* Variables comunes a cualquier cargador */
char buf[2048];
char aux[2048];
PGresult *res;
PGconn *conn;
int aceptado=1;
unsigned long procesados=0L;
unsigned long erroneos=0L;
FILE *fp,*flog;
const char *parametros[CANT_PARAM]; 

/* Variables propias de la tabla (Siempre con 1 byte mas por el \0 */
char id_empleado[6];
char nombre[21];
char apellido[26];
char email[26];
char telefono[21];
char fecha_inicio[11]; /* La fecha viene en formato YYYY-MM-DD  no hace falta convertir*/
char id_puesto[11];
        
	/* Controlo cantidad de parametros */
	if (c!=4) {
	fprintf(stderr, "Uso : %s <archivo> <dbstring> <logfile> \n\n",basename(v[0]));
	exit(1);
	}

        /* Abro Archivo de log */
        if ((flog = fopen(v[3],"a"))==NULL) {
        fprintf(stdout, "Error no, puedo crear el archivo de log: %s.\n",v[3]);
        perror("al abrir archivo log");
        exit(1);
        }

        if ((fp = fopen(v[1],"r"))==NULL) {
        fprintf(stdout, "Error no, puedo leer archivo : %s.\n",v[1]);
        fprintf(flog, "Error no, puedo leer archivo : %s.\n",v[1]);
        exit(2);
        }

        /* Abro Conexion con la base de datos */
        if ((conn = PQconnectdb(v[2]))==NULL) {
        fprintf(stdout, "Error de conexion : \n");
        fprintf(flog, "Error de conexion a la base de datos : \n");
        exit(3);
        }

        if (PQstatus(conn) == CONNECTION_BAD) {
        fprintf(flog, "Error chequeo de conexion : %s.\n",PQerrorMessage(conn));
        exit(4);
        } 

        /* Vacio la tabla */
        res = PQexec(conn, "truncate empleados");

        /* Inicio Transaccion */

        res = PQexec(conn, "BEGIN");
         if (res==NULL) {
          fprintf(flog, "Error en BEGIN : %s.\n",PQerrorMessage(conn));
          exit(5);
         }  else
             PQclear(res);

    /* Ciclo por cada registro en el archivo   */
    /* Leyendo linea por linea en buf   */

    while (fgets(buf,2048,fp)!=NULL) {

        procesados++;

        /* Proceso campos*/
        // El id_empleado son las 5 primeras posiciones
        strncpy (id_empleado, buf,5);
	tipo_doc[5]=0x00;

        strncpy (nombre, &buf[5],20);
	nombre[21]=0x00;

        strncpy (apellido, &buf[25],25);
	apellido[25]=0x00;

        strncpy (email, &buf[50],25);
	email[25]=0x00;

        strncpy (telefono, &buf[75],25);
	telefono[20]=0x00;

        strncpy (fecha_inicio, &buf[75],10);
	fecha_inicio[10]=0x00;

        strncpy (id_puesto, &buf[85],10);
	id_puesto[10]=0x00;


        /* Cargo los parametros */
	/* El Array parametros contiene una fila a insertar */
        parametros[0]=id_empleado;
        parametros[1]=nombre;
        parametros[2]=apellido;
        parametros[3]=email;
        parametros[4]=telefono;
        parametros[5]=fecha_inicio;
        parametros[6]=id_puesto;

        /* Realizo el insert utilizando PQexecParams */
        res = PQexecParams(conn,
                           "insert into empleados (id_empleado,nombre,apellido,email,telefono,fecha_inicio,id_puesto) values ($1,$2,$3,$4,$5,$6,$7)",
                           CANT_PARAM,       /* Cantidad de Parametros */
                           NULL,
                           parametros,
                           NULL,
                           NULL,
                           1);

        if ((res==NULL) || (PQresultStatus(res) != PGRES_COMMAND_OK)) {
            fprintf(flog, "Error en registro %d :  %s.\n"
                         ,procesados,PQerrorMessage(conn));
            erroneos++;
          /* Chequeo si se superaron la maxima cantidad de errores aceptados */
            if ( erroneos > MAX_ERRORES )   {
            aceptado=0;
            break;
            }
        } 
        PQclear(res);
   
    }
        /* Cierro Archivo de entrada */
        fclose(fp);

        /* Cierro Transaccion*/
        if (aceptado) {
           res = PQexec(conn, "COMMIT");
        } else {
           res = PQexec(conn, "ROLLBACK");
        }
        PQclear(res);

        /* Cierro Conexion */
        PQfinish(conn);

        /* Cierro log */
	
	fprintf(flog,"\n");
	fprintf(flog,"CARGA PERSONA\n");
	fprintf(flog,"---------------------\n");	
        fprintf(flog,"Totales de la corrida:\n");
        fprintf(flog,"Registros procesados : %d\n",procesados);
        fprintf(flog,"Registros con error  : %d\n",erroneos);
        fprintf(flog,"Registros ok         : %d\n",procesados-erroneos);

        fprintf(flog,"\nResultado final : %s\n",(aceptado)?"CARGA ACEPTADA":"CARGA RECHAZADA");

        /* Asigno retorno */
	if (aceptado) {
          fprintf(flog, "Termino bien \n\n");
        } else {
          fprintf(flog, "Cancelo \n\n");
          exit(6);
        }
        fclose(flog);

return 0;
}
