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 11:37:29 |
Message-ID: | 1256384249.3379.20.camel@samuel-laptop |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Ça avance, ça avance ! :-)
postgres=# SELECT * FROM parse_url('http://www.postgresql.org');
NOTICE: url_in: str=http://www.postgresql.org
NOTICE: url_in: result=(C� host=www.postgresql.org path=(null)
NOTICE: url_size: url=(C� host=www.postgresql.org
scheme | user | pass | host | port | path | query |
fragment
--------+------+------+--------------------+------+------+-------+----------
http | | | www.postgresql.org | | | |
(1 row)
postgres=# DROP TABLE t1;
DROP TABLE
postgres=# CREATE TABLE t1 (my_url url);
CREATE TABLE
postgres=# INSERT INTO t1 VALUES ('http://www.postgresql.org'::url);
NOTICE: url_in: str=http://www.postgresql.org
NOTICE: url_in: result_� host=www.postgresql.org path=(null)
NOTICE: url_size: url_� host=www.postgresql.org
INSERT 0 1
Là, ça se gatte:
-----------------------------------------------------------------------------
postgres=# SELECT * FROM t1;
NOTICE: url_size: url_�
host=�
NOTICE: url_out: size=5078 url_�
host=� path=(null)
WARNING: detected write past chunk end in ExecutorState 0x2c05950
-----------------------------------------------------------------------------
Avec les sauts à la ligne qui vont avec...
Comment peut-on expliquer ces résultats ?
Ci-joint mon fichier source.
Cordialement,
Samuel.
Le samedi 24 octobre 2009 à 12:19 +0200, Samuel ROZE a écrit :
> 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.
>
>
Attachment | Content-Type | Size |
---|---|---|
url.c | text/x-csrc | 9.9 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Dimitri Fontaine | 2009-10-26 09:58:43 | Re: Gestion des adresses URL avec parse_url |
Previous Message | Samuel ROZE | 2009-10-24 10:19:42 | Re: Gestion des adresses URL avec parse_url |