[pgsql-ayuda] libpq insert II
Bruno Unna
bruno@iac.com.mx
Wed, 10 Feb 1999 18:50:42 -0600
This is a multi-part message in MIME format.
--------------96BE0154697464C15725B1F8
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Omar Armas Aleman wrote:
>
> A mi pregunta de como hacer un insert con libpq, alguien respondió que
> revisara testlibpq3.c (programmers doc), lo acabo de revisar y no hace
> insert, sino te pide que hagas algunos insert(psql?) antes de correr el
> programa.
>
> Todavía no me queda claro como hacer un insert con libpq.
> Acabo de probar con PQexec:
>
> result = PQexec (conn, "INSERT INTO persona VALUES (aqui puse valores)");
>
> pero no actualizó la tabla.
>
> También estuve leyendo el programmers.ps, pero no me aclara mi duda del
> todo.
>
> Podría alguien explicar esto más a fondo? o mandar un cacho de código?
Anexo un programa que recibe un archivo de texto, lo parsea y como
resultado introduce registros a una tabla.
El programa tiene algunos defectos de robustez, pero sirve para ilustrar
el punto.
Nótese (es un fenómeno que ya he discutido en numerosas ocasiones
previas) que *TODOS*, repito *TODOS* los queries al servidor de base de
datos *DEBEN*, repito *DEBEN* finalizarse con un caracter ';' (ascii
0x3b, pues). Sí, ya sé que a veces jala sin su punto y coma. Sí, también
sé que en otros RDBMS (M$ $QL $erver, por ejemplo) el punto y coma
genera un error. Pero seamos claros: en PostgreSQL el punto y coma DEBE
APARECER.
Saludos y buena suerte.
--
"Create like a god, Bruno Unna <bruno@iac.com.mx>
command like a king, Desarrollo de Software
and work like a slave." Internet de Alta Calidad
Kawasaki PGP public key available
--------------96BE0154697464C15725B1F8
Content-Type: text/plain; charset=iso-8859-1;
name="cobranza.c"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
filename="cobranza.c"
#include <math.h>
#include <stdio.h>
#include <time.h>
#include <libpq-fe.h>
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 <archivo>\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é?
}
--------------96BE0154697464C15725B1F8--
--------- Pie de mensaje -------------------------------------------
Archivo historico: http://tlali.iztacala.unam.mx/maillist/pgsql-ayuda
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text : cancelacion pgsql-ayuda