Nous sommes le Dim 20 Juil, 2025 19:51
Supprimer les cookies

PqExec et Segmentation Fault

Sur le logiciel libre en général ou un logiciel libre en particulier

Jeu 31 Mai, 2007 13:42

Bonjour,

Comment se fait que PgExec génère une erreur de segmentation pour une requête qui s'exécute "manuellement" si on la copie-colle sur PgAdmin?

J'ai beau retourner le problème dans tout les sens, je ne vois pas comment m'en sortir. Je copie-colle le code pour donner un peu plus de détails.

Merci de votre aide


Code: Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

static void exit_nicely(PGconn *conn)
{
       PQfinish(conn);
       exit(1);
}

int bande()
{
    const char *conninfo;
    PGconn     *conn;
    PGresult   *res;
    int      nFields;
    int       i, j;

    char maRequete[250];

    int i = 1; int j = 2;

    conninfo = "***chaine pour se connecter***";

    /* Make a connection to the database */
    conn = PQconnectdb(conninfo);

    /* Check to see that the backend connection was successfully made */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
        exit_nicely(conn);
    }

    /* Start a transaction block */
    res = PQexec(conn, "BEGIN");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    /*
    * Should PQclear PGresult whenever it is no longer needed to avoid memory
    * leaks
    */
    PQclear(res);


    while(j<=nbPoints)
    {   strcpy(maRequete,"***une requete***");

        printf("%s \n",maRequete);

        res = PQexec(conn,maRequete);

        if (PQresultStatus(res) != PGRES_TUPLES_OK)
        {
            fprintf(stderr, "SELECT failed: %s \n", PQerrorMessage(conn));
            fprintf(stderr, "maRequete= %s \n", maRequete);
            PQclear(res);
            exit_nicely(conn);
        }

        PQclear(res);

        if (i==1) //Si c'est le premier segment, on crée le premier polygone
        {
            strcpy(maRequete,"***une requete***");

            res = PQexec(conn,maRequete);

            if (PQresultStatus(res) != PGRES_TUPLES_OK)
            {
                fprintf(stderr, "SELECT failed: %s \n", PQerrorMessage(conn));
                fprintf(stderr, "maRequete= %s \n", maRequete);
                PQclear(res);
                exit_nicely(conn);
            }

            PQclear(res);
        }else   // Sinon on fait une union avec le nouveau polygone
        {
            strcpy(maRequete,"***une requete***");

            printf("%s\n",maRequete);

            res = PQexec(conn,maRequete);   /* Instruction qui génère l'erreur de segmentation */

            if (PQresultStatus(res) != PGRES_TUPLES_OK)
            {
                fprintf(stderr, "SELECT failed: %s \n", PQerrorMessage(conn));
                fprintf(stderr, "maRequete= %s \n", maRequete);
                PQclear(res);
                exit_nicely(conn);
            }

            PQclear(res);
        }

        i++;
        j++;
    }

    /* end the transaction */
    res = PQexec(conn, "END");
    PQclear(res);

    /* close the connection to the database and cleanup */
    PQfinish(conn);

    return 0;
}
SangJun

Messages : 10

Jeu 31 Mai, 2007 16:03

Bonjour,

Est-ce que ta requête fait moins de 250 caractères de long?
Amicalement,

Laurent
obor2

Messages : 524
Géo : belgique

Ven 01 Juin, 2007 08:28

un petit coup de débogueur devrait bien t'aider...
guerinp

Messages : 183
Géo : Crolles

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit