[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