Re: Gestion des adresses URL avec parse_url

From: Samuel ROZE <samuel(dot)roze(at)gmail(dot)com>
To: Dimitri Fontaine <dfontaine(at)hi-media(dot)com>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Gestion des adresses URL avec parse_url
Date: 2009-10-24 10:19:42
Message-ID: 1256379582.3379.13.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonjour,

Le vendredi 23 octobre 2009 à 10:33 +0200, Dimitri Fontaine a écrit :
> Samuel ROZE <samuel(dot)roze(at)gmail(dot)com> writes:
> > Un problème de mémoire... Ce que je ne comprend pas c'est pourquoi ça
> > marche dans les autres cas et pas là.. Bizarre ! J'ai chercher
> > différentes variables qui auraient pu être non-initialisées mais je ne
> > voit pas...
>
> Le type URL est un type de données à taille variable et doit donc suivre
> les conventions des « varlena », en particulier pas de pointeur externe
> dans la structure principale. Je t'encourage à regarder le module prefix
> et le type de données prefix_range pour un exemple simple :)

Je me suis renseigner (via Google ;-) ) sur le type "varlena".

struct varlena
{
char vl_len_[4]; /* Do not touch this field directly! */
char vl_dat[1];
};

Il permet donc de stocker des données "char" dans "vl_dat", en utilisant
mempcy(VARDATA(..), source, ...) après avoir faire un SET_VARSIZE.

J'ai de même regarder le code source de "prefix" et j'ai vu que le
"prefix_range_in" retourne un varlena en réalité, grace à la fonction
"make_varlena"... De plus, le type prefix_range est défini comme ceci:

typedef struct {
char first;
char last;
char prefix[1]; /* this is a varlena structure, data follows */
} prefix_range;

Le "char prefix[1]" resemble à "char vl_data[1]", ça n'est peut-être pas
utile en fait ?

Sinon, il se trouve qu'en fait il y a ici uniquement une seule valeur
"char *" à remplir: "prefix". Seulement, moi j'en ai 7 ! :/
En effet, dans la fonction "build_pr", il y a:

int s = strlen(prefix) + 1;
prefix_range *pr = palloc(sizeof(prefix_range) + s);
memcpy(pr->prefix, prefix, s);
pr->first = first;
pr->last = last;

Comment je fait moi avec plein de champs ? Dans "s", je rajoute le
strlen de toutes les données ? Ouais mais là il faut toutes les passer
dans un argument ? Waou.. Plutôt faire deux types alors ? Un type
"urltype_internal" et "urltype_varlena" ?

Merci beaucoup.
Samuel.

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Samuel ROZE 2009-10-24 11:37:29 Re: Gestion des adresses URL avec parse_url
Previous Message Samuel ROZE 2009-10-24 10:06:44 Re: Gestion des adresses URL avec parse_url