Problème en ECPG C avec des dates et un EXEC SQL DEALLOCATE

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

Browse pgsql-fr-generale by date

  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