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.
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 |