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: Gestion des adresses URL avec parse_url
Date: 2009-10-21 20:00:26
Message-ID: 1256155226.2845.51.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

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)

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message sam sam 2009-10-22 07:12:32 probleme sur base "could not opn relation with oid"
Previous Message Rodolphe Quiedeville 2009-10-21 19:04:20 Re: PDO (PHP) et RAISE NOTICE