#include #include #include #include typedef struct { unsigned int folio; char fecha[9]; double cantidad; unsigned plaza; unsigned sucursal; } cobro; PGconn *conn; PGresult *res; FILE *fp=NULL, *fp_p=NULL; void exit_nicely(int status) { PQfinish(conn); if(fp!=NULL) fclose(fp); if(fp_p!=NULL) fclose(fp_p); exit(status); } void query(char *qStr) { res = PQexec(conn, qStr); if(res==NULL) { fprintf(stderr, "Error: res==NULL\n"); fprintf(stderr, "Query: %s\n\n", qStr); PQclear(res); exit_nicely(1); } if(PQresultStatus(res)!=PGRES_COMMAND_OK && PQresultStatus(res)!=PGRES_TUPLES_OK) { fprintf(stderr, "Error: %d\n", PQresultStatus(res)); fprintf(stderr, "Query: %s\n\n", qStr); PQclear(res); exit_nicely(1); } } void insert(cobro *c) { char q[256]; sprintf(q, "insert into cobros (folio, fecha, cantidad, plaza, sucursal) values (%lu, '%s', %f, %u, %u);", c->folio, c->fecha, c->cantidad, c->plaza, c->sucursal); query(q); PQclear(res); } void parseHeader(char *file) { char buffer[330]; fgets(buffer, 328, fp); fprintf(fp_p, "\"HEADER\",\"PAGO\",\"Ingreso de pagos de molineros, archivo %s\"\n", file); } void parseBody() { char buffer[330]; cobro c; for(fgets(buffer, 328, fp); !feof(fp); fgets(buffer, 328, fp)) { *(buffer+298) = '\x0'; c.sucursal = atoi(buffer+295); *(buffer+295) = '\x0'; c.plaza = atoi(buffer+292); *(buffer+229) = '\x0'; strcpy(c.fecha, buffer+221); *(buffer+193) = '\x0'; c.cantidad = atof(buffer+178)/100; *(buffer+52) = '\x0'; c.folio = atoi(buffer+45); insert(&c); fprintf(fp_p, "\"1103020101\",3,%.02f\n", c.cantidad); fprintf(fp_p, "\"42010301 \",7,%.02f\n", c.cantidad); } } int main(int argc, char *argv[]) { char *pghost=NULL, *pgport=NULL, *pgoptions=NULL, *pgtty=NULL; if(argc!=2) { fprintf(stderr, "Uso: %s \n", argv[0]); return -1; } /* abrir el archivo de entrada */ if((fp=fopen(argv[1], "r"))==NULL) { fprintf(stderr, "Error: '%s' no se pudo abrir\n", argv[1]); return -2; } /* abrir el archivo de exportación a Pacioli */ if((fp_p=fopen(tempnam("/tmp", "pacio"), "w"))==NULL) { fprintf(stderr, "Error: no se pudo hacer la exportación a Pacioli\n"); fclose(fp); return -3; } /* abrir la conexión */ conn = PQsetdb(pghost, pgport, pgoptions, pgtty, "maizal"); if (PQstatus(conn) == CONNECTION_BAD) { fprintf(stderr,"La conexión a 'maizal' falló.\n"); fprintf(stderr,"%s",PQerrorMessage(conn)); exit_nicely(1); } /* comenzar un bloque transaccional */ query("begin;"); /* PQclear limpia el PGresult cuando ya no se necesita */ PQclear(res); parseHeader(argv[1]); parseBody(); /* cerrar la transacción */ query("commit;"); PQclear(res); exit_nicely(0); return 0; // Sí, ya sé que nunca llegaremos aquí. ¿Y qué? }