From: | SOUCHARD Jean-Michel DSIC BI <Jean-Michel(dot)SOUCHARD(at)interieur(dot)gouv(dot)fr> |
---|---|
To: | "'pgsql-fr-generale(at)postgresql(dot)org'" <pgsql-fr-generale(at)postgresql(dot)org> |
Subject: | Problème en ECPG C avec des dates et un EXEC SQL DEALLOCATE |
Date: | 2005-01-21 07:18:00 |
Message-ID: | B3392CFACA2FD8119FAA00065B3A8609FCA413@MSG02NEL |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Bjr, je fais des tests pour une intégration C/postgresql et ai quelques
soucis. Je suis en version 7.4.2 de postgresql et en AIX.
Voici les éléments :
Extrait d'un programme connecte.pgc ci-dessous, les lignes en rouge et en
rouge brique posent problème : coredump . Les lignes en rouge marchent sous
psql ...
Si quelqu'un peut m'aider, j'en serais très heureux...
#include <stdlib.h>
#include <stdio.h>
/* Declaration des variables interfacees avec Postgresql */
EXEC SQL BEGIN DECLARE SECTION;
const char *base_cible ="photo_dev";
const char *user= "u_photo_dev";
const char *chaine_create_table_test1 ="CREATE TABLE test1 (id_test1 SERIAL
NOT NULL,libelle VARCHAR(100),dat_seule DATE,heure_seule TIME,dat_heur
TIMESTAMP, CONSTRAINT IDX_PK_test1 PRIMARY KEY (id_test1));";
char *chaine_select_test1 ="SELECT id_test1,libelle FROM test1 WHERE
id_test1 = ?;";
char *chaine_insert_test1 ="INSERT INTO test1 (id_test1) VALUES (?);";
const char *chaine_drop_table_test1 ="DROP TABLE test1;";
int num_test1;
int colonne1;
VARCHAR colonne2[80];
int nb_lignes;
int sequence_suivante;
int null_ind1,null_ind2,null_ind3;
VARCHAR libelle[100];
char *chaine_datheur;
EXEC SQL END DECLARE SECTION;
/***********************/
/* Programme principal */
/***********************/
int main ()
{
/* Déclatation des variables */
const int MAX=10;
int indice;
char *machaine;
EXEC SQL DECLARE curseur_test CURSOR FOR SELECT nombre,texte FROM test ;
/* Gestion des erreurs */
EXEC SQL WHENEVER SQLERROR DO exit_sql_err ();
EXEC SQL WHENEVER SQLWARNING DO continue_sql_warn ();
/* Connection a la base photo */
EXEC SQL CONNECT TO :base_cible AS connect_base_photo USER :user ;
/* Ne pas permettre de validation automatique */
EXEC SQL SET AUTOCOMMIT TO OFF;
/* Debut de transaction */
EXEC SQL BEGIN WORK;
/* Creation de la table TEST1 */
EXEC SQL EXECUTE IMMEDIATE :chaine_create_table_test1;
/* Insertion simple dans la table TEST1 */
EXEC SQL INSERT INTO test1 (id_test1,dat_heur) VALUES
(nextval('test1_id_test1_seq'),current_timestamp);
/* strcpy(chaine_datheur,"11/05/1962"); */
EXEC SQL INSERT INTO test1 (id_test1,dat_heur) VALUES (5,timestamp
'1962-11-05 00:00');
EXEC SQL INSERT INTO test1 (id_test1,dat_seule) VALUES (5,date
'1962-11-05');
EXEC SQL INSERT INTO test1 (id_test1,heure_seule) VALUES (5,date '00:00');
/* Insertion par SQL dynamique dans la table TEST1 */
EXEC SQL SELECT nextval('test1_id_test1_seq') INTO :sequence_suivante FROM
test1 ;
EXEC SQL PREPARE machaine FROM :chaine_insert_test1;
EXEC SQL EXECUTE machaine USING :sequence_suivante;
/* Selection du premier enregistrement de la table TEST1 */
EXEC SQL PREPARE machaine FROM :chaine_select_test1;
EXEC SQL EXECUTE machaine INTO :num_test1:null_ind1,:libelle:null_ind2
USING 1;
/* Test sur libelle=valeur nulle en retour de select */
if (null_ind2 !=0)
{
(void) fprintf(stdout,"La selection de test1 avec id_test1=1 ramene
libelle avec valeur nulle\n");
}
/* Il y a un dysfonctionnement sur la generation de la macro ci-dessous
necessaire a la liberation de la chaine => ne pas la mettre
EXEC SQL DEALLOCATE machaine;
En-effet, le precompilateur genere ""machaine"" dans le programme .c */
/* Suppression DE LA TABLE TEST1 */
EXEC SQL EXECUTE IMMEDIATE :chaine_drop_table_test1;
/* Fin de transaction */
EXEC SQL COMMIT WORK;
/* Deconnection de la base de donnees */
EXEC SQL DISCONNECT connect_base_photo;
/* Fin normale de programme */
exit(EXIT_SUCCESS);
}
/***************************************************/
/* Fonction de gestion des erreurs base de donnees */
/***************************************************/
int exit_sql_err ()
{
/* Affichage du message d'erreur */
(void) fprintf(stderr,"Erreur base de données : %s (%s)\nNombre de lignes
impactées : %d\n Avertissement :
%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc,sqlca.sqlerrm.sqlerrmc,sqlca.sqle
rrd[2]);
/* Retour arriere pour annuler la transaction en cours */
EXEC SQL ROLLBACK WORK;
/* Sortie en echec du programme */
exit(EXIT_FAILURE);
}
/**********************************************************/
/* Fonction de gestion des avertissements base de donnees */
/**********************************************************/
int continue_sql_warn ()
{
/* Affichage du message d'avertissement */
(void) fprintf(stderr,"Message d'avertissement base de données : %s
(%s)\n",sqlca.sqlstate,sqlca.sqlerrm.sqlerrmc);
/* Retour au programme appelant avec succes */
return (EXIT_SUCCESS);
}
/************************************************************/
/* Fonction qui ramene le nombre de lignes de la table TEST */
/************************************************************/
int compte_ligne (int etape,char *table)
{
/* Comptage du nombre de lignes */
EXEC SQL SELECT count(*) INTO :nb_lignes FROM test;
/* Affichage du résultat */
(void) fprintf(stdout,"Etape %d : La table TEST contient %d
ligne(s)\n",etape,nb_lignes);
return (EXIT_SUCCESS);
}
Le programme est compilé avec le fichier comp.sh (pas encore fait de
makefile) :
echo "Precompilation"
ecpg $1.pgc
echo "Compilation"
cc -I/postgresql/V742/include -c $1.c
echo "Edition de lien"
cc -b loadmap:$1.ldmp -o $1 $1.o -lecpg -L/postgresql/V742/lib -lm
-lecpg_compat -lpgtypes -lpq 2>$1.err
Cordialement
Jean-Michel SOUCHARD
Ministère de l'intérieur, de la sécurité intérieure et des libertés locales
DSIC/SDEL/BPPO
Tél. : 01.40.57.58.63 - Télécopie : 01.40.57.56.80
E-mail : jean-michel(dot)souchard(at)interieur(dot)gouv(dot)fr
From | Date | Subject | |
---|---|---|---|
Next Message | Francois Suter | 2005-01-21 12:21:25 | Copie d'écran PostgreSQL 8.0 sous Windows |
Previous Message | Patrick Welche | 2005-01-20 17:56:04 | Re: Bas |