Accueil Projets

Voilà (à peu de choses près) ce que j'ai envoyé pour présenter le patch. Je l'ai envoyé en anglais mais je l'ai traduit pour le site.

A noter que j'ai envoyé ce patch à apache le 30 décembre 2001 et que je n'ai pas eu de réponse. A noter également que je n'ai pas trouvé de bug dedans. Voilà l'accusé de réception d'apache :

Date: 30 Dec 2001 13:20:00 -0000
To: regis@grison.org
From: submit@bugz.apache.org
Subject: Re: mod_rewrite/9318: [PATCH] mysql in mod_rewrite

Thank you very much for your problem report.
It has the internal identification `mod_rewrite/9318'.
The individual assigned to look at your
report is: apache. 

>Category:       mod_rewrite
>Responsible:    apache
>Synopsis:       [PATCH] mysql in mod_rewrite
>Arrival-Date:   Sun Dec 30 05:20:00 PST 2001

Le patch lui-même est ici :
download mod_rewrite-mysql.patch.gz.

Version française :

Hello,

J'ai eu besoin pour mon travail de faire en sorte que le mod_rewrite accède à une base de données MySql donc j'ai fait un patch (le tout premier que j'envoie donc dites moi si j'ai fait une erreur). Pour appliquer ce patch il faut un "patch -p0 < mod_rewrite-mysql.patch" dans le répertoire src/modules/standard/ (après un un-gzip), mais je ne suis pas un habitué de cet outil.

Voilà ce que j'ai ajouté :

Ma nouvelle directive RewriteMap supporte mysql comme étant un type de map, le fichier spécifié après les ':' est un fichier de configuration qui ressemble à ça (dans le format txt de RewriteMap) :

server mysqlserver.mydomain.org
port   3306
user   mylogin
passwd mypassword
base   mydatabasename
select select an_entry from mytable where myarg='$1' and mysecondarg like '$1%'
Le port est optionnel (la valeur par défaut est 3306) et il peut y avoir plusieurs $1 dans select. Les $1 seront remplacés par la valeur clé (key value) mais il serait facile de remplacer le code '$1' par une autre si vous préférez. Si plus d'une valeur doit être retournée par MySql, seule la première sera prise en compte par RewriteMap. C'est assez flexible parce que vous pouvez utiliser plusieurs tables et n'importe quoi après le "where" dans la requête, en gardant à l'esprit que $1 sera l'argument du RewriteRule dans httpd.conf.

Par exemple :
RewriteMap mysqltest mysql:/path/to/myfile
RewriteRule ^/something$ ${mysqltest:azerty}
Deviendra la requête suivante : select an_entry from mytable where myarg='azerty' and mysecondarg like 'azerty%'

J'espère que j'ai fait un travail propre (j'ai utilisé la même structure que pour le type txt, y compris "pool" et cache). J'ai fait aussi peu de modifications que possible en dehors des define NO_MYSQL_REWRITEMAP.

Je commence seulement le test "réel" et je vous contacterai sir je trouve quoi que ce soit mais le code semble bien fonctionner.

J'ai fait une autre modification : j'avais besoin de récupérer le nom du sous-domaine (comme SERVER_NAME mais sans mondomaine.com à la fin), je l'ai ajouté et appelé SUBDOMAIN_NAME. Il n'y a pas de rapport réel entre les deux modifications mais comme il s'agissait d'un petit changement dans le même fichier, j'ai mis le tout dans le même patch.

J'ai mis des commentaires dans le code, j'espè qu'ils seront utiles.

Je pense que je mettrai ce code sur une page web dans quelques jours. Je peux vous donner une URL plus tard si vous le souhaitez.

J'espère que je n'ai rien oublié.

Bonne journée.

Regis.

Version anglaise :

Hello,

I needed for my work to have mod_rewrite to look in mysql database so I made a patch (the very first one I send, so tell me if I made a mistake). To apply this patch, "patch -p0 < mod_rewrite-mysql.patch" in the src/modules/standard/ directory seems to work (after un-gzip), but I'm not so familiar with that.

Here is what I added :

My new RewriteMap directive now support mysql as a type of map, the file specified after the ':' is a config file that may be like that (in RewriteMap txt format) :

server mysqlserver.mydomain.org
port   3306
user   mylogin
passwd mypassword
base   mydatabasename
select select an_entry from mytable where myarg='$1' and mysecondarg like '$1%'
Note that port is optionnal (defaults to 3306) and select may have any number of $1. The $1 will be replaced by the key value (and it should be easy to change to something else if you prefer). If more than one entry is to be returned by mysql, only the first one will be return by RewriteMap. This is quite flexible because you can use several tables and anything after "where", keeping in mind that $1 will be the arg in httpd.conf RewriteRule.

For example :
RewriteMap mysqltest mysql:/path/to/myfile
RewriteRule ^/something$ ${mysqltest:azerty}
Will do this request : select an_entry from mytable where myarg='azerty' and mysecondarg like 'azerty%'

I hope I've done a clean work (I used the same structure that txt type, including pool and cache). I make as little changes as I could outside a NO_MYSQL_REWRITEMAP define.

I am just starting to test it for real and I'll contact you if I find anything but the code seems to work well.

I made one other change : I needed the subdomain name (like SERVER_NAME but without the ending mydomain.com), I added it, called SUBDOMAIN_NAME, there is no relation beetween the to patches but as it is a simple change with a few lines in the same file, I let it in this patch.

I let some comments in the code, hope it will help.

I think I will put this code in a web page in a few days. I can give you an URL later if you wish.

Hope I forgot nothing.

Have a good day.

Regis.

Valid HTML 4.01!