Skip site navigation (1) Skip section navigation (2)

Fonction C: Segmentation fault

From: Samuel ROZE <samuel(dot)roze(at)gmail(dot)com>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Fonction C: Segmentation fault
Date: 2009-10-14 17:30:08
Message-ID: 1255541408.27829.7.camel@samuel-laptop (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Bonjour à tous,

Je souhaites créer une fonction "parse_url" afin de pouvoir récupérer
l'hostname, le path, le schéma ou autre chose à partir d'une adresse URL
(text).

Je souhaites donc créer une fonction C. Seulement, j'ai quelques soucis
pour la création d'une fonction de base. La fonction doit retourner un
type composite (i.e. une colonne "scheme" et une colonne "host" avec des
valeurs de base, pour le moment (pour faire ma première fonction C pour
PostgreSQL). Bref, voilà le code que j'ai.

Fichier: parse_url.c
------------------------------------------------------------------------
/*
 * parse_url.c
 *
 *  Created on: 14 oct. 2009
 *      Author: Samuel ROZE <samuel(dot)roze(at)gmail(dot)com>
 */
#include "postgres.h"
#include <string.h>
#include "fmgr.h"
// Tuple building functions and macros
#include "access/heapam.h"
#include "funcapi.h"

#include "parse_url.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(parse_url);
Datum parse_url (PG_FUNCTION_ARGS)
{
	// Vars about the params
	text *str = PG_GETARG_TEXT_P(0);
	int32 length = VARSIZE(str);

	// Vars about the pg_url instance
	pg_url 		*ret = palloc(sizeof(pg_url));

	// Some vars which will used to create the composite output type
	TupleDesc	tupdesc;
	Datum		values[8]; // 8 values
	HeapTuple	tuple;
	bool		*nulls;
	int			tuplen;

	// Check NULLs values
	if(PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
		PG_RETURN_NULL();
	}

	// Parse URL
	ret->scheme = parse_url_alloc("schema", 7);
	ret->host = parse_url_alloc("host", 5);

	// Add datas into the values Datum
	values[0] = PointerGetDatum(ret->scheme);
	values[1] = PointerGetDatum(ret->host);

	// Convert values into a composite type
	tuplen = tupdesc->natts;
	nulls = palloc(tuplen * sizeof(bool));

	// build tuple from datum array
	tuple = heap_form_tuple(tupdesc, values, nulls);
	// Free null values
	pfree(nulls);

	// Return the composite type
	PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}

char *parse_url_alloc(const char *s, int length)
{
	char *p;

	p = (char *) palloc(length+1);
	if (p != NULL) {
		memcpy(p, s, length);
		p[length] = 0;
		return p;
	}
}
------------------------------------------------------------------------

Fichier: parse_url.h
------------------------------------------------------------------------
/*
 * parse_url.h
 *
 *  Created on: 14 oct. 2009
 *      Author: Samuel ROZE <samuel(dot)roze(at)gmail(dot)com>
 */

#ifndef PARSE_URL_H
#define PARSE_URL_H

Datum parse_url (PG_FUNCTION_ARGS);
char *parse_url_alloc(const char *s, int length);

typedef struct pg_url {
	char *scheme;
	char *user;
	char *pass;
	char *host;
	unsigned short port;
	char *path;
	char *query;
	char *fragment;
} pg_url;

#endif /* PARSE_URL_H */
------------------------------------------------------------------------

Pour le compilation, voilà ce que j'ai fait:
------------------------------------------------------------------------
$ gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing
-fwrapv -fpic -I. -I/usr/include/postgresql/server
-I/usr/include/postgresql/internal -D_GNU_SOURCE   -c -o parse_url.o
parse_url.c -I/usr/include/postgresql/
-I/usr/local/pgsql/include/server/
------------------------------------------------------------------------
$ gcc -shared -o parse_url.so parse_url.o
------------------------------------------------------------------------

Ça marche bien. Quelques petites erreurs:
------------------------------------------------------------------------
parse_url.c: In function ‘parse_url’:
parse_url.c:25: warning: unused variable ‘length’
parse_url.c: In function ‘parse_url_alloc’:
parse_url.c:73: warning: control reaches end of non-void function
parse_url.c: In function ‘parse_url’:
parse_url.c:51: warning: ‘tupdesc’ may be used uninitialized in this
function
------------------------------------------------------------------------

Pour la création de la fonction dans PostgreSQL:
------------------------------------------------------------------------

------------------------------------------------------------------------

Pour l'éxécution:
------------------------------------------------------------------------
------------------------------------------------------------------------

L'erreur suivant m'est retounée:
------------------------------------------------------------------------


Responses

pgsql-fr-generale by date

Next:From: Samuel ROZEDate: 2009-10-14 17:32:26
Subject: Fonction C: Segmentation fault
Previous:From: Dimitri FontaineDate: 2009-10-04 20:43:19
Subject: Re: PDO (PHP) et RAISE NOTICE

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group