Re: Gestion des adresses URL avec parse_url

From: Samuel ROZE <samuel(dot)roze(at)gmail(dot)com>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Gestion des adresses URL avec parse_url
Date: 2009-10-22 22:59:43
Message-ID: 1256252383.2740.10.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonjour !

Tout d'abord, merci beaucoup pour l'attention que vous porter à mon
petit projet.

J'ai grandement modifier le code source dans cette "v2", qui ne
s'appelle déjà plus "parse_url" mais "url" (même si la fonction
"parse_url" a toujours le même nom).

J'ai créer:
- Un type interne "urltype" à la place de l'ancien type "url"
- Un type SQL "url" défini par les deux fonctions suivantes:
- Une fonction "url_in" et son homologue "url_out" pour gérer le type de
donnée "url".
- Un type SQL "url_record", retourné par "parse_url(url)"

http://www.d-sites.com/wp-content/uploads/2009/10/url.tar.gz

Comme avant, il est compilable par un simple "make" et les requêtes SQL
à exécuter sont présentes dans le fichier "url.sql".

Voici quelques exemples:
postgres=# SELECT parse_url('http://www.d-sites.com/index.php?q=query&r=postgresql#p2');
parse_url
--------------------------------------------------------------
(http,,,www.d-sites.com,,/index.php,q=query&r=postgresql,p2)
(1 row)

postgres=# SELECT * FROM parse_url('http://www.d-sites.com/index.php?q=query&r=postgresql#p2');
scheme | user | pass | host | port | path | query | fragment
--------+------+------+-----------------+------+------------+----------------------+----------
http | | | www.d-sites.com | | /index.php | q=query&r=postgresql | p2
(1 row)

postgres=# SELECT parse_url('http://www.d-sites.com/index.php?q=query&r=postgresql#p2', 'query');
parse_url
----------------------
q=query&r=postgresql
(1 row)

Toujours le même chose, qu'en pensez-vous ?

Merci encore !
Cordialement,
Samuel.

Le mercredi 21 octobre 2009 à 22:00 +0200, Samuel ROZE a écrit :
> Bonjour à tous,
>
> Je viens ici demander quelques feedbacks à propos d'une fonctionnalité
> que je suis en train de développer.
>
> Je suis en train de développer une série de fonctions permettant de
> manipuler des adresses URL directement dans la base de données. Pour le
> moment, j'ai fait le plus dur avec ces fonctions:
> - url *parse_url_exec (char * url_str) - utilisée par les deux
> fonctions suivantes
> - Datum parse_url_key (PG_FUNCTION_ARGS) qui prend deux arguments:
> - text: L'adresse URL
> - text: Quoi récupérer dans cette liste: scheme (http, https, ftp,
> etc...), user (le nom d'utilisateur quand il y a), pass (mot de passe
> quand il y a), host (nom de domaine), path, query (requête - i.e. après
> "?"), fragment (quel endroit de la page - i.e. après "#")
> - Datum parse_url_record (PG_FUNCTION_ARGS) qui prend un seul argument
> (text), l'adresse URL. Elle retourne un tuple de char*. i.e. un record.
>
> Pour simplifier la vie pour la récupération du record, j'ai fait un type
> SQL "url" comme ceci:
> ------------------------------------------------------------
> CREATE TYPE url AS ("scheme" text, "user" text, "pass" text, "host"
> text, "port" integer, "path" text, "query" text, "fragment" text);
> ------------------------------------------------------------
>
> Les deux fonctions C sont définies comme ça:
> ------------------------------------------------------------
> CREATE FUNCTION parse_url(text, text) RETURNS text AS 'parse_url.so',
> 'parse_url_key' LANGUAGE C STRICT;
> ------------------------------------------------------------
> CREATE FUNCTION parse_url (text) RETURNS url AS 'parse_url.so',
> 'parse_url_record' LANGUAGE C STRICT;
> ------------------------------------------------------------
>
> Vous pouvez télécharger le code dans une archive contenant le fichier .c
> et .h, le Makefile ainsi que un fichier SQL qui contient ce que je vous
> ai présenté ci-dessus.
> http://www.d-sites.com/wp-content/uploads/2009/10/parse_url.tar.gz
>
> En toute logique, je vais continuer pour créer un "vrai" type de donnée
> "url" utilisable en tant que champ SQL, qui permettra ensuite de bien
> mieux gérer les adresses URL.
>
> Je souhaites avoir des retours de votre part avant d'en faire part à la
> mailing "pgsql-hackers@" ainsi qu'avant publication sur mon blog.
>
> Note: cf en bas du mail pour les résultats de quelques requêtes sur ma
> base de test en 8.4.1.
>
> Cordialement,
> Samuel ROZE.
> http://wwW.d-sites.com
>
> ------------------------------------------------------------
> Sur une base de données PostgreSQL 8.4.1, avec le même code que dans
> l'archive ci-dessus, compilé avec le même Makefile, après application
> des 3 requêtes de création et type et de fonction, voilà le résultat
> obtenu:
>
> postgres=# SELECT parse_url('http://www.d-sites.com/test.php?query=info', 'host');
> parse_url
> -----------------
> www.d-sites.com
> (1 row)
>
> postgres=# SELECT parse_url('http://www.d-sites.com/test.php?query=info', 'scheme');
> parse_url
> -----------
> http
> (1 row)
>
> postgres=# SELECT parse_url('http://www.d-sites.com/test.php?query=info', 'port');
> parse_url
> -----------
>
> (1 row)
>
> postgres=# SELECT parse_url('http://www.d-sites.com/test.php?query=info', 'port') IS NULL;
> ?column?
> ----------
> t
> (1 row)
>
> postgres=# SELECT * FROM parse_url('http://www.d-sites.com/test.php?query=info');
> scheme | user | pass | host | port | path | query | fragment
> --------+------+------+-----------------+------+-----------+------------+----------
> http | | | www.d-sites.com | | /test.php | query=info |
> (1 row)
>
> postgres=# SELECT * FROM parse_url('http://www.postgresql.org/docs/8.4/static/xfunc-c.html#AEN44968');
> scheme | user | pass | host | port | path | query | fragment
> --------+------+------+--------------------+------+-------------------------------+-------+----------
> http | | | www.postgresql.org | | /docs/8.4/static/xfunc-c.html | | AEN44968
> (1 row)
>
> postgres=# EXPLAIN ANALYSE SELECT * FROM parse_url('http://www.postgresql.org/docs/8.4/static/xfunc-c.html#AEN44968');
> QUERY PLAN
> -----------------------------------------------------------------------------------------------------------
> Function Scan on parse_url (cost=0.00..0.01 rows=1 width=228) (actual time=0.036..0.039 rows=1 loops=1)
> Total runtime: 0.087 ms
> (2 rows)
>
> postgres=# EXPLAIN ANALYSE SELECT * FROM parse_url('http://www.postgresql.org/docs/8.4/static/xfunc-c.html#AEN44968', 'path');
> QUERY PLAN
> ---------------------------------------------------------------------------------------------------------
> Function Scan on parse_url (cost=0.00..0.01 rows=1 width=32) (actual time=0.026..0.029 rows=1 loops=1)
> Total runtime: 0.070 ms
> (2 rows)
>

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Samuel ROZE 2009-10-22 23:11:27 Re: Gestion des adresses URL avec parse_url
Previous Message Samuel ROZE 2009-10-22 22:51:13 Re: Gestion des adresses URL avec parse_url